Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   VirtualImageList ActionList in der IDE sehr Langsam (https://www.delphipraxis.net/211950-virtualimagelist-actionlist-der-ide-sehr-langsam.html)

Thomasl 25. Nov 2022 12:11

VirtualImageList ActionList in der IDE sehr Langsam
 
Delphi Alexandria 11.2 Patch 1

Auf einem Form
ImageCollection
VirtualImageList
ActionList

alle miteinander verbunden
in der ImageCollection sind ca. 150 Bilder 64x64 Pixel als Png
Die VirtualImageList steht auf 32x32 Pixel bei 96DPI
Zur Laufzeit ist alles Normal/OK

Wenn man in der IDE die Actionlist öffnet, dauert das ca5-10Sec
Auch wenn man in der Actionlist von einer zur anderen Category wechselt dauert es..

ActionList ohne VirtualImageList läuft wieder normal, aber da hat man keine Icon Vorschau. Für uns keine Lösung wenn man da oft dran muss.
Mit der alten Imagelist wird die IDE nicht verzögert

Hat jemand ähnliches Festgestellt und eine Lösung?

peterbelow 28. Nov 2022 14:56

AW: VirtualImageList ActionList in der IDE sehr Langsam
 
Es geht vermutlich flotter wenn die ImageCollection zu jedem der Bilder auch die 32x32 Version enthält...

TurboMagic 28. Nov 2022 19:30

AW: VirtualImageList ActionList in der IDE sehr Langsam
 
Ja, das dürfte einiges ausmachen und wenn man in dem Formular mit der ActionList
nicht alle Images brauchen sollte die VirtualImageList dort nicht automatisch
befüllen lassen, sondern nur die reinnehmen, die man auch braucht.

Thomasl 29. Nov 2022 15:20

AW: VirtualImageList ActionList in der IDE sehr Langsam
 
Wenn man nur wenige reinnimmt ist es schneller, das ist aber keine Option.


Ich habe es jetzt zuerst mal so gelöst, das ich eine 2. alte Imagelist hinzugefügt habe (z.B. 24x24 Pixel)
Diese ist nur mit der ActionList verknüpft. Die wird ja nur in der IDE benötigt/angezeigt.
An allen anderen stellen ist die neue VirtualImagelist verknüpft.

So bleibt die IDE schnell und das Programm sieht schön aus

Die alte TImageList dann
ColorDepth = cd32Bit
DrawingStyle = dsTransparent
Height = 24
Masked = False
Width = 24

und in einem Rutsch die gleichen 64x64 PNG´s da rein
Es müssen nur 32Bit PNG´s sein damit der Hintergrund nicht Schwarz angezeigt wird

TurboMagic 29. Nov 2022 16:29

AW: VirtualImageList ActionList in der IDE sehr Langsam
 
Hast du auch mal probiert, was passiert wenn du in der Image Collection gleich 24x24 PNGs mit ablegst?

Thomasl 6. Dez 2022 14:05

AW: VirtualImageList ActionList in der IDE sehr Langsam
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz