1

TClientDatasetから継承するコンポーネントを作成しようとしています。設計時にコンポーネントを作成する際に、フレームワーク内で使用される一般的なフィールドのリストをインスタンス化したいと思います。以下のコードはエラーなしで実行され、フィールドは実行時に表示されますが、設計時には表示されません。誰か助けてもらえますか?些細なことだと思います!

{ InheritedClientDataset }

constructor InheritedClientDataset.Create(AOwner: TComponent);
var
  Field : TField;
begin
  inherited;

  Field := TField.Create(self);
  Field.Name := 'ATestField';
  Field.FieldName := 'Test';
  Field.SetFieldType(ftInteger);
  //Field.DataType := ftInteger;
  Field.Size := 0;
  Field.FieldKind := fkData;

  self.Fields.Add(Field);
end;
4

3 に答える 3

4

フィールドタイプを使用してフィールドを作成してみてください。たとえば、TIntegerFieldです。

  MyField := TIntegerField.Create(Self);
  MyField.FieldName := 'MyFieldName';
  MyField.DataSet := Self;
  MyField.Name := Self.Name + '_' + MyField.FieldName;

それはうまくいくはずです。

コントロールでは使用できますが、フィールドエディタでは使用できません。

于 2009-11-17T22:15:40.487 に答える
1

完全 にテストされていませんが、代わりにFieldDefsに追加する必要があります。

with FieldDefs.AddFieldDef do
begin
  DataType := ftInteger;
  Name := 'Field1';
end;

with FieldDefs.AddFieldDef do
begin
  DataType := ftString;
  Size := 25;
  Name := 'Field2';
end;

FieldDefsを追加した後、CreateDataSetへの呼び出しを追加する必要がある場合もあります。

// After above code...
inherited CreateDataSet;
于 2009-11-17T21:53:15.277 に答える
1

このような場合、VCLコンポーネントの設計時の設計意図に反する可能性があると感じています。フィールドは通常、テーブルオブジェクトをデータモジュールに配置し、データセットプロパティを特定のSQLまたは他のテーブルに設定し、フィールドの固定セットを持つコンポーネントではなく、そのテーブルからフィールドを選択する人によって定義されます。修正があったとしても、現在のアーキテクチャがサポートするのに問題があることはありますか?そのアプローチに問題はありませんか?

別のアプローチについて考えたことはありますか?(データセットまたはデータソースに接続できるようにするパブリックプロパティを使用してコンポーネントを記述し、すべてのフレームワークロジックをそのコンポーネントに配置します)。データセットクラスはそのままにしておきます。

あなたは本当にOOP用語で「ISA」関係を行う必要がありますか、それとも「データセットへのリンクがあります」と考えた場合、コードは実際にクリーンになりますか?

于 2009-11-18T14:08:18.973 に答える