Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi VirtualStringTree und Query (https://www.delphipraxis.net/29782-virtualstringtree-und-query.html)

marcus 14. Sep 2004 17:15


VirtualStringTree und Query
 
Hallo,

ich benutze die VirtualStringTree komponente als Übersichtsfenster, in dem verschiedene Datensätz einer Tabelle dargestellt werden. Wenn ich die VirtualStringTree direkt mit der Tabelle 'verknüpfe' funktioniert das ganze wunderbar (siehe code unten).

Delphi-Quellcode:
type
  PListe = ^TListe;
  TListe = packed record
    Nummer : String;
    Name  : String;
  end;


procedure TFrmMain.InitList;
begin
  with MainStringTree do
  begin
    BeginUpdate;
    Clear;
    NodeDataSize := Sizeof(TListe);
    RootNodeCount := TblMain.RecordCount;
    EndUpdate;
  end;      
end;

procedure TFrmMain.MainStringTreeInitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var Namensliste : PListe;
begin
  Namensliste := Sender.GetNodeData(Node);
  Initialize(Namensliste^);

  Namensliste.Nummer := TblMain.FieldByName('nummer').AsString;
  Namensliste.Name  := TblMain.FieldByName('name').AsString;

  if not TblMain.Eof then
    TblMain.Next;
end;
Wenn ich jetzt aber in der procedur TreeInitNode einen Query einfüge funktioniert das ganze leider nicht mehr, denn der Query wird dann in jeder zeile ausgeführt und deshalb bekomme ich immer nur den ersten Datensatz der Tabelle. Ich müsste den Query an eine andere Stelle plazieren, trotzdem wird in der procedur TreeInitNode auf ihn zugegriffen.
Hatte jemand schon mal ein ähnliches Problem?
Gruß
Marcus

Albi 14. Sep 2004 17:38

Re: VirtualStringTree und Query
 
Hallo ich hatte das Problem auch,

Schau dir mal das an. Hier wird gezeigt wie das geht.

Du must die Daten erst in abfragen und dann die Daten in das VirtualTreeView laden. Bei mir funzt das super.

marcus 14. Sep 2004 18:49

Re: VirtualStringTree und Query
 
Hallo Albi,

danke für das Beispiel. Das hilft mir schon etwas weiter. Ich würde nur gerne wissen wo in welcher Procedur ein Query.Open oder ein Query.ExecSql steht?

Marcus

Albi 14. Sep 2004 19:57

Re: VirtualStringTree und Query
 
Ich habe das so gelöst:

Code:
procedure TForm17.TreeView1Change(Sender: TObject; Node: TTreeNode); //Ich habe eine Treeview, wenn ich da was ändere, werden die Daten, entsprechend der Query geändert
var
  TreeObject : TTreeDataClass;
  Wurzel    : PVirtualNode;
  i         : Integer;
Begin
VST1.Header.Columns.Clear;

//---------------- Mandanten ---------------------------------------------------

  If Treeview1.Selected.Text = 'Mandanten' then
    Begin
    LB1.Enabled:= true;
    VST1.TreeOptions.PaintOptions:= VST1.TreeOptions.PaintOptions + [toShowTreeLines];
      With Form1.QSeaMand Do
        Begin
          close;
          SQL.Clear;
          SQL.Text:= 'Select Mand.*, DMand.DMIDRSV, '
                    +'DMand.DMIDHPF, DMand.DMRSV, DMand.DMHPF '
                    +'From "'+DBPath+DBDMandName+'" DMand '
                    +'LEFT JOIN "'+DBPath+DBMandName+'" Mand '
                    +'ON (Mand.MID = DMand.DMID) '
                    +'WHERE (DMand.DAAkz = "'+SAKz.Text+'")'; //hier die SQL-Abfrage
          Open;

        For i:= 0 To 9 Do //Hier füge ich die Spalten ein
          VST1.Header.Columns.Add;
        With VST1.Header DO
          Begin
            Columns[0].Text:= 'Vorname'; Columns[0].Width:= 100;
            Columns[1].Text:= 'Name'; Columns[1].Width:= 100;
            Columns[2].Text:= 'Firma'; Columns[2].Width:= 100;
            Columns[3].Text:= 'Strasse'; Columns[3].Width:= 100;
            Columns[4].Text:= 'Wohnhaft'; Columns[4].Width:= 100;
            Columns[5].Text:= 'PLZ'; Columns[5].Width:= 50;
            Columns[6].Text:= 'Ort'; Columns[6].Width:= 100;
            Columns[7].Text:= 'Briefanrede'; Columns[7].Width:= 100;
            Columns[8].Text:= 'Schadensnummer'; Columns[8].Width:= 100;
            Columns[9].Text:= 'VersNr'; Columns[9].Width:= 100; //Breite und Spaltennamen werden zugewiesen
          end; //With VST.Header
            VST1.BeginUpdate;
            VST1.NodeDataSize:= SizeOf(TTreeData);
            VST1.DeleteChildren(VST1.RootNode, True);

        //------------Create Node's---------------------------------------------

          While Not EOF DO
            Begin
              TreeObject:= TTreeDataClass.Create;
              TreeObject.Vorname:= FieldByName('MVorname').AsString;
              TreeObject.Name:= FieldByName('MName').AsString;
              TreeObject.Firma:= FieldByName('MFirma').AsString;
              TreeObject.Strasse:= FieldByName('MStrasse').AsString;
              TreeObject.WohnBei:= FieldByName('MWohnBei').AsString;
              TreeObject.PLZ:= FieldByName('MPLZ').AsString;
              TreeObject.Ort:= FieldByName('MOrt').AsString;
              TreeObject.BAnrede:= FieldByName('MBriefAnrede').AsString;
              Wurzel:= AddVSTObject(VST1, nil,TreeObject); //Die Node aus der SQL-Abfrage werden eingefügt

        //------------Create Root's---------------------------------------------
              if FieldByName('MNameGF1').AsString > '' Then
                Begin
                  TreeObject:= TTreeDataClass.Create;
                  TreeObject.VornameGF1:= FieldByName('MVornameGF1').AsString;
                  TreeObject.NameGF1:= FieldByName('MNameGF1').AsString;
                  TreeObject.StrasseGF1:= FieldByName('MStrasseGF1').AsString;
                  TreeObject.PLZGF1:= FieldByName('MPLZGF1').AsString;
                  TreeObject.Ort:= FieldByName('MOrtGF1').AsString;
                  TreeObject.BAnredeGF1:= FieldByName('MBriefAnredeGF1').AsString;
                  TreeObject.Icon:= 31;
                  AddVSTObject(VST1, Wurzel, TreeObject); //die Root's werden den passenden Node's zugewiesen
                end; // IF MNameGF1 > ''
Code:
Function ADDVSTObject(aVST: TCustomVirtualStringTree; aNode: PVirtualNode;
                      aObject: TObject): PVirtualNode;
var
  Data: PTreeData;
Begin
  Result:= aVST.AddChild(aNode);
  aVST.ValidateNode(Result, False);
  Data:= aVST.GetNodeData(Result);
  Data^.FObject:= aObject;
end;
Die Procedure für die Abfrage kannst Du im Programm an irgend einer Stelle aufrufen. Die Hauptsache ist, dass die Zuweisung in der Procedure GetText richtig sind. In der Procedure werden den Spalten der jeweilige Inhalt aus der Abfrage zugewiesen.

Des Weiteren habe ich die jeweiligen Felder noch seperat wie im dem o.g. Beispiel deklariert.

Ich hoffe es ist halbwegs verständlich.

Du kannst aber auch mal hier im Forum suchen, da gib es schon einiges zu dem Thema.

marcus 16. Sep 2004 06:59

Re: VirtualStringTree und Query
 
Hallo,

ein großes Dankeschön an Albi und DelphiDeveloper. Nach etwas anpassen und rumprobieren funktioniert es nun so wie ich mir das vorstelle. Nochmals Dankeschön!

Marcus


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 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