Autor Beitrag
Xenon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Do 11.09.03 09:31 
Guten Tag !

Ich beschäftige mich momentan mit dem VST(Virtual String Tree) von Herrn Lischke.

Ich denke ich habe schon alles gefunden was das www hergibt. Da die Seite von herrn lischke down ist bin ich mit meinem Spanisch am ende!

Folgendes Problem: auf meinem Form befinden sich ein VST, DBGrid, AdoConnection, AdoQuery und ein DataSource des ganze ist verbunden mit einer AccessDB. Nun möchte ich die Daten aus der AccessDB Grafisch im VST darstellen, leider weiss ich nicht wie ich eine Datenbank Verbindung vom VST zur AccessDB herstelle.

Im normalen TreeView hab ich es so gelöst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.FormCreate(Sender: TObject);
begin
   ADOQ1.Active := True;

     FieldList := TStringList.Create;
     TreeView1.Items.BeginUpdate;
     ADOQ1.First;
     while not ADOQ1.Eof do
     begin
          TreeAddItem(TreeView1, GetFieldList, ADOQ1.GetBookmark, False);
          ADOQ1.Next;
     end;

     FieldList.Clear;
     TreeView1.Alphasort;
     TreeView1.Items.EndUpdate;

//make first record selected:
     TreeView1.Items[2].Selected := true;
end;

Ich hoffe ich habe mein Prob halbwegs verständlich beschrieben. Danke im vorraus :)

Schönen Tag noch Xen :D

Moderiert von user profile iconTino: Titel geändert & Delphi-Tags hinzugefügt.

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Do 11.09.03 10:50 
HAllo,

www.delphi-gems.com/ ist nicht down.
Zu deinem eigentlichen problem:
Also, du musst dir einen record bzw eine klasse anlegen, die die gespeicherten daten cached. Du erzeugst in jedem schleifendurchlauf eine instanz deines objektes und hängst das objekt sammt neuem VirtualTreenode in den baum.

Gruß
Ken

Ps Du musst Ado1.first nicht aufrufen.

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Xenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Do 11.09.03 14:44 
Titel: VST
Hoi CenBells :)

Das Datenbank Progi hatte ich schon des hilft mir leider gar net weiter :cry:

Nik

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Do 11.09.03 15:34 
Was hilft dir denn nicht weiter, bzw wo liegt dein problem?

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Xenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Do 11.09.03 16:20 
Titel: VST Datenbank
Hallo Cen :)

Ich möchte eine DB in einem VST Grafisch darstellen. So funktionierts in einem TreeView:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, ImgList, ComCtrls, StdCtrls, VirtualTrees, rs,
  cxControls, cxContainer, cxTreeView;

type
  PTreeData = ^TTreeData;
  TTreeData = record
  FObject: TObject;
  end;

type
  TTreeDataClass = class
 private
  FTestStr1: String;
 published
  property TestStr1: String read FTestStr1 write FTestStr1;
  end;

type
  TForm1 = class(TForm)

    ADOCon1: TADOConnection;
    ADOQ1: TADOQuery;
    DS1: TDataSource;
    IL1: TImageList;
    VST: TVirtualStringTree;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    DBGridPro1: TDBGridPro;
    ADOQ1TVID: TAutoIncField;
    ADOQ1TVDummy: TWideStringField;
    ADOQ1TVParent1: TWideStringField;
    ADOQ1TVParent2: TWideStringField;
    ADOQ1TVParent3: TWideStringField;
    ADOQ1TVImage: TWideStringField;
    ADOQ1TVErstelDatum: TDateTimeField;
    ADOQ1TVErstelBenutzer: TWideStringField;
    ADOQ1TVAenderDatum: TDateTimeField;
    ADOQ1TVAenderBenutzer: TWideStringField;
    ImageList1: TImageList;
    TreeView1: TcxTreeView;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    function GetFieldList: TStringList;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure TreeView133Change(Sender: TObject; Node: TTreeNode);
    procedure DS1StateChange(Sender: TObject);
    procedure ADOQ1AfterInsert(DataSet: TDataSet);
    procedure ADOQ1BeforeDelete(DataSet: TDataSet);
    procedure ADOQ1BeforeEdit(DataSet: TDataSet);
    procedure ADOQ1AfterDelete(DataSet: TDataSet);
    procedure ADOQ1AfterPost(DataSet: TDataSet);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
    procedure VSTClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  FieldList: TStringList;

implementation
uses TreeFunc;

{$R *.dfm}
//------------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
   ADOQ1.Active := True;

     FieldList := TStringList.Create;
     TreeView1.Items.BeginUpdate;
     ADOQ1.First;
     while not ADOQ1.Eof do
     begin
          TreeAddItem(TreeView1, GetFieldList, ADOQ1.GetBookmark, False);
          ADOQ1.Next;
     end;

     FieldList.Clear;
     TreeView1.Alphasort;
     TreeView1.Items.EndUpdate;

//make first record selected:
     TreeView1.Items[2].Selected := true;
end;
//------------------------------------------------------------------------------------procedure TForm1.Button1Click(Sender: TObject);
begin
//   VST.AbsoluteIndex := 5;
end;
//------------------------------------------------------------------------------------procedure TForm1.Button2Click(Sender: TObject);
begin
//
end;
//------------------------------------------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
var  MyTreeNode1, MyTreeNode2: TTreeNode;
begin
  with TreeView1.Items do
  begin
    Clear; { vorhandene Knoten entfernen }
    MyTreeNode1 := Add(nil'Root 1'); { Hauptknoten hinzufügen }
    { Untergeordneter Knoten wurde gerade hinzugefügt }
    AddChild(MyTreeNode1,'ChildNode1');

    {Weiteren Hauptknoten hinzufügen}
    MyTreeNode2 := Add(MyTreeNode1, 'Root 2');
    {MyTreeNode2 an untergeordnetes Objekt übergeben }
    MyTreeNode2.ImageIndex := 0;
    MyTreeNode2.SelectedIndex := 1;

    AddChild(MyTreeNode2,'ChildNode2');

    {Change MyTreeNode2 to ChildNode2 }
    { und untergeordneten Knoten hinzufügen}
    MyTreeNode2 := TreeView1.Items[3] ;
    AddChild(MyTreeNode2,'ChildNode2a');

    MyTreeNode2 := TreeView1.Items[4] ;
    AddChild(MyTreeNode2,'ChildNode3a');

    {Untergeordneten Knoten zu ChildNode2, nach ChildNode2a hinzufügen}
    Add(MyTreeNode2,'ChildNode2b');

    {Weiteren Hauptknoten hinzufügen}
    Add(MyTreeNode1, 'Root 3');
  end;
end;

//--------------------------------------------------------------------------------------------------
function TForm1.GetFieldList: TStringList;
begin
   FieldList.clear;
   FieldList.add(ADOQ1.FieldByName('TVParent1').AsString);
   FieldList.add(ADOQ1.FieldByName('TVParent2').AsString);
   FieldList.add(ADOQ1.FieldByName('TVParent3').AsString);
   Result := FieldList;
end;
//------------------------------------------------------------------------------------
procedure TForm1.TreeView133Change(Sender: TObject; Node: TTreeNode);
begin
   DS1.Enabled := Node.Data <> nil;
   if DS1.Enabled then ADOQ1.GotoBookmark(Node.Data);
end;
//------------------------------------------------------------------------------------procedure TForm1.DS1StateChange(Sender: TObject);
begin
//   ItemList: TStringList;
//   Node: TTreeNode;
end;
//--------------------------------------------------------------------------------
procedure TForm1.ADOQ1AfterInsert(DataSet: TDataSet);
begin
   ADOQ1.ClearFields;
end;
//--------------------------------------------------------------------------------
procedure TForm1.ADOQ1BeforeDelete(DataSet: TDataSet);
begin
   GetFieldList;
end;
//--------------------------------------------------------------------------------
procedure TForm1.ADOQ1BeforeEdit(DataSet: TDataSet);
begin
   GetFieldList;
end;
//--------------------------------------------------------------------------------
procedure TForm1.ADOQ1AfterDelete(DataSet: TDataSet);
var CascadeDeleteLevel: Integer;
begin
   CascadeDeleteLevel := 0;
   TreeDeleteItem(TreeView1, FieldList, CascadeDeleteLevel);
end;
//--------------------------------------------------------------------------------
procedure TForm1.ADOQ1AfterPost(DataSet: TDataSet);
begin
     TreeView1.Items.BeginUpdate;

     if FieldList.Count > 0 then TreeDeleteItem(TreeView1, Fieldlist, 0);
     TreeView1.Selected := TreeAddItem(TreeView1, GetFieldlist, ADOQ1.GetBookmark, True);

     TreeView1.Items.EndUpdate;
end;
//--------------------------------------------------------------------------------
procedure TForm1.Button4Click(Sender: TObject);
begin
   TreeView1.LoadFromFile('TreeView.txt');
end;
//--------------------------------------------------------------------------------
procedure TForm1.Button5Click(Sender: TObject);
begin
   TreeView1.SaveToFile('TreeView.txt');
end;
//--------------------------------------------------------------------------------
procedure TForm1.TreeView1Click(Sender: TObject);
  var  Node: PVirtualNode;
       Data: PTreeData;
begin
   Node := VST.FocusedNode;
   if not Assigned(Node) then Exit;
   Data := VST.GetNodeData(Node);
   Showmessage(TTreeDataClass(Data.FObject).TestStr1);
end;
//--------------------------------------------------------------------------------
procedure TForm1.VSTClick(Sender: TObject);
  var  Node: PVirtualNode;
       Data: PTreeData;
begin
   Node := VST.FocusedNode;
   if not Assigned(Node) then Exit;
   Data := VST.GetNodeData(Node);
   Showmessage(TTreeDataClass(Data.FObject).TestStr1);
end;

end.

Ich möchte des ganze aber in einem VST verwirklichen .. aber ich hab keine ahnung wie :(

Danke Xen :)

Ps.: ich bin ein miserabler erklärer meines Problem I know 8)

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!
Xenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Fr 12.09.03 09:38 
Titel: Delphi Tags
Danke Tino :)

Greetz Nik

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Fr 12.09.03 10:24 
Hallo Xenon,

ich habe deine Email erhalten und werde es mir heute nachmittag mal anschauen. Bis dahin

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Xenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Fr 12.09.03 10:39 
Titel: Merci :)
Vielen Dank Cen :)

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 16.09.03 11:43 
Hallo Xenon (und alle anderen :D)

mit folgendem Code kannst du dir beispielsweise text aus der DB anzeigen lassen:
Du musst am besten in einer schleife durch dein q1 (query) gehen und jedesmal einen knoten erzeugen und dann diesem knoten das datenobjekt mitgeben. Beispielsweise:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
type
  TRecord = class
  private
     FText: String;
  public
     property Text: String read FText write FText;
  end;

...
// definiere eine eigene methode 
procedure TForm1.LoadData();
var
  LCnt: Integer;
  LNode: PVirtualNode;
  LRecord: TRecord;
  LData: Pointer;+
begin
   Q1.Filter := ''
   Q1.Filtered := false; 
   if not Q1.Active then 
       Q1.Open; 
   VST2.NodeDataSize := 4

   VST2.BeginUpdate; 
   VST2.Clear; 

   try
     for LCnt := 0 to Q1.RecordCount - 1 do begin   
        LNode := VST2.addChildNode(nil);
        LData := VST2.getNodeData(LNode);
        LRecord := TRecord.create;
        LRecord.Text := IntToStr(LCnt);// hier kannst du nun auch text aus der tabelle reinschreiben
       TObject(LData^) := LRecord;
     end;
   finally
     VST2.EndUpdate;   
   end;
end;

// nun in formcreate 
procedure TForm1.FormCreate(Sender: TObject);
var 
   I: Integer; 
begin 
   with VST2.Header do 
      for I := 0 to Columns.Count - 1 do 
         Columns[I].Hint := Columns[I].Hint + #10 + '(Can Show further information in hints too. )'
   ConvvertToHighColor(TreeImages);
  loadData();
end;

..
// jetzt noch gettext
procedure TForm1.Vst2OnGetText(...);
var
  Data: Pointer;
begin
  assert(Node <> nil);
  Data := VST2.getNodeData(Node);
  if Data = nil then exit;
  CellText := TRecord(Data).Text;
end;


Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Xenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win2000, XP
D6 Professionel
BeitragVerfasst: Mi 24.09.03 10:55 
Titel: VST
Hallo Cen :D

Danke für deine Hilfe solche hilfsbereite menschen findet man wirklich nicht alle tage :)

Aber naja wie du schon gesagt hast ich muss
irgendwas am tree umgestellt haben das es
bei mir nicht funktioniert :?:

Nochmals 1000 dank :wink:

_________________
Greetz Nik

Freiheit ist die Mikroskopisch kleinste Summe aus Unfreiheit!