Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AV beim Schließen des Fensters

  Alt 15. Dez 2004, 20:35
Noch ein letztes Problem. Ich habe folgenden Code:
Delphi-Quellcode:
type
  TThreadParams = packed record
    cntFileLists: Integer;
    DriveArray: TStringDynArray;
    Filter: ShortString;
    Listview: TListView;
  end;
  PThreadParams = ^TThreadParams;

[..]

procedure TForm1.btnFindClick(Sender: TObject);
var
  i : Integer;
  cnt : Integer;
  DriveArray : TStringDynArray;
  Index : Integer;
  FindFilesParams: PThreadParams;
  ThreadID : Cardinal;
begin
  lvFiles.Items.Clear;
  cnt := 0;
  SetLength(FileList, 0);
  StatusBar1.SimpleText := rsDoSearch;
  // für jedes ausgewählte Laufwerk eine Dateiliste
  for i := 0 to lstDrives.Items.Count - 1 do
  begin
    if lstDrives.Checked[i] then
    begin
      Inc(cnt);
    end;
  end;
  SetLength(FileList, cnt);
  SetLength(DriveArray, cnt);

  // alle Laufwerksbuchstaben in eine Liste eintragen
  Index := 0;
  for i := 0 to lstDrives.Items.Count - 1 do
  begin
    if lstDrives.Checked[i] then
    begin
      DriveArray[Index] := lstDrives.Items.Strings[i];
      Inc(Index);
    end;
  end;

  // Thread starten
  GetMem(FindFilesParams, sizeof(TThreadParams));
  FindFilesParams.cntFileLists := cnt;
  GetMem(FindFilesParams.DriveArray, cnt); // <-- !!
  FindFilesParams.DriveArray := DriveArray;
  FindFilesParams.Filter := edtFilter.Text;
  FindFilesParams.Listview := lvFiles;
  CloseHandle(BeginThread(nil, 0, @FindFilesThread, FindFilesParams, 0, ThreadID));

  StatusBar1.SimpleText := Format(rsFilesCount, [lvFiles.Items.Count]);
end;
In dem Record habe ich ein dynamisches Array für das ich Speicher alloziieren muss. Dies geschieht in der markierten Zeile. So weit so gut. Nur bekomme ich eine AV, wenn ich das Fenster schließe. Kommentiere ich die Zeile aus, bekomme ich eine AV wenn ich den Button klicke, aber nicht beim Schließen. Daraus schließe ich, dass es an dieser Zeile liegen muss. Nur warum? Im OnClose oder OnDestroy habe ich keinen Code mehr.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat