我正在动态创建一个覆盖CreateParams的Form,以便我可以在TaskBar上显示它。从动态创建的Form中,我调用TColorDialog但是一旦显示它,我的Form将在MainForm下面,并且ColorDialog就在它之上。
关闭ColorDialog后,动态表单将返回MainForm。
我在ColorDialog Execute方法中看到有一个Handle可以传递,但我不确定我是否在正确的轨道上?
如果我在MainForm上的对话框下单击它会闪烁,但我怎么能让动态创建的Form“拥有”这个对话与后面的MainForm?
我像这样创建表单:
procedure TMain.Button1Click(Sender: TObject);
var
SEMArcF: TWriteSEMArcFrm;
begin
SEMArcF := TWRiteSEMArcFrm.Create(nil);
SEMArcF.Show;
end;
并在OnClose事件中释放:
procedure TWriteSEMArcFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
我正在覆盖CreateParams,如下所示:
procedure TWriteSEMArcFrm.CreateParams(var Params: TCreateParams);
begin
inherited;
if (FormStyle = fsNormal) then begin
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow;
end;
end;
并显示ColorDialog我要么创建它,要么在Form上只有一个TColorDialog组件,无论哪种方式都会产生相同的结果。我希望它由动态表单拥有。
修改 我现在补充说:
Application.ModalPopupMode := pmAuto;
完整代码:
procedure TWriteSEMArcFrm.btnBackColourClick(Sender: TObject);
var
ColorDlg: TColorDialog;
begin
Application.ModalPopupMode := pmAuto;
ColorDlg := TColorDialog.Create(nil);
try
if ColorDlg.Execute then
re.Color := ColorDlg.Color;
finally
ColorDlg.Free;
end;
end;
这样可以正常但是通过设置它可以有任何异常行为吗?
谢谢
克里斯
答案 0 :(得分:8)
TColorDialog
派生自TCommonDialog
,其中有两个重载版本的Execute()
可用 - 已存在多年的旧版无参数版本,以及一个较新的重载版本,需要父版本{{1}作为输入参数。你可能会打电话给前者。该重载使用当前有效HWND
的{{1}}属性(仅当Handle
属性未设置为TForm
时),才会回退到TApplication.ModalPopupMode
如果需要pmNone
。如果你想要更多控制,你应该直接调用另一个重载,然后你可以传递动态表单的Handle
属性作为参数值。