Delphi-PRAXiS

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/)
-   -   ImageCollection VirtualImageList Bilder von Festplatte laden (https://www.delphipraxis.net/204367-imagecollection-virtualimagelist-bilder-von-festplatte-laden.html)

Strict 23. Mai 2020 16:48

ImageCollection VirtualImageList Bilder von Festplatte laden
 
Ist es möglich Bilder von der Festplatte zur Laufzeit in eine ImageCollection und anschließend in eine VirtualImageList zu laden?

mmw 23. Mai 2020 18:06

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Hallo,
so sollte es funktionieren.

VirtualImageList.AddImages(Value: TCustomImageList);

http://docwiki.embarcadero.com/Libra...List.AddImages

Gruß

Strict 23. Mai 2020 18:51

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Danke. Kann man die Bilder auch direkt in die Liste laden, ohne vorher noch über eine dritte gehen zu müssen? Wie lädt man die Bilder vorher in eine ImageCollection?
Oder ist die ImageCollection die von mir falsch betitelte dritte Liste? Wenn ja wie lädt man die Bilder in die ImageCollection? Ein LoadFromFile o.ä. gibt es nicht.

mmw 23. Mai 2020 19:11

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Hallo,
das müßte mit

ImageList1.FileLoad()

funktionieren.

http://docwiki.embarcadero.com/Libra...eList.FileLoad

Gruß

Strict 23. Mai 2020 19:41

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Zitat:

ImageList1.FileLoad()
Eine ImageCollection hat kein FileLoad.

mmw 23. Mai 2020 21:08

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Hallo,

ich bin zuerst von einer VirtualImageList ausgegangen.

var itm:TimageCollectionItem;

begin

itm:=ImageCollection1.Images.Add;

itm.SourceImages.Add.Image.LoadFromFile();

end;

gruß

Strict 23. Mai 2020 23:11

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Ich finde diese zwei neuen Komponenten ehrlich viel zu kompliziert. Wie füge ich dieses Bild, was jetzt in der ImageCollection ist, der VirtualImageList zu?

Uwe Raabe 24. Mai 2020 00:16

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Zitat:

Zitat von Strict (Beitrag 1465108)
Ich finde diese zwei neuen Komponenten ehrlich viel zu kompliziert.

Na ja, es ist ja auch schon etwas komplex. Man fügt der VirtualImageList ja nicht ein bestimmtes Bild zu, sondern einen Eintrag (bzw. dessen Index oder Name) der ImageCollection. Dieser besteht dann wiederum aus mehreren Bildern, die zwar alle in etwa das gleiche darstellen, eben nur in verschiedenen Größen. Je nach Erfordernis (DPI) wird dann in der VirtualImageList die passende Größe ausgewählt und bei Bedarf auch noch skaliert.

Wenn man also ein Bild in die ImageCollection lädt, dann lädt man in der Regel nicht eine Bilddatei, sondern für jede Größe eine eigene.

Programmatisch ist das in der Tat etwas komplexer als z.B. bei einer TImageList. Daher ist auch das empfohlene Vorgehen, den integrierten ImageCollection-Editor zu verwenden.

Strict 24. Mai 2020 00:20

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
In meiner bestehenden ImageCollection habe ich den Eintrag mit Index X gelöscht. Den Eintrag mit Index X und X+1 für Disabled habe ich auch aus der VirtualImageList gelöscht.
Dann lade ich ein neues Bild von der Festplatte in die ImageCollection und füge es außerdem am alten Index der VirtualImageList hinzu

mmw 24. Mai 2020 07:37

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Hallo,

vielleicht hilft dies

VirtualImageList.insert()

Gruß

Uwe Raabe 24. Mai 2020 09:23

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Zitat:

Zitat von Strict (Beitrag 1465110)
Das Bild img1 wird in der VirtualImageList aber ans Ende angefügt egal welchen Wert IndexOld hat.

Ein Add fügt halt immer an. Der übergebene Index ist ja auch der in der ImageCollection und nicht der in der VirtualImageList. Wie schon gesagt, wäre Insert der bessere Ansatz.

Ich bin mir auch nicht sicher, ob dir bewusst ist, daß eine TVirtualImageList auch eine Teilmenge der Bilder einer TImageCollection enthalten kann und die Reihenfolge beliebig ist. Daher gibt es auch die Möglichkeit, die Verknüpfung mit dem Bildnamen anstatt des Index in der ImageCollection zu machen. Dann ist das gegen Umsortierungen in der ImageCollection immun.

Zitat:

Zitat von Strict (Beitrag 1465110)
Und wenn man zur Laufzeit Bilder laden möchte?
Ich möchte vorhandene Bilder einer ImageCollection und VirtualImageList durch andere zur Laufzeit austauschen.

In dem Fall bleibt dann eben nur der steinige Weg, das alles von Hand zu machen.

Verwendest du denn die automatische Größenanpassung der VirtualImageList überhaupt? In dem Fall solltest du doch auch unterschiedliche Größen deiner Bilder in separaten Dateien vorliegen haben. Theoretisch könnte man zwar auch von 256 Pixeln auf 16 skalieren lassen, aber das sieht in der Regel eher bescheiden aus. Deine Eingangsfrage lässt aber den Größen- und Skalierungs-Aspekt komplett außen vor. Das wirft wiederum die Frage auf, ob die Kombination aus TVirtualImageList und TImageCollection für deinen Anwendungsfall überhaupt die richtige Wahl ist.

Strict 24. Mai 2020 12:31

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Mit Add funktioniert es jetzt.

Uwe Raabe 24. Mai 2020 13:10

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Zitat:

Zitat von Strict (Beitrag 1465123)
Wenn ich Insert statt Add verwende, funktioniert leider gar nichts mehr.

Dann wäre es vielleicht mal Zeit für etwas Code um das nachzuvollziehen.

Zitat:

Zitat von Strict (Beitrag 1465123)
Ich benutze die Namen der Bilder, nicht die Indexe. Aber es liegt mir viel daran, die Reihenfolge zu behalten. Das hat seine Gründe in anderen Teilen des Programms.

Ob die VirtualImageList sich per Index oder Name mit der ImageCollection verbindet, sollte im Rest des Programms eigentlich egal sein. Wichtig ist doch nur die Reihenfolge der Bilder innerhalb der VirtualImageList (aktuell zumindest noch).

Strict 24. Mai 2020 13:42

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Es ist lauffähig. Hoffe ich jedenfalls. Nur das Problem mit dem Disabled-Bild habe ich noch nicht gefunden.
Komisch ist auch, dass wenn ich mehr als ein Bild durch LoadCustomImage schicke, die Liste scheinbar kaputt gemacht wird.
Lade ich ein Bild "d.png" und danach ein Bild "a.png", wird da wo a angezeigt weren soll, b angezeigt. Das führt sich so immer weiter fort.
Ich habe im Anhang ein Minimalbeispiel angefügt.

mmw 24. Mai 2020 15:44

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Hallo,

vielleicht sollte man nach einer Änderung

Images.Change;

aufrufen.


Gruß

Uwe Raabe 24. Mai 2020 17:32

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Du machst es einem Menschen mit Rot/Grün-Schwäche aber echt schwer...

... und doch zu kompliziert. Da du nur eine Größe für die Bilder hast, geht es auch einfacher:
Delphi-Quellcode:
procedure TForm1.LoadCustomImage(const Path, ImageName: string);
var
  index: Integer;
  fileName: string;
begin
  fileName := ExtractFilePath(ParamStr(0)) + Path + '\' + ImageName + '.png';
  if not FileExists(fileName) then
    Exit;

  index := Images.GetIndexByName(ImageName);

  if (index = -1) then
    Exit;

  Images.Images[index].SourceImages[0].Image.LoadFromFile(fileName); // ersetzt das Source-Image
  Images.Images[index].Change; // aktualisiert die VirtualImageList, die auch gleich das Disabled-Image erneuert
end;

Strict 24. Mai 2020 18:33

AW: ImageCollection VirtualImageList Bilder von Festplatte laden
 
Zitat:

Du machst es einem Menschen mit Rot/Grün-Schwäche aber echt schwer...
Das war nichtr gewollt. Sorry. Ich hatte auf die Schnelle keine anderen Icons und musste in Paint irgendetwas kritzeln.

Ich wusste nicht, dass das Ändern der ImageCollection auch gleichzeitig die VirtualImageList aktualisiert.

Zitat:

Da du nur eine Größe für die Bilder hast,
Die Bilder sind alle 64x64 groß und weren von der VirtualImageList zusätzlich auf 16x16x, 24x24 und 32x32 runtergerechnet.

Zitat:

vielleicht sollte man nach einer Änderung Images.Change;
Das habe ich anfangs tatsächlich gemacht, da das auch so in den Sourcen der ImageCollection steht. Das hat aber leider das Durcheinanderwürfeln der Bilder nicht verhindert.
Mein Fehler war scheinbar, dass ich aus beiden Listen gelöscht habe, was aber nicht sein muss (?)

Vielen dank an euch beide.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

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