Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TField.Assign (TField) -> Fehler (https://www.delphipraxis.net/59110-tfield-assign-tfield-fehler.html)

Nuclear-Ping 17. Dez 2005 14:53

Datenbank: Advantage Local Server • Version: 7 • Zugriff über: ADO

TField.Assign (TField) -> Fehler
 
Hallo, liebe Community,

ich hoffe, ich drücke mich mit meinem Anliegen verständlich aus.

Also ich habe ein dynamisches Array vom Typ TField, welches ich mit Ergebnissen aus einer Query befüllen will, um diese später zu verarbeiten.

Das ist die SQL-Abfrage:
Zitat:

SELECT * FROM Clients, NatalHoroscopes WHERE NatalHoroscopes.ID=Clients.NatalHoroscopeID;
Nach der Abfrage gehe ich jeden Datensatz durch und will diesen als Ergebnis zu einem TVirtualStringTree hinzufügen. Das mache ich so:
Delphi-Quellcode:
Nach der Abfrage:

      if (RecordCount > 0) then
        begin
          First;

          while not EOF do
            begin
              AddListNode (Fields);
              Next;
            end;

        end;
Die Funktion AddListNode sieht wie folgt aus:
Delphi-Quellcode:
...
type
  PClientListData = ^TClientListData;
  TClientListData = Array of TField;

...

procedure TClientListForm.AddListNode (Fields: TFields);
var
  a: Integer;
  n: PVirtualNode;
  d: PClientListData;
begin
  n := ClientList.AddChild (nil);
  d := ClientList.GetNodeData (n);

  SetLength (d^, Fields.Count - 1);
  for a := 0 to Fields.Count - 1 do
    begin
      d^[a] := TField.Create (Self);
      d^[a].Assign (Fields[a]);
    end;
end;
Allerdings erhalte ich NACH der Zeile "d^[a].Assign (Fields[a]);" eine Exception:
Zitat:

Feld '' kann nicht als Typ Variant angesprochen werden
Fields enthält aber Werte, das habe ich schon z.B. über "ShowMessage (Fields[a].DisplayName)" geprüft.

Weiß jemand warum? Komme nicht dahinter.

marabu 17. Dez 2005 15:13

Re: TField.Assign (TField) -> Fehler
 
Hallo Mario,

Zitat:

Zitat von Borland
Von TField dürfen keine Instanzen verzeugt werden.

du musst die richtigen Felder erzeugen - TIntegerField, TStringField, ... - dann klappt das auch.

Grüße vom marabu

Nuclear-Ping 18. Dez 2005 01:01

Re: TField.Assign (TField) -> Fehler
 
Hm, in der Datenbank sind aber wenigstens 21 Spalten, die durch die Query zurückgeliefert werden. Manche davon sind Strings, manche Integer, manche Float und auch ein BLOB. Wie krieg ich das denn unter einen Hut, wenn ich für jeden Datentyp eine eigene "Feldklasse" erzeugen soll?

marabu 18. Dez 2005 14:03

Re: TField.Assign (TField) -> Fehler
 
Mario, ich bin mir sicher, dass du mit einem Array of Variant besser beraten bist - du willst doch die Werte zwischenspeichern und nichts anderes - oder? TField und seine Nachkommen sind eigentlich für etwas ganz anderes gedacht...

Delphi-Quellcode:
type
  TVariantDynArray = array of Variant;

function GetFieldValues(ds: TDataSet): TVariantDynArray;
var
  i: integer;
begin
  SetLength(Result, ds.Fields.Count);
  for i := Low(Result) to High(Result) do
    Result[i] := ds.Fields[i].Value;
end;
Grüße vom marabu

Nuclear-Ping 19. Dez 2005 10:49

Re: TField.Assign (TField) -> Fehler
 
Hallo, marabu,

vielen Dank für die konstruktiven Hilfestellungen. Mit dem Variant-Array funktioniert das ganz gut:
Delphi-Quellcode:
function TClientListForm.GetFieldValues (ds: TDataSet): TVariantDynArray;
var
  i: integer;
begin
  SetLength (Result, ds.Fields.Count);
  for i := Low (Result) to High (Result) do
    Result[i] := ds.Fields[i].Value;
end;

procedure TClientListForm.AddListNode (Fields: TFields);
var
  a, b: Integer;
  n: PVirtualNode;
  d: PVariantDynArray;
begin
  n := ClientList.AddChild (nil);
  d := ClientList.GetNodeData (n);

  d^ := GetFieldValues (Fields.DataSet);
end;
Auch die Darstellung im VST funktioniert damit:
Delphi-Quellcode:
procedure TClientListForm.ClientListGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  d: PVariantDynArray;
begin
  d := Sender.GetNodeData (Node);
  CellText := String (d^[Column]); // Testweise
end;
Werde da noch bisschen rumbasteln und erweitern. Vielen Dank nochmals! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz