Einzelnen Beitrag anzeigen

H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#1

Problem beim erstellen von VirtualTreeView

  Alt 8. Dez 2023, 13:19
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) = 'Vthen
    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.
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat