AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TField.Assign (TField) -> Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

TField.Assign (TField) -> Fehler

Ein Thema von Nuclear-Ping · begonnen am 17. Dez 2005 · letzter Beitrag vom 19. Dez 2005
Antwort Antwort
Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

TField.Assign (TField) -> Fehler

  Alt 17. Dez 2005, 15:53
Datenbank: Advantage Local Server • Version: 7 • Zugriff über: ADO
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TField.Assign (TField) -> Fehler

  Alt 17. Dez 2005, 16:13
Hallo Mario,

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
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

Re: TField.Assign (TField) -> Fehler

  Alt 18. Dez 2005, 02:01
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TField.Assign (TField) -> Fehler

  Alt 18. Dez 2005, 15:03
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
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: TField.Assign (TField) -> Fehler

  Alt 19. Dez 2005, 11:49
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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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