Warum erscheinen keine ClientDataset -Nachkommensfelder zur Entwurfszeit?
-
20-09-2019 - |
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;
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?