//dieses mal mit eingabe
procedure TfrmMain.StartIcons( ListView: TListView; ImageList: TImageList );
begin
// hier soll ein Thread abseits des Mainthreads starten um diesen zu entlasten
TThread.CreateAnonymousThread(
procedure ()
var // <- locale variablen für den Thread
LIcon: TIcon;
dummy: Word;
I: Integer;
LImageList: TImageList;
LListView: TListView;
begin
dummy := 0;
LListView := TListView.Create(
nil );
LImageList := TImageList.Create(
nil );
LIcon := TIcon.Create();
LIcon.Transparent := True;
LImageList.BeginUpdate;
LImageList.Assign( ImageList );
// <-- lokale kopie der aktuellen liste
LListView.Items.BeginUpdate;
LListView.Assign( ListView );
// <-- lokale kopie der aktuellen liste
try // <-- beginne mit der arbeit an den lokalen kopien
for i := 0
to LListView.Items.Count -1
do
begin
LIcon.Handle := ExtractAssociatedIcon( hInstance, PWideChar( LListView.Items.Item[ i ].Caption ), dummy );
LIcon.Transparent := True;
LListView.Items.Item[ i ].ImageIndex := LImageList.AddIcon( LIcon );
DestroyIcon( LIcon.Handle );
end;
LImageList.EndUpdate;
LListView.Items.EndUpdate;
TThread.Synchronize (
nil,
procedure ()
// übergebe lokale kopien zurück an vcl
begin
FileIcons.BeginUpdate;
FileIcons.Assign( LImageList );
FileIcons.EndUpdate;
lvFiles.Items.BeginUpdate;
lvFiles.Assign( LListView );
lvFiles.Items.EndUpdate;
end);
finally
LIcon.Free;
LImageList.Free;
LListView.Free;
end;
end).Start;
end;