尋找說明如何在運行時創建的示例代碼 TField與數據集關聯的組件。創建與TDataSet關聯的持久字段組件的代碼
在IDE中,如果您放下數據集組件,右鍵單擊將出現在設計時提供此功能的字段編輯器。一直無法找到在運行時顯示如何執行的代碼。
TIA
尋找說明如何在運行時創建的示例代碼 TField與數據集關聯的組件。創建與TDataSet關聯的持久字段組件的代碼
在IDE中,如果您放下數據集組件,右鍵單擊將出現在設計時提供此功能的字段編輯器。一直無法找到在運行時顯示如何執行的代碼。
TIA
每個字段類型具有您可將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;
這確實沒有成就。打開數據集將爲零代碼執行相同的操作,除非數據集僅在內存中,並且沒有被保存到磁盤(例如,不能從「LoadFromFile」中填充的「TClientDataSet」或從現有數據庫提供者)。唯一的區別是您將有一個名爲'DataSetNameFieldName'的字段,您現在可以通過FieldByName訪問該字段。請注意我沒有倒下你的答案。只是提到大部分這都是零功能代碼。 –
實際上,這似乎是正確的答案:此代碼創建綁定到數據集的tcomponent後代。請不要擔心我想完成什麼或者我想要獲得什麼 - 最好只是閱讀問題並在可能的情況下回答。放心,我知道我想完成什麼。 – Vector
@Mikey:太好了。關鍵是**我們**需要知道你想要完成什麼才能回答你的問題 - 「只是閱讀問題並回答它」是不可能的,而對試圖幫助的人不禮貌將不會得到你遠遠的(就像將來的建議一樣)。我可能簡單地將你的問題視爲不清楚,或者投票決定將其視爲「不是真正的問題」。如果你的意圖不明確,回答這個問題就更加困難。 –
在運行時創建的「持久字段」沒有意義。在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
事件處理程序來處理計算。
我回滾了你的編輯,因爲它改變了整個問題(因此也改變了答案)。將來,問你真正想要的答案 - 如果你不能清楚地說明問題,就很難提供準確的答案。 「持久」就是你要求的,而「持久」就是我的回答。如果它不是你想要的,請刪除它並提出一個新問題,而不是完全改變主題(或含義)。 –
此外,它沒有任何意義,因爲如果您可以在運行時創建它並將其寫入文件,則可以在運行時創建它並忘記該文件;下一次運行可以在運行時再次創建它們。 ReadComponent/WriteComponent在你的問題的上下文中沒有意義;這不是問的問題。 –
@Ken - 在所有應有的尊重下,問題的關鍵是如何在運行時製作TFieldComponents,以複製字段編輯器在設計時所做的工作。 '持久性'並不重要,我使用這個詞,因爲這是在設計時創建它們時,Delphi文檔如何引用它們。 – Vector
你想完成什麼?如果要避免在循環中使用FieldByName,則可以將TField變量添加到方法中,使用FieldByName將其分配一次,然後在循環中使用變量... –
您可能需要運行時的FIELDS,而不是PERSISTENT FIELDS。 –
@Marjan例如,這允許在運行時動態地創建計算/查找字段,或者創建未綁定到真實數據庫(連接)但是存在簡單內存數據的數據集 – mjn