Einzelnen Beitrag anzeigen

Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
67 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: VirtualImageList ActionList in der IDE sehr Langsam

  Alt 6. Dez 2022, 15:05
An den Bildern in der Collection liegt es nicht,
mit diesem Code kann man Testweise das befüllen der TVirtualImageList zur Laufzeit mit verschiedenen Größen beschleunigen (Faktor 2),
ganz einfach indem das Fertig Skalierte Bild der Collection hinzugefügt wird.

Wenn man jetzt auch noch ganz viele Forms hat, gibt es noch andere Probleme, weil sehr viel Arbeitsspeicher verbraucht wird.
Ich habe das schon gelöst, dafür mache ich aber einen neuen Thread auf.

...
if not (csDesigning in ComponentState) then
begin
ImageCollectionSourceItem := Images[AIndex].SourceImages.Add;
ImageCollectionSourceItem.Image := BufferImage;
end;
...

Vcl.ImageCollection.pas Zeile 589
Delphi-Quellcode:

function TImageCollection.GetBitmap(AIndex: Integer; AWidth, AHeight: Integer): TBitmap;
var
  SourceImage: TWICImage;
  BufferImage: TWICImage;
  ImageCollectionSourceItem: TImageCollectionSourceItem;
begin
  Result := nil;
  if (AIndex < 0) or (AIndex > FImages.Count - 1) then
    Exit;

  SourceImage := GetSourceImage(AIndex, AWidth, AHeight);
  if SourceImage = nil then
    Exit;

  if Assigned(FOnGetBitmap) then
    FOnGetBitmap(SourceImage, AWidth, AHeight, Result)
  else
  begin
    Result := TBitmap.Create;
    if not TStyleManager.ActiveStyle.Enabled then
    begin
      Result.PixelFormat := pf32bit;
      Result.Canvas.Brush.Color := clBtnFace;
      Result.SetSize(AWidth, AHeight);
      Result.Canvas.StretchDraw(Rect(0, 0, AWidth, AHeight), SourceImage);
    end
    else if (SourceImage.Width = AWidth) and (SourceImage.Height = AHeight) then
      Result.Assign(SourceImage)
    else
    begin
      BufferImage := GetScaledImage(SourceImage, AWidth, AHeight);

      if not (csDesigning in ComponentState) then
      begin
        ImageCollectionSourceItem := Images[AIndex].SourceImages.Add;
        ImageCollectionSourceItem.Image := BufferImage;
      end;

      try
        Result.Assign(BufferImage);
      finally
        BufferImage.Free;
      end;
    end;
    if Result.PixelFormat = pf32bit then
      Result.AlphaFormat := afIgnored;
  end;
end;
Thomas Levering
  Mit Zitat antworten Zitat