Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Wie verwendet man die neue TVirtualImageList (https://www.delphipraxis.net/198699-wie-verwendet-man-die-neue-tvirtualimagelist.html)

Uwe Raabe 12. Mai 2020 12:30

AW: Wie verwendet man die neue TVirtualImageList
 
Stimmt. SetGraphic macht ein Assign.

Delphi-Quellcode:
 img := Images.GetScaledImage(Images.GetIndexByName('krankenwagen'), Image3.Width, Image3.Height); // img: TWICImage;
 try
   Image3.Picture.Graphic := img;
 finally
   img.Free;
 end;

DieDolly 12. Mai 2020 13:18

AW: Wie verwendet man die neue TVirtualImageList
 
Ist es möglich img als var Parameter dem Aufruf mitzugeben um Zeilen zu sparen?
Weil ich ändere die Bilder öfter und nicht nur zum Programmstart.

Delphi-Quellcode:
procedure TImageCollectionHelper.GetScaledImage(AIndex, AWidth, AHeight: Integer; var Graphic: TGraphic);
var
 Img: TWICImage;
begin
 Img := GetScaledImage(GetSourceImage(AIndex, AWidth, AHeight), AWidth, AHeight);
 try
  Graphic := Img;
 finally
  Img.Free;
 end;
end;

Uwe Raabe 12. Mai 2020 13:57

AW: Wie verwendet man die neue TVirtualImageList
 
Da Graphic ein Property ist, kann man das nicht als var-Parameter übergeben. Allerdings kann man noch einen anderen Class Helper schreiben:
Delphi-Quellcode:
type
  TImageHelper = class helper for TImage
  public
    procedure UpdateImage(Source: TImageCollection; Index: Integer); overload;
    procedure UpdateImage(Source: TImageCollection; const AName: string); overload;
  end;

procedure TImageHelper.UpdateImage(Source: TImageCollection; Index: Integer);
var
  img: TWICImage;
begin
  img := Source.GetScaledImage(Index, Width, Height);
  try
    Picture.Graphic := img;
  finally
    img.Free;
  end;
end;

procedure TImageHelper.UpdateImage(Source: TImageCollection; const AName: string);
begin
  UpdateImage(Source, Source.GetIndexByName(AName));
end;


...
 Image3.UpdateImage(Images, 'krankenwagen');
...

creehawk 13. Mai 2020 15:48

AW: Wie verwendet man die neue TVirtualImageList
 
Moin Moin.

Etwas verspätet wieder am Platz, aber mein Router war abgeraucht.

Ich bedanke mich ebenfalls für die Antwort(en) und Hinweise.

creehawk

himitsu 14. Mai 2020 10:07

AW: Wie verwendet man die neue TVirtualImageList
 
Zitat:

Zitat von DieDolly (Beitrag 1464369)
Ist es möglich img als var Parameter dem Aufruf mitzugeben um Zeilen zu sparen?
Weil ich ändere die Bilder öfter und nicht nur zum Programmstart.

Nein, denn es wird nicht die Referenz kopiert,
selbst wenn es das würde, dann wäre es Fatal die kopierte Referenz (Img) sofort freizugeben,
und da es nicht möglich ist einen Property zu übergeben, sondern nur den wert aus/für dessen Getter oder Setter,
ist VAR hier sowieso nutzlos.


Du kannst aber TPicture als Parameter übergeben und darüber auf den Setter des Picture.Graphic zugreifen,
oder z.B. wie im schon gezeigten ClassHelper, an TImage oder auch an TPicture, das .Graphic in der Methode benutzen.

TurboMagic 15. Mai 2020 06:34

AW: Wie verwendet man die neue TVirtualImageList
 
Zitat:

Zitat von DieDolly (Beitrag 1464358)
Also doch nicht ganz meine Blödheit. Danke dafür.
Ich frage mich wieso sowas nicht schon direkt in der Komponente enthalten ist. Ich finde es ist logisch, dass wenn man dem Aufruf Width und Height mit gibt, man auch nach Möglichkeit diese Größe haben möchte.

Die Frage ist natürlich berechtigt.
Hast du schon mal in quality.embarcadero.com nachgeschaut ob die dort auch schon jemand gestellt hat?
Falls nicht wäre es toll, wenn du das dort als Feature Request eintragen könntest und uns hier
dann die Report Nummer verrätst, damit wir dafür stimmen können.

Grüße
TurboMagic

DieDolly 11. Jun 2020 12:27

AW: Wie verwendet man die neue TVirtualImageList
 
Gibt es sowas auch für Icon? Ich versuche mich hier gerade wieder dumm und dämlich.
Ich habe das aktuell so
Delphi-Quellcode:
type
 TImageHelper = class helper for TImage
 public
  procedure GetImage(Source: TImageCollection; Index: Integer); overload;
  procedure GetImage(Source: TImageCollection; const AName: string); overload;
 end;

type
 TImageCollectionHelper = class helper for TImageCollection
 public
  function GetScaledImage(AIndex, AWidth, AHeight: Integer): TWICImage; overload;
 end;

implementation

procedure TImageHelper.GetImage(Source: TImageCollection; Index: Integer);
var
 img: TWICImage;
begin
 img := Source.GetScaledImage(Index, Width, Height);
 try
  Picture.Graphic := img;
 finally
  img.Free;
 end;
end;

procedure TImageHelper.GetImage(Source: TImageCollection; const AName: string);
var
 Index: Integer;
begin
 Index := Source.GetIndexByName(AName);
 if Index > -1 then
  GetImage(Source, Index);
end;

function TImageCollectionHelper.GetScaledImage(AIndex, AWidth, AHeight: Integer): TWICImage;
begin
 Result := GetScaledImage(GetSourceImage(AIndex, AWidth, AHeight), AWidth, AHeight);
end;

Carsten Hölscher 21. Dez 2021 15:21

AW: Wie verwendet man die neue TVirtualImageList
 
Etwas weiter vorne war die Frage nach der Transparenz aufgekommen aber bisher nicht beantwortet. Wenn ich ein Bitmap aus der virtualcollection ziehe, dann werden die transparenten Bereiche schwarz gezeichnet (ich zeichne hier ein Symbol in ein Stringgrid).

Carsten

Carsten Hölscher 29. Dez 2021 15:58

AW: Wie verwendet man die neue TVirtualImageList
 
Falls hierzu mal wieder jemand knobelt:

Bitmap.alphaformat:=afDefined;

muss man beim TBitmap setzen, bevor man es zeichnet. Geht zumindest für meine PNG-Dateien mit transparentem Hintergrund, die in einer VirtualImagelist einsortiert sind.

Carsten

Rollo62 30. Dez 2021 09:06

AW: Wie verwendet man die neue TVirtualImageList
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1419072)
Hehe, basiert nicht FireMonkey noch komplett auf Bitmap-Grafiken? :duck:

Ja, Alles landet am Ende als Bitmap auf dem Display, Vektor-Displays müssten erst noch erfunden werden.
Genau wie die VirtualImageLists auf Ende auch nur Raster-Bitmaps sind.

Aber FMX Images basierten schon auf "MultiBitmaps", welche sinngemäß den VirtualImageLists entsprechen,
um genau diese HighDPI und "Retina" Probleme abzufangen.
Das gab es schon standardmäßig als VCL noch gar nichts mit DPI anzufangen wusste :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.
Seite 3 von 4     123 4      

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