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;