2012-09-21 78 views
0

我在delphi有VCL應用程序。一種主要形式和許多兒童形式。 如何確保一次只打開一個表單。換句話說,如果一個表單被打開,它將關閉以前的表單。或者,如果用戶嘗試打開與之前相同的表單,它將不會執行任何操作。 代碼在我的主要形式開放的形式:如何在delphi中只保留單個窗體打開

procedure TFMainForm.OpenForm(const classname: string); 
var 
    c: TPersistentClass; 
    f: TForm; 
begin 
    c := GetClass(classname); 
    if c <> nil then 
    begin 
     f := TForm(TControlClass(c).Create(nil)); 
     f.Parent := Self; 
     f.Show; 
    end; 
end; 

子窗體自我釋放的接近事件。

+1

與Form.Parent相當危險的破解。也許更好地使用MDI並確保它始終最大化? http://docwiki.embarcadero.com/RADStudio/en/Building_a_VCL_Forms_MDI_Application_Without_Using_a_Wizard –

+2

@Arioch,我看不到到自己創建的,雖然形式分配父母任何危險,但你說得對,它看起來像OP試圖使一個MDI應用程序錯誤的方式。 – TLama

+0

是的,你是對的。我嘗試製作MDI應用程序。但是我想讓孩子填寫主要表格的一小部分。因此,我將子窗體設置爲無邊界,並將子窗體的父窗體設置爲主窗體。 –

回答

2

如果您「F」在你的MainForm一個變量,而不是一個局部變量,你必須將當前打開的窗體的引用。您可以使用該引用來關閉該表單或檢查其類。

有兩點需要注意:

  • 你必須,如果你關閉窗體,而無需打開另一個重置變量。
  • 我想知道你爲什麼想要這樣做。讓用戶決定是否要打開多個表單會更友好嗎?

作爲替代方案,你可以讓孩子形成模式(使用的ShowModal而不是顯示),但是當子窗體處於打開狀態,將阻止訪問的主要形式。

+0

正如我在上面的評論中提到的,我希望子表單只填充主表單的一小部分。 –

0

攔截「的新形式,越來越活躍」事件 - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen_Events

枚舉的形式,並確保所有其他形式。可見是假的 - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen.CustomForms


或者,如果用戶嘗試打開形成同樣與前,它不會做任何事情

你是什麼意思?以及如果用戶如何隱藏其他表單並且不能再看到按鈕/菜單來打開其他表單?

也許你需要的只是TForm.ShowModal?

+0

這是一個痛苦世界的開始。它能夠完成用戶所要求的功能,並且會創建一些非常酷的錯誤。特別是如果應用到現有的代碼庫,這可能是OP正在嘗試做的事情,這可能是實施一個瘋狂的壞黑客而不是修復一個錯誤。但是因爲我正在進入思維導向的領域,所以我會避免直接向OP提出建議。 –

1

也許情況不一樣,但你可以有一個訂閱列表,其中每個創建的表單都訂閱創建和取消訂閱銷燬。通過這種方式,您可以檢查您的窗口是否在列表中,如果它不存在create,如果已經存在,則將焦點移到窗體上。

我們使用這種方法來打開diferent數據相同的形式(例如發票),並跟蹤他們不開同一張發票的兩倍。

如果您正在做例如Dashboard並使用每個信息的表單,您可以使用訂閱列表跟蹤它們,而不是每個信息都有一個變量。

相關問題