簡體   English   中英

在關閉另一個 MDI ChildForm 時啟用一個 MDI ChildForm 的 TButton

[英]Enable a TButton of an MDI ChildForm upon closing of another MDI ChildForm

我有 2 個 MDI ChildForms,而 Child1 有一個 TButton 來打開 Child2。 我沒有任何問題同時打開它禁用 TButton 以防止 Child2 再次使用 TButton 重新創建。

現在,當我希望 Child1 的 TButton 在關閉 Child2 時恢復為“啟用”時,挑戰就來了。

執行這些代碼時出現訪問錯誤:

procedure TfrmChild2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  child1_u.frmChild1.btnOpenChild2Form.Enabled := True;
  Action := caFree;
end;

我知道在處理 MDI 時有一種不同的方法。 當我在下面的運行時打開期間執行禁用 TButton 的代碼時,我發現了這一點:

procedure TfrmMain.btnOpenChild2(Sender: TObject);
begin
  TfrmChild2.Create(frmMain);
  btnOpenChild2.Enabled := False;
end;

但是在 Child2 表單關閉時重新啟用它是一個挑戰。

我試圖在 MainForm (Owner) 中創建一個過程來觸發 Child1 中 TButton 的啟用:

procedure TfrmMain.EnableButtonAtChild1();
begin
  child1_u.frmChild1.btnOpenChild1Form.Enabled := True;  
end;

並在 Child2 的 OnClose 期間在運行時調用:

procedure TfrmChild2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  EnableButtonAtChild1();
end;

我是 MDI 的新手,我需要了解訪問組件的工作原理,尤其是這個簡單的案例。 我會很感激這里的任何幫助。

我會采取不同的方法 - 當第一個孩子創建第二個孩子時動態分配第二個孩子的OnClose事件。 不要讓第二個孩子嘗試直接查找和訪問第一個孩子:

procedure TfrmChild1.btnOpenChild2FormClick(Sender: TObject);
var
  child: TfrmChild2;
begin
  child := TfrmChild2.Create(Application.MainForm);
  child.OnClose := Child2Closed;
  btnOpenChild2Form.Enabled := False;
end;

procedure TfrmChild1.Child2Closed(Sender: TObject; var Action: TCloseAction);
begin
  btnOpenChild2.Enabled := True;
  Action := caFree;
end;

只要確保在第一個孩子被釋放之前總是關閉第二個孩子,否則你會遇到麻煩。 如果需要,您可以這樣解決:

procedure TfrmChild1.FormDestroy(Sender: TObject);
var
  I: Integer;
  child: TForm;
  event: TCloseEvent;
begin
  for I := 0 to Application.MainForm.MDIChildCount-1 do
  begin
    child := Application.MainForm.MDIChildren[I];
    event := child.OnClose;
    if Assigned(event) and (TMethod(event).Data = Self) then
      child.OnClose := nil;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM