AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi VirtualStringTree und Query
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree und Query

Ein Thema von marcus · begonnen am 14. Sep 2004 · letzter Beitrag vom 16. Sep 2004
Antwort Antwort
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#1

VirtualStringTree und Query

  Alt 14. Sep 2004, 17:15
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#2

Re: VirtualStringTree und Query

  Alt 14. Sep 2004, 17:38
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.
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#3

Re: VirtualStringTree und Query

  Alt 14. Sep 2004, 18:49
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
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#4

Re: VirtualStringTree und Query

  Alt 14. Sep 2004, 19:57
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.
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#5

Re: VirtualStringTree und Query

  Alt 16. Sep 2004, 06:59
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
  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:20 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