Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Kann ich meine ListView beschleunigen (Icon laden dauert ewig)

  Alt 13. Nov 2018, 14:36
Mein nächster Versuch, bis jetzt mehr als gescheitert, bin noch auf Fehlersuche.

Hab mal im Soure kommentiert so wie ich es dachte das es funktioniert:
Delphi-Quellcode:
//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;
das ist momentan die schnellste variante, da sie nicht funktioniert :-]
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat