我有一個窗體,它具有綁定到DataModule中的DataSet的數據感知控件。
這是不可能的。間接地,沒問題,但必須有一個必要的數據源。 (從你的問題的其餘部分,我們要提煉出這些數據源都在DataModule中的信息,但問題肯定會更加透明有關。)
我刪除自動創建的全局變量時, DataModule首先添加到項目中。
好,堅持那個習俗!
令我高興的是,設計器中的控件仍然可以綁定到DataModule中的DataSets,而不使用此全局變量。我假設IDE正在解析DataModule的dfm,因此設計人員仍然可以「看到」DataModule。
數據源和數據集之間同樣不正確/混亂,但你是有一定道理:對於IDE能夠找到一個DataModule中,則必須滿足以下條件:
- DataModule中必須創建/打開在IDE會話期間至少一次(在會議期間可能會關閉),請參閱(*),
- 該DataModule的單位必須存在於Form單元的用途列表中。
當我創建窗體的兩個實例,並在運行時DataModule中的兩個實例,窗體的兩個實例似乎只能綁定到所創建的第一個DataModule中。
這是因爲您依賴於自動設計時綁定,它在運行時不起作用。該綁定取決於DataModule的名稱。但這不是依靠設計時間綁定的唯一缺點,請參閱(*)。
檢查DataModule的第二個實例顯示Name屬性具有一個數字後綴,該數字後綴在設計時並不存在。
在該序列號後綴前加上下劃線。這似乎是由設計。不能有多個具有相同名稱的DataModules(也不是Forms),這與不能與兄弟或子組件具有相同名稱的組件具有可比性。這有點奇怪,因爲當沒有給所有者甚至不同的所有者時,同樣的規則仍然適用於DataModules和Forms,這與默認的TComponent行爲不同。我無法在RTL/VCL代碼中找到證據和解釋。也許它與所有DataModules和Forms保存在Screen變量中有關。我們必須接受,但這不是問題。
該窗體依賴於DataModule中的很多數據集。是否有一種更簡單的方法將第二個Form實例綁定到第二個DataModule的DataSet,而不用每個控件的手編碼SomeControl.DataSource := Module2.dsSomeData
? ...一種解決方案是將DataSet移到Form本身。
其中dsSomedata
是數據源!
是的,有一個更簡單的方法。不要將DataSets放置在窗體上,而要將DataSources放置在窗體上。通常,與數據控件的數量相比,表單通常只有單個或少數DataSources。這樣的數據控制 - 數據源綁定保持不變(因爲兩者都是從同一個DFM讀取),只有數據源的數據集的設置仍然手動設置:
TCustomerForm = class(TForm)
DataSource: TDataSource;
procedure FormCreate(Sender: TObject);
private
FData: TCustomerDataModule;
end;
procedure TCustomerForm.FormCreate(Sender: TObject);
begin
FData := TCustomerDataModule.Create(Self);
DataSource.DataSet := FData.Query;
end;
或者,當你想創建從DataModule的形式:
TCustomerForm = class(TForm)
DataSource: TDataSource;
private
FData: TCustomerDataModule;
procedure SetData(Value: TCustomerDataModule);
public
property Data: TCustomerDataModule read FData write SetData;
end;
procedure TCustomerForm.SetData(Value: TCustomerDataModule);
begin
if FData <> Value then
begin
FData := Value;
DataSource.DataSet := FData.Query;
end;
end;
(*)與許多形式和數據模塊的大項目,在IDE無法打開每一個DataModule中,和(數據源)數據集的設置可以輕鬆地迷失是很常見的。依賴於DataModule名稱的designtime綁定,可能會導致您的Forms永遠不會顯示任何數據。這是一個很難預見的錯誤,無法檢查每個表單的(DataSource。)DataSet設置。
做這一切在上述的方式,確保在運行時正確DataModule的創作,並確保IDE提供數據集的所有設計時能力和聰明,菲爾茲等..
任何不明確,在設計安裝時間必須在運行時設置。當自動創建datamodule時使用該全局變量(請參閱在項目設置中自動創建表單或查看.DPR)。如果您刪除它並自動創建它,它將不會編譯。將表單傳遞給數據模塊中的方法,或將數據模塊傳遞給表單上的方法,並將所有內容掛鉤。 –
形式和datamodule都不自動創建,所以全局變量不是問題。從下面發佈的答案Mark看來,問題出在組件流式傳輸系統上。 –
如果有問題,你應該在你的問題中解釋它。 –