2012-10-27 131 views
2

我想以最小的努力將多個對象作爲一個參數傳遞。將多個對象作爲一個參數傳遞

我有一些類型

TOpenMode = [omNew, omEdit, omBrowse] 

和步驟

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
        Datasets: TUniDataSet; TableOpenMode: TOpenMode); 

我想通過多個數據集。我可以做到沒有數組或創建新的對象?我怎樣才能讓他們成對通過[UniTable1, TOpenMode], [UniTable2, TOpenMode]

回答

5

多個對象在一個單一的複合型相結合的最簡單方法是一個記錄:

type 
    TDataSetAndOpenMode = record 
    DataSet: TUniDataSet; 
    OpenMode: TOpenMode; 
    end; 

爲了方便提供一個函數初始化這些記錄之一:

function DataSetAndOpenMode(DataSet: TUniDataSet; 
    OpenMode: TOpenMode): TDataSetAndOpenMode; 
begin 
    Result.DataSet := DataSet; 
    Result.OpenMode := OpenMode; 
end; 

然後你OpenForm功能可以接收這樣的記錄的開放陣列:

procedure OpenForm(Form: TForm; const Datasets: array of TDataSetAndOpenMode; 
    NewWindow: Boolean=False); 

注意我已經把NewWindow參數放在最後。由於它具有默認值,因此該默認值僅在出現在列表末尾時纔有用。

現在,調用函數,你可以這樣寫代碼:

OpenForm(Form, [DataSetAndOpenMode(DataSet1, OpenMode1), 
    DataSetAndOpenMode(DataSet2, OpenMode2)]); 
+2

爲什麼你使用一個單獨的功能,而不是記錄構造的任何原因?只是好奇。 –

+0

@Uwe我不喜歡用'TDataSetAndOpenMode.Create'語法。當你閱讀這些代碼時,你會認爲你需要在該對象上調用'Free'。對於通常是編譯器錯誤的記錄,因此您受到保護。但是,如果你恰巧是在'FreeAndNil'派,然後傳遞一個記錄'FreeAndNil'導致疼痛。例如看看'TRegEx'。您可以使用一個實例方法,可能名稱爲'Initialise'。但是這不允許問題中的函數調用語法。因此,一個幫手功能。 –

+0

當然,我接受你的偏好。您仍然可以初始化一個靜態類函數(例如TStopWatch.StartNew)。我其實更喜歡那些記錄方法來將範圍保持在一起。這往往是品味的問題。 –

3

如果你想通過多對作爲一個參數,我看不出你如何能避免宣告至少記錄來定義對和至少一個開放數組參數來傳遞這些記錄多個實例作爲一個參數。

type 
TDatasetModePair = record 
    DS: TUniDataSet; 
    Mode: TOpenMode; 
end; 

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
       Datasets: array of TDatasetModePair); 

但你可能會發現,這將是更容易聲明自己的數組類型:雖然

procedure OpenForm(Form: TForm; ANewWindow: boolean = false; 
       Datasets: TDatasetModePairArray); 

不管是:

type 
    TDatasetModePairArray: array of TDatasetModePair; 

過程聲明就變成,周圍有創建陣列沒有辦法纔可以將它傳遞給你的函數:

var 
    MyArray: TDatasetModePairArray; 
begin 
    SetLength(MyArray, 2); 
    MyArray[0].DS := SomeDataSet; 
    MyArray[0].Mode := omEdit; 
    MyArray[1].DS := SomeOtherDataSet; 
    MyArray[1].Mode := omBrowse; 
+1

其中一個主要的原因使用開放數組參數,以避免'SetLength'和調用該函數按我的例子。這就是說,在現代德爾福,你可以使用'TDatasetModePairArray.Create(DatasetModePair1,DatasetModePair2)'。 –

+1

@DavidHeffernan:是的,我在我的窮人D5中嘗試過,但消息視圖已經走了一段路了,我沒有錯誤信息就無法獲得語法:-)所以我出去了,然後去了SetLength版。 –

相關問題