德尔福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作为其所有者创建表单-将其添加到Application组件列表中。使用Self.InsertComponent(Dialog);
,您可以将其添加到表单组件列表中,但不会从“应用程序”列表中删除。
var
Dialog: TForm;
begin
Result := mrNo; // Suppress linker warning
try
Dialog := CreateMessageDialog(Msg, DlgType, Buttons);
try
Application.RemoveComponent(Dialog); // remove Dialog from Application components
Self.InsertComponent(Dialog);
Dialog.Position := poOwnerFormCenter;
Result := Dialog.ShowModal;
finally
Dialog.Free
end;