2010-03-18 102 views
1

在我的Delphi項目中,我想要一個「設置」按鈕,當點擊時,打開第二個窗體(我認爲這是正確的術語,我基本上希望打開一個新窗口)進行設置。delphi中的多種形式

當用戶完成更改此新窗體上的設置後,我希望窗體關閉按鈕單擊。

用戶輸入的設置還需要可以訪問第一個「主」表單。例如,如果我的程序由一個主表單組成,那麼計算的'A'+'B'(A和B是整型變量),其設置形式允許用戶設置A和B的值,我將如何做到這一點?

回答

4

如果你瞭解Delphi的對象模型,這並不難。表單是一個從TObject下載的對象,由DFM文件支持,以便更容易地設置佈局。其上的控件是其他對象,並且默認情況下它們可以從其他單位的其他對象公開顯示,例如其他表單。有兩種方法可以做到這一點。

簡單的方法是讓您的其他表單的代碼直接在完成第一個表單時從控件讀取值。只需使用像MyString := Form2.EditBox.Text;這樣的東西。這不是特別好的風格,但它的工作原理。

要做到這一點的正確方法是將公共屬性放在表單上,​​它將檢索控件的值,或者將讀取它們並返回某種包含所有設置的對象或記錄的函數。這需要更多的工作,但是如果你修改路上的東西,它會產生更簡潔的代碼,不太可能會造成麻煩。

編輯:針對在評論的問題:

爲了使一種形式顯示和隱藏另一個,你可以調用顯示和隱藏它。或者,如果您希望它顯示在模式對話框中,只要您創建一個設置ModalResult的按鈕,即可調用ShowModal方法,該方法負責爲您隱藏。 (有關這些方法如何工作的詳細信息,請參閱幫助文件。)

當然,表單必須先創建。要麼它可以由DPR自動創建,這對於簡單的程序來說很好,但是一旦你在應用中獲得了很多表單,或者你可以用代碼創建它,它就不那麼好了。亨克有一個如何做到這一點的例子,但我不會推薦使用關鍵字。如果您自己創建了該表單,請務必在之後將其釋放。

+0

謝謝!我會嘗試複雜,乾淨的方式,我認爲.... 如果我在程序中有兩種形式,但是Form1和Form2,我怎樣才能讓一個顯示或隱藏其他形式。我試過Form2。從Form1中,但這不起作用。 – chendriksen

+0

@ Hendriksen123:看我的編輯。 –

0

我想創建一個設置對象在Form1,並將其發送形成2:

TSettings = class 
private  
    FPropA: integer; 
    FPropB: string; 
published 
    property PropA: integer read FPropA write FPropA: 
    property PropB: string read FPropB write FPropB: 
end; 

... 
form2.EditSettings(ASettings); 
2

我通常設計的設置形式,並添加一個類的函數執行它,改變包含的設置字段中記錄像這樣:

Tf_MySettings = class(TForm) 
    // ... 
private 
    procedure SetData(const _Settings: TSettingsRec); 
    procedure GetData(out _Settings: TSettingsRec); 
public 
    class function Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; 
end; 

implementation 

function Tf_MySettings.Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; 
var 
    frm: Tf_MySettings; 
begin 
    frm := Tf_MySettings.Create(_Owner); 
    try 
    frm.SetData(_Settings); 
    // for this to work, the OK button must have ModalResult=mrOK 
    Result := frm.ShowModal = mrOK; 
    if Result then 
     frm.GetData(_Settings); 
    finally 
    frm.Free; 
    end; 
end; 

procedure Tf_MySettings.SetData(const _Settings: TMySettingsRec); 
begin 
    ed_Name.Text := _Settings.Name; 
    // ... 
end; 

procedure Tf_MySettings.GetData(out _Settings: TMySettingsRec); 
begin 
    _Settings.Name := ed_Name.Text; 
    // ... 
end; 

你這樣稱呼它:

if Tf_MySettings.Execute(self, _Settings) then begin 
    // settings have been changed 
end;