Hallo,
Ich hab ein kleines Problem mit meinem Programm. Ich bekomme bei der Ausführung ständig einen EAccessViolation Fehler. Ich weis dass dies oft bei dynamischen Arrays auftaucht. Ich hab meine mehrfach überprüft und bin der Meinung nirgendwo sollte der Fehler auftreten. Nichts destotrotz hab ich dann einfach die Klasse TObjectList zur Hand genommen, in der Hoffnung - dass sollte ich ein Fehler gemacht haben - dieser dort nicht vorkommt. Aber leider bekomme ich immer noch den selben Fehler.
Hier erstmal der Code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
Init;
//
end;
procedure TForm1.Init;
begin
CurrentPath := 'L:\';
Folders := TStringList.Create;
ObjectList := TObjectList.Create( True );
//
end;
// Hier geht es los. Das Ausgehende Verzeichnis wird gesetzt und OpenDir ausgeführt.
procedure TForm1.Button1Click(Sender: TObject);
begin
CurrentPath := 'L:\';
OpenDir( CurrentPath );
//
end;
// Die StringList Folders wird geleert, die bisherigen dargestellten Ordner gelöscht, die Neuen werden ermittelt und angezeigt.
procedure TForm1.OpenDir( Dir: String );
begin
Folders.Clear;
DeleteView;
GetFoldersOfDir( Folders, Dir );
CreateFolders( Folders, ViewPanel );
//
end;
procedure TForm1.GetFoldersOfDir( TargetList: TObject; Dir: String );
var SearchRec: TSearchRec;
begin
if FindFirst(Dir+'*', faDirectory, SearchRec) = 0 then
begin
repeat
if (SearchRec.attr and faDirectory) = faDirectory then
begin
If (SearchRec.Name <> '.') and (SearchRec.Name <> '..') Then
TStringList( TargetList ).Add( SearchRec.Name );
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
//
end;
procedure TForm1.LabelClick(Sender: TObject);
begin
CurrentPath := CurrentPath + TLabel( Sender ).Caption + '\';
OpenDir( CurrentPath );
//
end;
// Erstellt Icon und Label für die Ordner.
procedure TForm1.CreateFolders( TargetList: TObject; TargetPanel: TObject );
var n,i: integer;
begin
For n := 0 To TStringList( TargetList ).Count-1 Do
Begin
i := ObjectList.Add( TImage.Create(Form1) );
With TImage(ObjectList.Items[i]) Do
Begin
Parent := TPanel(TargetPanel);
// Image1 bleibt die ganze Zeit über.
Picture.Bitmap := Image1.Picture.Bitmap;
Left := 4;
Top := 4*(n+1) + 15*(n);
Proportional := True;
Width := 13;
Height := 13;
Transparent := True;
End;
i := ObjectList.Add( TLabel.Create(Form1) );
With TLabel(ObjectList.Items[i]) Do
Begin
Parent := TPanel(TargetPanel);
Left := 20;
Top := 4*(n+1) + 15*(n);
AutoSize := False;
Width := 95;
Height := 15;
Caption := TStringList( TargetList ).Strings[n];
Transparent := True;
Cursor := crHandPoint;
OnClick := LabelClick;
End;
TPanel( TargetPanel ).Height := TLabel(ObjectList.Items[i]).Top+30;
End;
// Da der Fehler nur ab und zu eintrat, hab ich als Test das ShowMessage rein getan.
// Danach tritt der Fehler dann immer auf.
ShowMessage('*');
//
end;
// Löscht alle Objekte (Icons und Labels der angezeigten Ordner) aus der ObjectList.
// In der ObjectList sind sonst keine anderen Objekte enthalten
procedure TForm1.DeleteView;
begin
While ObjectList.Count > 0 Do
Begin
// Da ObjectList die Dateien auch besitzt (OwnsObjects = True), gibt er auch
// die Objekte frei, sobald man sie aus der Liste löscht.
ObjectList.Delete( 0 );
End;
//
end;
Kurz zur Ausführung: Das Programm soll mir alle Ordner in einem Verzeichnis anzeigen. Mit einem Klick auf den Ordner zeigt man wieder die darin befindlichen Ordner an.
Nach der Ausführung von Button1Click wechselt er zum Verzeichnis L:\ und zeigt mir einen Ordner (was auch stimmt). Klicke ich auf diesen, so erstellt er Icons und Labels von allen Ordnern korrekt (die Anzahl stimmt, und er zeigt auch alle an), aber gibt mir dann ein EAccessViolation Fehler. (Ohne das ShowMessage manchmal auch erst in anderen Ordnern)
Hab ich irgendwas übersehen? Im Prinzip macht er ja was er soll, und darum versteh ich auch nicht warum ich am Ende trotzdem den Fehler erhalte.
Danke schonmal für jede Hilfe!