德尔福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;

10-05 22:25