2011-06-29 29 views
2

尋找說明如何在運行時創建的示例代碼 TField與數據集關聯的組件。創建與TDataSet關聯的持久字段組件的代碼

在IDE中,如果您放下數據集組件,右鍵單擊將出現在設計時提供此功能的字段編輯器。一直無法找到在運行時顯示如何執行的代碼。

TIA

+1

你想完成什麼?如果要避免在循環中使用FieldByName,則可以將TField變量添加到方法中,使用FieldByName將其分配一次,然後在循環中使用變量... –

+0

您可能需要運行時的FIELDS,而不是PERSISTENT FIELDS。 –

+1

@Marjan例如,這允許在運行時動態地創建計算/查找字段,或者創建未綁定到真實數據庫(連接)但是存在簡單內存數據的數據集 – mjn

回答

1

每個字段類型具有您可將DataSet傳遞到創建該類型的字段,並將其添加到字段創建功能。從DB.TStringField.Create的幫助。

var 
    T: TStringField; 
begin 
    SQLDataSet1.Close; 
    T := TStringField.Create(SQLDataSet1); 
    T.FieldName := 'LastName'; 
    T.Name := SQLDataSet1.Name + T.FieldName; 
    T.Index := SQLDataSet1.FieldCount; 
    T.DataSet := SQLDataSet1; 
    SQLDataSet1.FieldDefs.UpDate; 
    SQLDataSet1.Open; 
end; 
+0

這確實沒有成就。打開數據集將爲零代碼執行相同的操作,除非數據集僅在內存中,並且沒有被保存到磁盤(例如,不能從「LoadFromFile」中填充的「TClientDataSet」或從現有數據庫提供者)。唯一的區別是您將有一個名爲'DataSetNameFieldName'的字段,您現在可以通過FieldByName訪問該字段。請注意我沒有倒下你的答案。只是提到大部分這都是零功能代碼。 –

+0

實際上,這似乎是正確的答案:此代碼創建綁定到數據集的tcomponent後代。請不要擔心我想完成什麼或者我想要獲得什麼 - 最好只是閱讀問題並在可能的情況下回答。放心,我知道我想完成什麼。 – Vector

+0

@Mikey:太好了。關鍵是**我們**需要知道你想要完成什麼才能回答你的問題 - 「只是閱讀問題並回答它」是不可能的,而對試圖幫助的人不禮貌將不會得到你遠遠的(就像將來的建議一樣)。我可能簡單地將你的問題視爲不清楚,或者投票決定將其視爲「不是真正的問題」。如果你的意圖不明確,回答這個問題就更加困難。 –

1

在運行時創建的「持久字段」沒有意義。在IDE中創建持久字段允許將它們寫入到表單/ datamodule的.dfm中,然後在從可執行文件加載.dfm時自動創建,並且可以在使用該數據模塊的代碼中按名稱訪問。

如果你正在尋找沒有在運行時使用FieldByName,你可以做這樣的事情:

TMyDataModule=class(TDataModule) 
    // Usual IDE created stuff, etc. 
public 
    NameFld: TStringField; 
    LimitFld: TFloatField; 
end; 

procedure TMyDataModule.DataModuleCreate(Sender: TObject);  
begin 
    NameFld := MyDataSet.FieldByName('CompanyName') as TStringField; 
    NameFld.Required := True; 
    LimitFld := MyDataSet.FieldByName('CreditLimit') as TFloatField; 
    LimitFld.Currency := True; 
    // Set other properties as needed. 
end; 

您現在可以在運行時的持久字段等同。在使用您的數據模塊的其他代碼中,它們可以照常使用。

procedure TMyDataModule.DoSomethingWithData(CompanyName: string; CreditLimit: Currency); 
begin 
    MyDataSet.Edit; 
    NameFld.AsString := CompanyName; 
    LimitFld.AsCurrency := CreditLimit; 
    MyDataSet.Post; 
end; 

編輯:只是想兩個例外我的發言「沒有任何意義」 - 那些將被計算或查找字段。對於查找字段,最簡單的方法是通過JOIN將它們添加到SQL中,然後讓服務器執行此操作;對於計算字段,您可以使用DataSet.FieldDefs.Add並設置適當的屬性來命名字段,將新創建的字段的FieldType設置爲ftCalculated,並指定OnCalcFields事件處理程序來處理計算。

+0

我回滾了你的編輯,因爲它改變了整個問題(因此也改變了答案)。將來,問你真正想要的答案 - 如果你不能清楚地說明問題,就很難提供準確的答案。 「持久」就是你要求的,而「持久」就是我的回答。如果它不是你想要的,請刪除它並提出一個新問題,而不是完全改變主題(或含義)。 –

+0

此外,它沒有任何意義,因爲如果您可以在運行時創建它並將其寫入文件,則可以在運行時創建它並忘記該文件;下一次運行可以在運行時再次創建它們。 ReadComponent/WriteComponent在你的問題的上下文中沒有意義;這不是問的問題。 –

+0

@Ken - 在所有應有的尊重下,問題的關鍵是如何在運行時製作TFieldComponents,以複製字段編輯器在設計時所做的工作。 '持久性'並不重要,我使用這個詞,因爲這是在設計時創建它們時,Delphi文檔如何引用它們。 – Vector