Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem beim erstellen von VirtualTreeView (https://www.delphipraxis.net/214234-problem-beim-erstellen-von-virtualtreeview.html)

H.Bothur 8. Dez 2023 13:19

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.

Uwe Raabe 8. Dez 2023 13:25

AW: Problem beim erstellen von VirtualTreeView
 
Fehlt da nicht ein OnGetNodeDataSize event oder ist das im entsprechenden Property angegeben?

H.Bothur 8. Dez 2023 13:37

AW: Problem beim erstellen von VirtualTreeView
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1530586)
Fehlt da nicht ein OnGetNodeDataSize event oder ist das im entsprechenden Property angegeben?

Stimmt - ich habe die Events vergessen !!
Vielen Dank !

Hans

himitsu 8. Dez 2023 15:18

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 02:02 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