![]() |
Problem beim erstellen von VirtualTreeView
Moin,
ich habe hier ein Fragment eines Programmes das bis hier hin folgendes machen soll: einlesen einer Verzeichnisstruktur mit Unterverzeichnissen und Dateien in eine StringList (klappt) erstellen eines VirtualTreeView mit den Unterverzeichnissen als Knoten (klappt nicht) Sobald ich das Programm laufen lasse bricht es mit einem "access violation at" ab. Das passiert gleich beim ersten Mal in der Function AddVSTStructure wenn die letzte Zuordnung passiert. Hat jemand eine Idee woran das liegt ? Hans
Delphi-Quellcode:
unit SerienDatabase;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls, ShellAPI, VirtualTrees.BaseAncestorVCL, VirtualTrees.BaseTree, VirtualTrees.AncestorVCL, VirtualTrees, StringLib, Vcl.Mask; type TSerienDB = class(TForm) LbEVerzeichnis: TLabeledEdit; VST: TVirtualStringTree; LbEStatus: TLabeledEdit; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; type PTreeData = ^TTreeData; TTreeData = record FCaption: String; (* Titel *) FColumn1: Integer; (* Anzahl Folgen *) FColumn2: Integer; (* Anzahl bereits gesehen *) FColumn3: String; (* Zuletzt abgespielt am *) FColumn4: String; (* Serienname / Übergeord. Verzeichns *) end; var SerienDB: TSerienDB; SDBKnoten: PVirtualNode; DateiListe: TStringList; implementation {$R *.dfm} function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode; var Data: PTreeData; begin Result := AVST.AddChild(ANode); Data := AVST.GetNodeData(Result); Avst.ValidateNode(Result, False); Data^.FCaption := ARecord.FCaption; Data^.FColumn1 := ARecord.FColumn1; Data^.FColumn2 := ARecord.FColumn2; Data^.FColumn3 := ARecord.FColumn3; Data^.FColumn4 := ARecord.FColumn4; <- hier knallt es end; procedure VirtualTreeErzeugen; var I: Integer; Serientitel: String; TreeData: TTreeData; Node: PVirtualNode; begin SerienDB.VST.BeginUpdate; for i := 0 to DateiListe.Count -1 do begin SerienDB.LbEStatus.Text := DateiListe[i]; SerienDB.LbEStatus.Refresh; if copy(DateiListe[i], 1,1) = 'V' then begin (* hier werden nur die Serien zugefügt *) Node := nil; DateiListe[i] := copy(DateiListe[i], 2, length(DateiListe[i]) -1); TreeData.FCaption := ExtractFileName(DateiListe[i]); (* Titel *) TreeData.FColumn1 := 0; (* Anzahl Filme *) TreeData.FColumn2 := 0; (* Anzahl abgespielt *) TreeData.FColumn3 := '01.01.1980'; (* Zuletzt abgespielt *) TreeData.FColumn4 := DateiListe[i]; (* Titel *) Node := AddVSTStructure(SerienDB.VST, Node, TreeData); end else begin (* sonst ist es eine Folge *) DateiListe[i] := copy(DateiListe[i], 2, length(DateiListe[i]) -1); TreeData.FCaption := ExtractFileName(DateiListe[i]); (* Titel *) TreeData.FColumn1 := 0; (* Anzahl Filme *) TreeData.FColumn2 := 0; (* Anzahl abgespielt *) TreeData.FColumn3 := '01.01.1980'; (* Zuletzt abgespielt *) TreeData.FColumn4 := DateiListe[i]; (* Titel *) AddVSTStructure(SerienDB.VST, Node, TreeData); end; end; SerienDB.VST.EndUpdate; end; Procedure FindFilesTree(aPath: String; aWithFiles: Boolean); Var SearchRec: TSearchRec; Begin // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen aPath := IncludeTrailingBackslash(aPath); If FindFirst(aPath + '*.*', faDirectory, SearchRec) = 0 Then Begin Repeat If (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then Begin If SearchRec.Attr and faDirectory <> 0 then Begin DateiListe.Add('V' +aPath +SearchRec.Name); FindFilesTree(aPath + SearchRec.Name, aWithFiles); End else begin DateiListe.Add('D' +aPath +SearchRec.Name); end; End; Until FindNext(SearchRec) <> 0; FindClose(SearchRec); End; End; procedure TSerienDB.FormClose(Sender: TObject; var Action: TCloseAction); begin DateiListe.Free; end; procedure TSerienDB.FormCreate(Sender: TObject); begin DateiListe := TStringList.Create; SerienDB.LbEStatus.Text := IntToStr(screen.Width) +' / ' +IntToStr(SerienDB.Width) +'/ ' +IntToStr(SerienDB.Height); FindFilesTree(LbEVerzeichnis.Text, true); VirtualTreeErzeugen; end; end. |
AW: Problem beim erstellen von VirtualTreeView
Fehlt da nicht ein OnGetNodeDataSize event oder ist das im entsprechenden Property angegeben?
|
AW: Problem beim erstellen von VirtualTreeView
Zitat:
Vielen Dank ! Hans |
AW: Problem beim erstellen von VirtualTreeView
Konnte man den nicht inzwischen mit Generics benutzen, ohne da mit Pointern rumfummeln zu müssen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz