2017-05-15 16 views
0

カスタムTClientDatasetを作成し、これを設計時コンポーネントとして登録しました。 Createメソッドで カスタムTClientDataSetを登録していますが、コンストラクタで作成されたフィールドが表示されません

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

は、私は、このデータセットのフィールドを作成し

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を落とし、私はこのデータセットのFieldsコレクションのNAMEフィールドは表示されません

私の目標は、これらの定義済みのクエリを定義して登録して、設計時に使用できるようにすることです。

このコンポーネントを使用している誰でもこのデータセットのフィールドを再定義することはできませんが、ビジュアルエディタでcxGridなどをバインドする(列の自動作成など)ことはできます。

また、このデータセットは、別のデータセットのプレースホルダにすぎません。これは、Fieldsコレクションをバインドできる他のビジュアルエディタに提示する役割しか果たしません。

私の質問は:

は、なぜ私はビジュアル・エディタで、コンストラクタで作成されたフィールドを見ることができないとどのように私はそれが見えるようにすることができますか?

TFieldのユーザー変更をDFMに保存しないようにコンポーネントの動作を変更するにはどうすればよいですか?

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; 

は、あなたが簡単にあなたのコードが動作するように修正する必要がどのように識別することができるはずです。

以下はTMyDataSet項目エディタに現れて NAMEフィールドを含めて、私のために正常に動作し、あなたに

答えて

1

ありがとうございました同様に。 StringFieldのSizeを省略します。

[TBC]

+0

はありがとう、私はフィールドのAOwnerは、データセットの所有者でなければならないと思い、それは私が – Ludo

+0

は私がDFMの変更を防ぐことができますどのようにあなたを知っています、私のコードを変更したときに働いたものですユーザーは? (フィールドの追加/変更を防止する)? – Ludo

+0

"変更を防止する..."私はこの事実と、デルファイが私のコードを使用して重複した 'NAME'フィールドについて苦情を言っているという事実と関連している可能性があるので、オフチェントではありませんが、感情は@ SertacAkyuzさんの答えです。http: //stackoverflow.com/questions/38293072/how-to-correctly-stream-a-tcollection-property-of-a-subcomponent-eg-the-colum – MartynA

関連する問題