使用Delphi XE2,Win64.
所以我有一个包含多种表单的大型应用程序,如果我从主窗体打开帮助文件并打开一个模态窗口然后点击F1以触发模态窗口上的上下文相关帮助,帮助文件窗口会显示正确的信息但是在关闭模态窗口之前,无法关闭帮助文件.如果我回到应用程序直到模态窗口关闭,我甚至无法让帮助文件再次获得焦点.
调用这个确切的从旧版本我们的应用程序(用Delphi 6个内置)的同一帮助文件坐在同一个文件夹中的新版本(与德尔福XE2建)的帮助文件时会显示F1键从模态窗口击中,是响应,可以像我期望的那样关闭.
帮助文件是.chm类型文件.
总结一下.
启动应用程序通过F1打开帮助文件跳转到应用程序并在应用程序中打开模态窗口通过点击F1帮助文件窗口从模态窗口启动帮助无法关闭,直到我跳回我的应用程序并关闭模态窗口.
有没有人知道为什么会这样?
我搜索过互联网,但没有发现任何类似的问题.
我们很难过.
干杯TJ
- - 编辑 - -
下面是一些示例两个表单应用程序的代码,它也表现出这种行为.
program Project1;
uses
Vcl.Forms,
HTMLHelpViewer,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.HelpFile := 'C:\helpfile.chm';
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
这是Form1代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations …
Run Code Online (Sandbox Code Playgroud) 我有一个 UITextField,在我的故事板中选中了“安全文本输入”。
当我将 UITextField.text 属性的文本分配给变量时,我得到的值是:
类名 = _NSClStr
而不是文本的实际值:
A B C D
如果我取消选中情节提要中的“安全文本输入”并对变量进行相同的分配,我会得到实际的文本。
分配值的代码非常简单:
passFieldText = self.passField.text!
Run Code Online (Sandbox Code Playgroud)
启用安全条目时的调试器输出:
(lldb) print passFieldText
(String) $R0 = class name = _NSClStr
Run Code Online (Sandbox Code Playgroud)
禁用安全输入时的调试器输出:
(lldb) print passFieldText
(String) $R0 = "ABCD"
Run Code Online (Sandbox Code Playgroud)
我什至尝试使用局部变量而不是类变量:
let passFieldText = self.passField.text ?? ""
Run Code Online (Sandbox Code Playgroud)
结果一样!
(lldb) print passFieldText
(String) $R0 = class name = _NSClStr
Run Code Online (Sandbox Code Playgroud)
passFieldText 被传递到另一个函数以验证密码,并且在该另一个函数中它还显示类名 = _NSClStr的值
我缺少什么?
干杯!
在Win7 64位上使用Delphi XE2更新3或更新4.
调用enumwindows不像以前在Delphi 6中工作那样.
在Delphi 6中,enumwindows处理了窗口,直到回调函数返回False.这就是文档说它应该做的事情:
"要继续枚举,回调函数必须返回TRUE;要停止枚举,它必须返回FALSE."
按如下方式调用enumwindows:
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@FindMyWindow,0);
if GLBWindowHandle <> 0 then begin
ShowMessage('found');
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是回调函数:
function FindMyWindow(hWnd: HWND; lParam: LPARAM): boolean; stdcall;
var TheText : array[0..150] of char;
str : string;
begin
Result := True;
GLBWindowHandle := 0;
if (GetWindowText(hWnd, TheText, 150) <> 0) then
begin
str := TheText;
if str = 'Form1' then
begin
GLBWindowHandle := hWnd;
Result := False;
end
else
result := True;
end;
end;
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,回调函数在按钮单击事件之前的代码中定义,因此编译器可以找到它而无需在接口部分中定义.
如果使用Delphi 6运行,则一旦返回False结果且GLBWindowHandle不为零,则窗口的枚举将停止 …
双击表单上的TStaticText将该TStaticText的标题复制到剪贴板.不需要双击事件.
重现步骤:
我已经向Embarcadero提交了一份错误报告.
我尝试将双击事件分配给TStaticTexts.它仍然将标题复制到剪贴板,即使它执行双击事件.
procedure TForm1.StaticText1DblClick(Sender: TObject);
begin
Edit1.Text := 'Hello';
end;
procedure TForm1.StaticText2DblClick(Sender: TObject);
begin
Edit1.Text := 'World';
end;
Run Code Online (Sandbox Code Playgroud)
TLabel或我尝试过的任何其他VCL控件都不会发生这种情况.
我们在表格上有很多TStaticTexts用于视觉设计目的,不能选择改用TLabels.
有人对如何防止这种情况有任何想法吗?
好的人,
我到处搜索过,似乎无法找到解决问题的方法.
我试图使用一个相当大的图像作为按钮背景来获得UIButton的自定义外观并减少应用程序的整体大小,因为它似乎是正确的事情.
但是,当我尝试在按钮上设置图像时,按钮看起来很奇怪,并且角落与常规UIButton的标准角半径不匹配.
我尝试过创建几种不同尺寸的图像,但我做的一切似乎都没有用.
我知道帽子应该是均匀的,我加上1像素中间伸展.
我的UIButton高44.如果我创建的图像高44像素,宽21像素,并且与默认按钮(它喜欢阿司匹林caplet)具有相同的圆角半径,并设置我的背景图像:
UIImage *btnImage = [UIImage imageNamed:@"buttontest1.png"];
UIImage *newImg = [btnImage stretchableImageWithLeftCapWidth:10 topCapHeight:0];
Run Code Online (Sandbox Code Playgroud)
角落只是不匹配,看起来奇怪地拉伸和按钮增长高度!
我知道stretchableImagewithLeftCapWidth已被弃用,但resizableCapWithInsets的使用对我来说意义不大,当我尝试这样做时,按钮图像似乎一遍又一遍地重复.
谁能弄清楚我做错了什么?有没有简单解释这个废话的地方?我似乎无法得到它.
谢谢!-TJ
编辑 - 使用resizableImageCapWithInserts显示结果后添加图像.它们不可能是典型的,因为我看到所有可能有效的例子,但这些例子对我来说都不适用.我刚想出如何在这里添加图像,所以这可能会有所帮助.
这是PNP文件,宽21px,高39px
这是使用以下代码设置背景图像的结果:
[self.button1 setBackgroundImage:[[UIImage imageNamed:@"buttontest4.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)
据我了解,这应该按原样复制我的21像素宽图像的左10像素和右10像素,并将中间1像素拉伸,它似乎做了但它也使我的按钮垂直变大我是得到这个奇怪的重复.它应该与旁边的BTN大小相同.
这是我的Xcode布局:
无论我使用什么图像,我都会看到类似的结果.
我显然没有在这里找点东西.
到目前为止,我很欣赏答案.它变得稍微有点雾.
TJ
EDIT2:使用cap insets方法显示样本,图像为21px×44px.
在故事板中设计时,所有4个按钮均为44px高.
如您所见,橙色按钮都比白色按钮大,用于比例缩放.
顶部按钮是button1,底部是button2.
通过使用UIImageResizingModeStretch的可选resizingMode参数,我找到了一种更接近它的方法.
但是,请注意按钮比它们应该的大.
以下是设置按钮图像的代码.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.button1 setBackgroundImage:[[UIImage imageNamed:@"buttontest1a.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal];
[self.button2 setBackgroundImage:[[UIImage imageNamed:@"buttontest1a.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, …
Run Code Online (Sandbox Code Playgroud) 在Win 7 64位上使用Delphi XE2创建一个32位应用程序...
在Delphi 6中,我们使用消息中的制表符来创建漂亮的多行双列对话框.
str := 'Left item:' + #9#9 + 'Right Item' + #13#10 +
'Next left item: + #9 + 'Next Right Item' + ...
if MessageDlg(str, mtConfirmation,[mbYes,mbNo],0) = mrYES then...
Run Code Online (Sandbox Code Playgroud)
这创建了一个很好的排列数据列表供用户查看,而不需要自定义表单来询问这个特定问题.右列很好地对齐,可以很容易地清楚地看到数据.
在Delphi XE2中,字符串中嵌入的制表符(#9)完全被忽略,根本没有空格.使用#32会创建一个空格,但不像选项卡字符(#9)那样很好地排列.我遇到了一些Unicode问题吗?
除了使用自定义表单之外,有什么建议可以恢复此格式吗?
干杯!
编辑:
当然,在我发布一个问题后,我想出了几个不同的解决方法.
首先,使用Application.MessageBox()确实维护制表符字符间距.
其次,奇怪的是,下面的代码可以使用制表符来保持正确的空格.
procedure TForm1.Button1Click(Sender: TObject);
var AMsgDialog : TForm;
var str : string;
begin
str := 'Left item:' + #9#9 + 'Right Item' + #13#10 +
'Next left item:' + #9#9 + 'Next Right Item';
AMsgDialog := CreateMessageDialog(str, …
Run Code Online (Sandbox Code Playgroud) 使用Delphi 10.2 Tokyo.
我使用DrawCell方法使一行中的所有列与所选单元格的颜色相同.这允许我让用户点击不同的单元格,但仍然显示"选定"行.
这使用OnSelectCell方法使原始行和新选择的行无效.多年来一直使用这种方法.
如果我有一个具有水平滚动条的网格,当向右滚动并且用户在单元格中单击时,网格无法正确绘制.
下面是一个使用带有OnDrawCell事件和OnSelectCell事件的TDrawGrid的简单示例:
表格(DFM)代码:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 299
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DrawGrid1: TDrawGrid
Left = 0
Top = 0
Width = 635
Height = 299
Align = alClient
Color = clWhite
ColCount = 15
DefaultColWidth = 65 …
Run Code Online (Sandbox Code Playgroud) 问候所以大脑信任.
如果没有为Indy 10 TIdSSLIOHanderSocketOpenSSL明确设置协议,那么使用的默认协议是什么?
我今天遇到了一些没有明确设置协议的代码.
HTTPReq := TIdHTTP.Create(nil);
IdSSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
if Assigned(HTTPReq) then begin
HTTPReq.ReadTimeout := 180000;//set read timeout to 3 minutes
HTTPReq.Request.ContentType := 'text/xml;charset=UTF-8';
HTTPReq.Request.Accept := 'text/xml';
HTTPReq.Request.AcceptEncoding := 'gzip,deflate';
HTTPReq.HTTPOptions := [];
HTTPReq.IOHandler := IdSSLIOHandler;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,所使用的协议没有明确的设置!如果没有设置,默认使用什么?我担心的是这是使用TLS 1.0或者很快被弃用的东西.
使用Delphi 10.2 Tokyo Update 1和Indy 10.6.2.5366以及最新的1.0.2n Open SLL DLL
干杯!
TJ