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.