[英]Error on opening an MDI ChildForm from another MDI ChildForm's TButton via TMenuItem on MDI ParentForm
[英]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.