Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi VirtualStringTree : Datenanzeige (https://www.delphipraxis.net/45741-virtualstringtree-datenanzeige.html)

ucor 11. Mai 2005 17:31

Datenbank: Access • Zugriff über: ADO

VirtualStringTree : Datenanzeige
 
Hallo,

ich benutze die VST-Komponente um die Daten einer Datenbank in einer Baumstruktur anzuzeigen.
Das klappt soweit ganz gut. Mein Problem ist folgendes: Beim Doppelklick auf irgendeinen Node soll der Rest des jeweiligen Datensatzes in einer Listview dargestellt werden. Wie könnte man das hinbekommen?

Gruß U.

Alexander 11. Mai 2005 18:21

Re: VirtualStringTree : Datenanzeige
 
So schwer dürfte das doch nicht sein.
Im OnDblClick musst halt noch eine Abfrage machen und diese dann im Listview anzeigen. Da es geschafft hast die Daten in dem VST anzuzeigen, wirst du es wohl auch in der Listview schaffen (wenn nicht wirst du hier wohl einiges finden...).

Bei der Abfrage musst du ja nur eine WHERE Bedingung hinzufügen, die den entsprechenden Datensatz beschreibt. Speichere am besten neben den angezeigten Daten im VST noch den Primary Key und du machst dir die ganze Sache recht einfach.

Die SQL-Abfrage dürfte dann bspw. so aussehen:
SQL-Code:
SELECT bla FROM tabelle WHERE ID = ID_des_markierten_Eintrags
Oder habe ich dich falsch verstanden?

ucor 11. Mai 2005 18:32

Re: VirtualStringTree : Datenanzeige
 
Hallo Alexander,
das Problem liegt nicht in der SQL Anweisung, sondern im VST. Hier muß beim Doppelklicken der richtige Datensatz erkannt werden.

Gruß U.

Albi 11. Mai 2005 18:57

Re: VirtualStringTree : Datenanzeige
 
Hallo,

ich mache das immer so:

Code:
procedure VSTColumnDblClick(
  Sender: TBaseVirtualTree; Column: TColumnIndex; Shift: TShiftState);
var Node: PVirtualNode;
    var i: Integer;
begin
  ...
  ...
  Node:= VST.FocusedNode; //aktueller Node
  ...
  ...
  //Schleife für die Spalten
  ListView1.Items.add(VST.text[Node,i])
end;
Ich hoffe das hilft dir weiter.

generic 12. Mai 2005 07:18

Re: VirtualStringTree : Datenanzeige
 
Delphi-Quellcode:
VST.FocusedNode
zeigt den aktuelle gewählten knoten.
beim doppelklick wählst du ja automatisch einen aus (mit dem ersten klick)

du solltest allerdings immer noch prüfen ob ein node da ist.
für den fall das jemand noch keinen knoten gewählt hatte und in einen freien bereich klickert ist focusednode=nil !

ucor 12. Mai 2005 12:29

Re: VirtualStringTree : Datenanzeige
 
Hallo,
zunächst mal danke für eure Hilfe.

Ich habe das Problem nun folgendermaßen lösen können:
(Sicherlich nicht sehr elegant und ballastreich)

Delphi-Quellcode:
procedure TFA.VSTDblClick(Sender: TObject);

var
   Data : PTreeData;
   Node, ParentNode : PVirtualNode;
   InitialStates: TVirtualNodeInitStates;
   ListItem: TListItem;
   ListView: TListView;
   iLevel : integer;
begin
Data:= VST.GetNodeData(Node);
   begin
     if Assigned(Data)and (Data<>nil) then
      begin
       Node:=VST.focusedNode ;
       iLevel := VST.GetNodeLevel(Node);
         if VST.RootNodeCount > 0 then
         if VST.SelectedCount > 0 then
         begin
         Data := VST.GetNodeData(VST.GetFirstSelected);
           if ParentNode <> nil then
              InitialStates := InitialStates + [ivsHasChildren, ivsExpanded];
           with q1 do
              begin
                 case iLevel of
                 0:
                 begin
                   filtered := true;
                   filter := 'Kunden = ' +#39 + (TTreeDataClass(Data.FObject).FKunden) +#39;
                     with LV1 do
                       begin
                         clear;
                         ListItem := Items.Add;
                         ListItem.Caption :=FieldByName('Str').AsString ;
                         ListItem := Items.Add;
                         ListItem.Caption :=FieldByName('Ort').AsString ;
                         .
                         .
                         .
                       end;
                 end;
                 1:
                 begin
                 filtered := true;
                 filter := 'Auftraege = ' +#39 + (TTreeDataClass(Data.FObject).FAuftraege) +#39;
                      with LV1 do
                        begin
                          clear;
                          ListItem := Items.Add;
                          ListItem.Caption :=FieldByName('Nr').AsString ;
                          ListItem := Items.Add;
                          ListItem.Caption :=FieldByName('Datum').AsString ;
                          .
                          .
                          .
                        end;
                 end;
                 2:
                 begin
                 .
                 .
                 .

                 end;
                 .
                 .
                 .
         end;
       end;
     end;
   end;
 end;
end;
Vielleicht kennt ihr eine kürzere und/oder elegantere Lösung.
Wäre für jede lehrreiche Lektion dankbar.

Gruß U.

Albi 12. Mai 2005 13:41

Re: VirtualStringTree : Datenanzeige
 
Hallo,

es geht dir nur um den markierten Eintrag/Zeile in der VST? Dann kannst Du doch so machen wie ich das oben beschrieben habe. Die Daten, die in die LV sollen stehen doch alle schon in der VST, oder?

ucor 12. Mai 2005 15:09

Re: VirtualStringTree : Datenanzeige
 
Hallo Albi,

ich habs mit der "Schleife für die Spalten" nicht verstanden.

Gruß U.

Albi 12. Mai 2005 16:28

Re: VirtualStringTree : Datenanzeige
 
:hi: ,

mit dem folgenden Code habe ich den Inhalt der VST mal in ne *.Txt Datei geschrieben, dass solltest Du kannst Du dann einfach auf die Listview umschreiben.

Code:
for j:= 0 To VST1.Header.Columns.Count-1 Do /*Spaltennamen in txt schreiben*/
    Begin
      tmp:= VST1.Header.Columns.Items[j].Text+';';
      Write(f,tmp);
    end;
  Writeln(f,'');
  Node:= VST1.FocusedNode;
  for i:= 0 To VST1.Header.Columns.Count-1 DO /*Inhalt der Node's in die txt schreiben*/
    Begin
      Tmp:= VST1.Text[Node,i]+';';
      Write(f,tmp);
    end;
Das Tmp kannst Du dir sparen und den Inhalt direkt über ListView1.items[i].add(VST1.Text[Node,i]. So sollte das ganze funktionieren.

generic 17. Mai 2005 08:22

Re: VirtualStringTree : Datenanzeige
 
der listview hat doch mit dem vst nix zu tun.
daher verstehe ich nicht warum du die daten unbedingt im vst speichern willst.

die daten solltest du beim klick auf einen node nachladen und dann im lv anzeigen.
wenn du die daten (alle) schon vorher laden willst würde ich den record/obj der die daten im vst hällt um die daten erweitern aber nicht in vst anzeigen und schon garnicht ans "nodes" drunter hägen.


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