Thema: Delphi EAccessViolation

Einzelnen Beitrag anzeigen

monty.ms

Registriert seit: 19. Nov 2004
76 Beiträge
 
#1

EAccessViolation

  Alt 6. Nov 2008, 20:05
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!
  Mit Zitat antworten Zitat