Frage

Ich versuche eine Komponente zu schreiben, die von TclientDataset erbt. Zum Erstellen der Komponente in der Entwurfszeit möchte ich eine Liste gemeinsamer Felder instanziieren, die in meinem Rahmen verwendet werden. Der folgende Code wird ohne Fehler ausgeführt und das Feld wird zur Laufzeit angezeigt, nicht jedoch. Kann mir jemand helfen? Ich bin sicher, es ist etwas Triviales!

{ 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;
War es hilfreich?

Lösung

Erstellen Sie Ihr Feld mit seinem FieldType. Zum Beispiel Tintegerfield.

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

Das sollte funktionieren.

Es wird den Kontrollen, nicht jedoch dem Fields -Editor zur Verfügung stehen.

Andere Tipps

Total ungetestet, aber Sie sollten stattdessen wahrscheinlich zu FieldDefs hinzufügen:

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

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

Möglicherweise müssen Sie auch nach dem Hinzufügen der FieldDefs einen Anruf an createdataset hinzufügen:

// After above code...
inherited CreateDataSet;

Ich habe das Gefühl, dass Sie in solchen Fällen möglicherweise gegen die Entwurfsabsicht der VCL -Komponenten -Designtime gehen. Felder werden normalerweise von jemandem definiert, der ein Tabellenobjekt in ein Datenmodul platziert, dann die Datensatzeigenschaften auf eine bestimmte SQL oder eine andere Tabelle festlegen und die Felder aus dieser Tabelle ausgewählt haben, anstatt eine Komponente mit einem festen Satz von Feldern, die möglicherweise sein könnten Sind Sie sicher, dass die aktuelle Architektur für die aktuelle Architektur unterstützt werden kann, obwohl Sie eine Lösung haben, wenn Sie eine Lösung haben, dass es mit diesem Ansatz keine Probleme gibt?

Haben Sie über einen alternativen Ansatz nachgedacht? (Schreiben Sie eine Komponente mit einer öffentlichen Eigenschaft, mit der sie an einen Datensatz oder eine Datenquelle angeschlossen werden kann und Ihre gesamte Framework -Logik in diese Komponente einfügt.) Lassen Sie die Datensatzklasse in Ruhe.

Müssen Sie wirklich eine "Beziehung in OOP -Begriffen haben oder wäre Ihr Code tatsächlich sauberer, wenn Sie" einen Link zu einem Datensatz "haben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top