2013-10-16 27 views
2

我有一個窗體,它具有綁定到數據模塊中的數據集的數據感知控件。我需要在同一個應用程序中創建表單和數據模塊的其他實例。將表單的第二個實例綁定到數據模塊的第二個實例?

我刪除了數據模塊首次添加到項目時自動創建的全局變量。令我高興的是,設計者中的控件仍然可以綁定到沒有這個全局變量的數據模塊中的數據集。我假設IDE正在解析datamodule的dfm,因此設計人員仍然可以「看見」數據模塊。 (沒有在IDE中加載數據模塊,數據源列表爲空)

當我在運行時創建兩個窗體實例和兩個datamodule實例時,窗體的兩個實例似乎只綁定到第一個數據模塊已創建。檢查數據模塊的第二個實例顯示Name屬性具有在設計時不在其中的數字後綴。

表單取決於數據模塊中的很多數據集。是否有更簡單的方法將第二個表單實例綁定到第二個數據模塊的數據集,而無需使用每個單一控件的手編SomeControl.DataSource := Module2.dsSomeData

我願意接受其他建議。一種解決方案是將數據集移到表單本身。如果設計時間數據綁定僅適用於單身人士,這似乎是一種遺憾。

+0

任何不明確,在設計安裝時間必須在運行時設置。當自動創建datamodule時使用該全局變量(請參閱在項目設置中自動創建表單或查看.DPR)。如果您刪除它並自動創建它,它將不會編譯。將表單傳遞給數據模塊中的方法,或將數據模塊傳遞給表單上的方法,並將所有內容掛鉤。 –

+2

形式和datamodule都不自動創建,所以全局變量不是問題。從下面發佈的答案Mark看來,問題出在組件流式傳輸系統上。 –

+0

如果有問題,你應該在你的問題中解釋它。 –

回答

1

在這個問題請看:
separate dataset instances using datamodules in delphi

基本上答案是創建DataModule中,那麼你的表格,然後將創建DataModule中的名稱爲空字符串。這將使初始數據綁定發生,但阻止其他表單看到該模塊。

另外,創建的下一個版本仍然具有原始名稱(不需要數字後綴)。

+0

不錯的訣竅,但它不會阻止可能丟失的設計時間設置。 – NGLN

0

我有同樣的問題。我使用了以下解決方案。

我的2個窗體實例共享相同的DataModule實例。這兩個表格不會同時顯示。我有這樣的優勢,即2個表單總是顯示相同的數據,因爲我的數據在內存緩存中,與TCLientDataSet

例如

_dmSachkonto := TCachedDataModules.Instance.Add(TdmSachkonto) as TdmSachkonto; 

TdmSachkonto是我的DataModule。

+1

如果你有兩個表單和一個DataModule,那麼你就沒有同樣的問題!這不是對這個問題的回答。 – NGLN

1

我有一個窗體,它具有綁定到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提供數據集的所有設計時能力和聰明,菲爾茲等..

+0

是的,數據源當然是控件和數據集之間的數據源。我假定有足夠的知識回答這個問題的人已經非常熟悉數據綁定的工作細節。 18年來,他們仍然沒有解決表單設計者在不同單元中的組件之間放下鏈接的問題。 –

+0

對不起,挑剔。我相信你對DataSources一切都很瞭解,但是我發現你從來沒有在問題中提到它們,特別是你建議將DataSets移動到表單中的地方,這讓我感到很奇怪。我現在明白,默認情況下您將數據源保留在數據集中。我試圖做的一點是,這不是最好的策略。 – NGLN

相關問題