德尔福6.
我实现了一个以所有者表单为中心的MessageDlg
正如@David Heffernan在2011年1月6日的建议.
我实现了一个以所有者表单为中心的MessageDlg
正如@David Heffernan在2011年1月6日的建议.
2011年的原始问题在这里:
How to make MessageDlg centered on owner form.
居中对话框有效一次.
在第一次抛出异常之后.
– EAccessViolation
– 地址00000000的访问冲突
– 读取地址00000000
我可能做错了什么?
function TEthernetNodes_form.CenteredMessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer; // Open a message Dialog in the center of the owner form var Dialog: TForm; begin Result := mrNo; // Suppress linker warning try Dialog := CreateMessageDialog(Msg,DlgType,Buttons); try Self.InsertComponent(Dialog); Dialog.Position := poOwnerFormCenter; Result := Dialog.ShowModal finally Dialog.Free end; except on E: Exception do begin AddToactivitylog('Exception in CenteredMsgDlg: [' + string(E.ClassName) + ']' + E.Message,True,True); //Tried "ShowMEssage" instead of AddToactivitylog here. Does not display. end; end; end; procedure TEthernetNodes_form.Button1Click(Sender: TObject); begin CenteredMessageDlg('Test CenteredMessageDlg.',mtConfirmation,[mbOK],0); end;
我的活动日志中显示了异常,如下所示:
Exception in CenteredMsgDlg: [EAccessViolation] Access violation at address 00000000. Read of address 00000000
解决方法
CreateMessageDialog使用Application作为其所有者创建表单 – 它将添加到应用程序组件列表中.使用Self.InsertComponent(Dialog);您将它添加到您的表单组件列表,但它不会从应用程序中删除.
var Dialog: TForm; begin Result := mrNo; // Suppress linker warning try Dialog := CreateMessageDialog(Msg,Buttons); try Application.RemoveComponent(Dialog); // remove Dialog from Application components Self.InsertComponent(Dialog); Dialog.Position := poOwnerFormCenter; Result := Dialog.ShowModal; finally Dialog.Free end;