Hallo Leute,
ich zerbrech mir hier gerade übelst den Kopf. Hab im Forum und Tutorials gesucht aber nix gefunden
Die Ausgangsstellung:
Habe eine TreeView, die ich mit Daten einer
DB fülle. Das geht wunderbar.
Delphi-Quellcode:
//****************************************************************************//
//fill nodes with records from database
procedure TFMain.UpdateNodes(Node: TTreeNode; DS: TpFIBDataSet; Field:
String);
var
// DSCount: Integer;
IsExp: Boolean;
SQL:
String;
begin
//query of used categories
DS.Close;
SQL := '
select ' + Field + '
from ' + Field +'
, SONG ';
SQL :=
SQL + '
where SONG.' + Field + '
_ID = ' + Field + '
.ID ';
SQL :=
SQL + '
group by ' + Field + '
order by ' + Field;
DS.SelectSQL.Clear;
DS.SelectSQL.Add(
SQL);
DS.Open;
DS.Last;
DS.First;
//formal thing
IsExp := TVMain.Items[Node.
Index].Expanded;
//delete all children of the node and fill in new
TVMain.Items.Item[Node.
Index].DeleteChildren;
while not DS.Eof
do
begin
TVMain.Items.AddChild(Node, DS[Field]);
Application.ProcessMessages;
DS.Next;
end;
TVMain.Items.Item[Node.
Index].Expanded := IsExp;
Node.Text := Field + '
s (' + IntToStr(DS.RecordCount) + '
)';
end;
//****************************************************************************//
//****************************************************************************//
Das Problem
Das ganze möchte ich jetzt mit einem VirtualStringTree machen. Ich bin nach dem Tutorial gegangen von Mike Lischke. Es funktioniert nur, wenn ich
FocusedNode benutze. Ich möchte aber die Childs einer meiner Hauptnodes erneuern (z.B. Genre)
Als erstes meine Datenstruktur:
Delphi-Quellcode:
TBasicNodeData = class
protected
cImageIndex: Integer;
cName: ShortString;
public
constructor Create; overload;
constructor Create(vName: ShortString;
vIIndex: Integer = 0); overload;
property Name: ShortString read cName write cName;
property ImageIndex: Integer read cImageIndex write cImageIndex;
end;
rSectionsData = record
BasicND: TBasicNodeData;
end;
var
FMain: TFMain;
ndLibrary,
ndArtist,
ndAlbum,
ndGenre,
ndLanguage,
ndPlaylist: PVirtualNode;
Die Hauptnodes erzeuge ich so
Delphi-Quellcode:
procedure TFMain.CreateSectionNode(Node: PVirtualNode;
Caption: String);
var
NodeD: ^rSectionsData;
begin
VSTSections.NodeDataSize := SizeOf(rSectionsData);
Node := VSTSections.AddChild(nil);
NodeD := VSTSections.GetNodeData(Node);
NodeD.BasicND := TBasicNodeData.Create(Caption);
end;
procedure TFMain.FormCreate(Sender: TObject);
begin
CreateSectionNode(ndLibrary, 'Library');
CreateSectionNode(ndArtist, 'Artists');
CreateSectionNode(ndAlbum, 'Albums');
CreateSectionNode(ndGenre, 'Genres');
CreateSectionNode(ndLanguage, 'Languages');
CreateSectionNode(ndPlaylist, 'Playlist');
end;
Die Childs werden hier erzeugt
Delphi-Quellcode:
procedure TFMain.Button1Click(Sender: TObject);
var
NodeD: ^rSectionsData;
Node: PVirtualNode;
begin
DMMedia.ZQ1.First;
while NOT DMMedia.ZQ1.Eof do
begin
Node := VSTSections.AddChild(ndGenre);
NodeD := VSTSections.GetNodeData(Node);
NodeD.BasicND := TBasicNodeData.Create(DMMedia.ZQ1Genre.AsString);
DMMedia.ZQ1.Next;
end;
end;
Wenn ich statt ndGenre FocusedNode einsetze funktioniert es, aber halt nicht dort wo ich will