Einzelnen Beitrag anzeigen

djmasi

Registriert seit: 9. Jun 2004
Ort: Leipzig
105 Beiträge
 
Delphi 7 Enterprise
 
#1

TreeView nach VirtualStringTree

  Alt 16. Aug 2004, 21:03
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
Miniaturansicht angehängter Grafiken
virtualstringtree.jpg   treeview.jpg  
Thomas Maßmann
  Mit Zitat antworten Zitat