2017-05-15 65 views
0

我創建了一個自定義TClientDataset,然後將其註冊爲設計時組件。註冊自定義TClientDataSet但我看不到在構造函數中創建的字段

TMyDataset = class(TClientDataset) 
public 
constructor Create(AOwner : TComponent); override; 
end; 
在Create方法

,我建立這個數據集的字段

implementation 

constructor TMyDataset.Create(aOwner : TComponent); 
var 
    lField : TStringField; 
begin 
    inherited Create(aOwner); 
    lField := TStringField.Create(Self); 
    lField.FieldName := 'NAME'; 
    lField.Dataset := Self; 
    Fields.Add(lField);  
end; 

當註冊組件作爲這樣

procedure Register; 
begin 
RegisterComponents('Queries', [TMyDataset]); 
end; 

和滴的TMyDataset到窗體上,我做在數據集的字段集合中沒有看到NAME字段。

我的目標是定義和註冊這些預定義的查詢,以便我可以在設計時使用它們。

我想阻止任何使用此組件的人重新定義此數據集的字段,但仍然能夠在可視化編輯器中查看它們以綁定cxGrid或其他類型(自動創建列等)。

此外,此數據集只是另一個數據集的佔位符。它僅用於將Fields集合呈現給其他可以綁定到它們的可視化編輯器。

我的問題是:

爲什麼我不能看到我在構造函數中的可視化編輯器創建的領域,我怎樣才能使它可見?

如何覆蓋組件的行爲,永不將用戶對其TField的修改保存到DFM中?

謝謝

回答

1

以下爲我工作得很好,包括NAME域顯示在TMyDataSet字段編輯器了:

uses 
    SysUtils, Classes, DB, DBClient; 

type 
    TMyDataSet = class(TClientDataSet) 
    private 
    FMyStringField : TStringField; 
    function GetMyStringField: TStringField; 
    protected 
    public 
    constructor Create(AOwner : TComponent); override; 
    property MyStringField : TStringField read GetMyStringField; 
    published 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Data Access', [TMyDataSet]); 
end; 

{ TMyDataSet } 

constructor TMyDataSet.Create(AOwner: TComponent); 
begin 
    inherited; 
    FMyStringField := TStringField.Create(AOwner); 
    FMyStringField.FieldName := 'NAME'; 
    FMyStringField.Size := 80; 
    FMyStringField.DataSet := Self; 
end; 

function TMyDataSet.GetMyStringField: TStringField; 
begin 
    Result := FMyStringField; 
end; 

你應該能夠很容易識別自己的代碼需要如何修改工作與此類似。你忽略了一個StringField的Size

[TBC]

+0

謝謝,我認爲該領域的AOwner必須是數據集的所有者,這是當我修改代碼 – Ludo

+0

什麼工作你知道我怎麼能防止DFM的修改由用戶? (防止添加/修改字段)? – Ludo

+0

「防止修改......」不是手動的,但我有一種感覺@SertacAkyuz對這個q的回答可能與此有關,而Delphi使用我的代碼抱怨重複的'NAME'字段:http: //stackoverflow.com/questions/38293072/how-to-correctly-stream-a-tcollection-property-of-a-subcomponent-eg-the-colum – MartynA