Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi PNGImageList (https://www.delphipraxis.net/172944-pngimagelist.html)

Spectre 29. Jan 2013 23:00

PNGImageList
 
Hallo!

Ich bin dabei ein geografie-lernprogramm zu programmieren. der meiste code steht eigentlich schon, ich bin nun dabei diesen zu optimieren.
Hab ne komponente welche den

pngspeedbutton
pngimagelist
pngimagecollection

umfasst..
mit der imagelist und der imagecollection komme ich nicht ganz klar. zummeinen verstehe ich den unterschied nicht..in der imagecollection kann ich verschiedene bilder reinladen via Items
(PngImagecollectionitems[0] etc)

meine frage ist wie ich diese aufrufe bzw anzeige? wenn ich mehrere bilder in die pngimagecollection geladen habe, wie rufe ich diese via einem button auf? also mal angenommen ich habe 2 bilder reingeladen, wie kann ich diese mit einem knopf aufrufen bzw anzeigen lassen?

ich verzweifel daran :S danke für die hilfe leute!!

robin

Popov 29. Jan 2013 23:15

AW: PNGImageList
 
Ich kenne die Komponente nicht, deshalb kann ich nichts dazu sagen, aber bei der TImageList sieht es in etwa so aus ImageList.GetBitmap(Nr, ZielBitmap). Evtl. sieht es so ähnlich aus. Teste es mal. Wenn nicht, Beitrag ignorieren.

Spectre 29. Jan 2013 23:20

AW: PNGImageList
 
"ImageList.GetBitmap(Nr, ZielBitmap)"
was meinst du mit zielbitmap?


mal angenommen ich lade 2 bilder rein, Nr wäre dann 0 und 1 nehme ich an, was definiert zielbitmap?

Popov 29. Jan 2013 23:28

AW: PNGImageList
 
Ich dachte die Bezeichnung ist ist Selbsterklärend. Nehmen wir an du hast zwei Bitmaps in die ImageList1 geladen. In dem Fall ist die erste Bitmap die Nr 0, die zweite die Nr 1, usw. Dann nehmen wir an, du willst es in die Bitmap der Image Komponente laden (Image.Picture.Bitmap). Das ganze würde dann so aussehen:

Delphi-Quellcode:
ImageList1.GetBitmap(0, Image1.Picture.Bitmap);
Die erste Bitmap in der Liste (hier 0), wird am die Image Komponente Bitmap übergeben.

Zielbitmap ist also die Bitmap in die die Bitmap aus ImageList übergeben wird.

Spectre 29. Jan 2013 23:47

AW: PNGImageList
 
hmm...mit "ImageList1.GetBitmap" komme ich nicht weit...sieht aus als hätte die Png komponente eigene befehle :S
google hilft nicht wirklich weiter...ärgerlich. eigentlich möchte ich einfach nur via knopfdruck ein bild aus der imagecollection bzw den bilder die ich vorher reingeladen habe anzeigen :S

Uwe Raabe 30. Jan 2013 00:21

AW: PNGImageList
 
Also erstmal zum Unterschied:

Eine TPngImageList ist abgeleitet von einer normalen TImageList und erweiter diese um PNG-Support. Wie jede andere TImageList müssen alle Bilder darin gleich groß sein. Alle Controls, die mit einer TImageList zusammenarbeiten können (z.B. TToolbar), sollten dies auch mit einer TPngImageList tun.

Im Gegensatz dazu können die Bilder in einer TPngImageCollection unterschiedliche Größe haben. Allerdings muss man sich hier um die Darstellung der Bilder selber kümmern.

Hier ein kleines Beispiel, wie man das macht.

Auf ein Form platziere eine TPngImageCollection und fülle diese mit diversen Bildern (über den Editor oder per Code). Dann brauchen wir noch ein TImage und einen TButton auf dem Form. Beim TImage setzen wir das AutoSize auf true (damit es sich an die Bildgröße anpasst). Im ButtonClick-Event steht dann folgender Code:

Delphi-Quellcode:
begin
  Image1.Picture.Graphic := PngImageCollection1.Items[Tag].PngImage;
  Tag := Tag + 1;
  if Tag >= PngImageCollection1.Items.Count then
    Tag := 0;
end;
Mit jedem Button-Click wird nun das nächste Bild aus der Collection dargestellt.

Spectre 30. Jan 2013 00:27

AW: PNGImageList
 
danke für den tip!
habs grad so ausprobiert..allerdings sagt er mir beim compilieren beim TAG (dahin setzt er den cursor)

(Image1.Picture.Graphic := PngImageCollection1.Items[Tag].PngImage;) = Klasse besitzt keine Standarteigenschaft

:/

Popov 30. Jan 2013 00:31

AW: PNGImageList
 
Wie gesagt ich kenne die Komponente nicht, aber ich hab ein Beispiel gefunden wie eine Png eingefügt wird:

Delphi-Quellcode:
var
  png: TPngImageCollectionItem;
begin
  FPNGImageList := TPNGImageList.Create(Self);

  PNG := FPNGImageList.PngImages.Add;
  PNG.PngImage.LoadFromFile(GetIconDir + 'accept.png');
Daraus könnte man meinen, dass man in etwa so an die Image ran kommt

Delphi-Quellcode:
  PNG.PngImage[x];
  ..
Ist aber ins Blaue geschossen.

Andreas L. 30. Jan 2013 06:16

AW: PNGImageList
 
Zitat:

Zitat von Spectre (Beitrag 1201224)
hmm...mit "ImageList1.GetBitmap" komme ich nicht weit...sieht aus als hätte die Png komponente eigene befehle :S

Natürlich darfst du in deinem Code nicht ImageList1 schreiben wenn die PNG-Komponente auf deinem Formular den namen PngImageList1 hat :wink: Die Methode GetBitmap hat die PNG-Komponente nämlich...

Die PNGImageList ist übrigens (genau so wie der PNGButton) sehr buggy. Ich verwende deshalb immer die X²GraphicList (letzter Abschnitt des Artikels).

Uwe Raabe 30. Jan 2013 08:22

AW: PNGImageList
 
Zitat:

Zitat von Spectre (Beitrag 1201228)
..allerdings sagt er mir beim compilieren beim TAG (dahin setzt er den cursor)

(Image1.Picture.Graphic := PngImageCollection1.Items[Tag].PngImage;) = Klasse besitzt keine Standarteigenschaft

Welche Version der PngComponents setzt du denn ein und mit welcher Delphi-Version? Bei mir klappt das nachweisbar ohne Probleme.

Wenn deine Implementation noch kein Default für die Collection definiert, dann sollte es dieser Aufruf aber tun:

Delphi-Quellcode:
Image1.Picture.Graphic := PngImageCollection1.Items.Items[Tag].PngImage;

Uwe Raabe 30. Jan 2013 08:24

AW: PNGImageList
 
Zitat:

Zitat von Andreas L. (Beitrag 1201235)
Die PNGImageList ist übrigens (genau so wie der PNGButton) sehr buggy.

Kannst du da etwas mehr zu sagen? Interessiert mich halt...

Bernhard Geyer 30. Jan 2013 08:31

AW: PNGImageList
 
Zitat:

Zitat von Andreas L. (Beitrag 1201235)
Die PNGImageList ist übrigens (genau so wie der PNGButton) sehr buggy. Ich verwende deshalb immer die X²GraphicList (letzter Abschnitt des Artikels).

Ich verwende seit Jahren die ElPack/LMD-Komponenten die seit Jahren auch für ältere Delphi-Versionen eine durchgehende PNG-Unterstützung bieten.

Andreas L. 30. Jan 2013 08:32

AW: PNGImageList
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1201264)
Zitat:

Zitat von Andreas L. (Beitrag 1201235)
Die PNGImageList ist übrigens (genau so wie der PNGButton) sehr buggy.

Kannst du da etwas mehr zu sagen? Interessiert mich halt...

Es gibt Darstellungsfehler mit manchen Controls (Toolbars, ...) und die PNGCollection hat bei mir immer wieder Bilder verloren.

Uwe Raabe 30. Jan 2013 08:58

AW: PNGImageList
 
Zitat:

Zitat von Andreas L. (Beitrag 1201266)
Es gibt Darstellungsfehler mit manchen Controls (Toolbars, ...) und die PNGCollection hat bei mir immer wieder Bilder verloren.

Obwohl ich vermute, daß du sie nicht mehr einsetzt - solltest du mal sowas reproduzieren können, wäre ich dir dankbar, wenn du es mir zukommen lässt (PM).

Spectre 30. Jan 2013 11:56

AW: PNGImageList
 
Delphi 7 benutze ich. die png komponente ist von 2003..bischen älter.

ich hab mir mal die X2GraphicList runtergeladen und die x2graphiclist1 und den x2graphiccontainer1 aufs formular gelegt..bilder in die collection reingeladen und nen TImage + button plaziert...wenn ich..

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture := X2Graphiccontainer1.graphics[1].Picture;

end;
diesen code versuche gibts zwar keine fehlermeldung - aber ein bild wird auch nicht angezeigt :S

ich hatte es ursprünglich mit
Code:
Image1.Picture.graphic
probiert aber da gibts nen error bezüglich graphic und Timage

Spectre 30. Jan 2013 17:08

AW: PNGImageList
 
na kommt, ihr könnt das :D

ich möchte einfach nur via knopfdruck aus der png imagelist in ein Timage die bilder anzeigen lassen die ich zuvor in die liste geladen habe..ich kriegs ums verrecken nicht hin! sufu hat auch nicht wirklich was gebracht weil die meisten beispiele sich auf die Imagelist mit BITMAPS konzentrieren, irgendwie bin ich zu blöd für diese komponente..

würde sich jemand erbarmen mir nen beispiel code zu geben mit dem ich experimentieren kann oder nen kleine beispiel exe compilieren?

Ihr seid die besten!:-D

robin

Uwe Raabe 30. Jan 2013 19:03

AW: PNGImageList
 
Delphi-Quellcode:
Image1.Picture.Graphic := PngImageList1.PngImages.Items[0].PngImage;

Spectre 30. Jan 2013 20:08

AW: PNGImageList
 
Ich teste das gleich in ner stunde wenn ich zuhause bin, danke Uwe!!

Spectre 30. Jan 2013 21:39

AW: PNGImageList
 
Unabhängig davon ob ich die X2GraphicList oder die Pngimagelist verwende, bei

Code:
Image1.Picture.Graphic := PngImageCollection1.Items.Items[Tag].PngImage;
der zeile meldet er mir das pngimage als undefinierten bezeichner, obwohl ich diese 4 in der uses drin hab..: X2CLGraphicList, PngExtraEx,pngimage,uPngImageList; muss ich pngimage noch irgednwie anders klassifizieren? hier mal der ganze code...lach. lustig das man an so "kleinigkeiten" so festhängen kann ;D

hab nen button, nen Timage, ne PngImageList und eine TpngImageCollection auf der form.

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ImgList, X2CLGraphicList, PngExtraEx,pngimage,
  uPngImageList;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    PngImageList1: TPngImageList;
    collection: TPngImageCollection;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Graphic := collection.items.Items[0].pngimage;
end;

end.
danke für die geduld...wiedermal ;)
robin

Uwe Raabe 30. Jan 2013 21:44

AW: PNGImageList
 
Du solltest nur die Unit einbinden, von der du die PngImageList verwenden willst. Keine der vier von dir genannten gehört zu den PngComponents, auf die sich mein Code-Beispiel bezieht.

Spectre 30. Jan 2013 21:47

AW: PNGImageList
 
achso...ich habs grad geschafft mit:

Code:
Image1.Picture.Graphic := TPngImageCollectionItem(collection.Items.Items[1]).PngImage;
dat funktioniert. danke für die konstruktive hilfe! schönen abend :)

Popov 30. Jan 2013 21:59

AW: PNGImageList
 
Schön dass es nun klappt, trotz dem etwas ungewöhnlich.

Spectre 30. Jan 2013 22:26

AW: PNGImageList
 
Für die interessierten bzw falls irgendwann jemand das gleiche problem hat..die gleiche variante für den X2GraphicContainer sieht folgendermaßen aus..

Code:
Image1.Picture.Graphic := TX2GraphicCollectionItem(X2GraphicContainer1.Graphics[0]).picture.graphic;
HF

Popov 30. Jan 2013 22:38

AW: PNGImageList
 
Wie ich schon sagte, eher ungewöhnlich, denn x := y führt bei Objekte dazu, dass eigentlich die Adressen kopiert werden und nicht die Objekte. Im ersten Moment merkt man nichts, u. U. auch lange Zeit nichts, wenn man nichts freigibt. Trotzdem sieht mir das zu sehr nach Adressenkopieren aus. Das hier zeigt es ganz deutliche (siehe Grafik ganz unten): http://www.delphi-treff.de/object-pa...f-auf-objekte/

Ich schätze es geht auch anders.

uligerhardt 31. Jan 2013 07:22

AW: PNGImageList
 
Zitat:

Zitat von Popov (Beitrag 1201426)
Wie ich schon sagte, eher ungewöhnlich, denn x := y führt bei Objekte dazu, dass eigentlich die Adressen kopiert werden und nicht die Objekte.

Graphic ist aber keine Variable, sondern eine Property:
Delphi-Quellcode:
    property Graphic: TGraphic read FGraphic write SetGraphic;
und
Delphi-Quellcode:
Image1.Picture.Graphic := Blubb;
ist demzufolge das Gleiche wie
Delphi-Quellcode:
Image1.Picture.SetGraphic(Blubb);
, was u.a. ein Assign beinhaltet.

Popov 31. Jan 2013 07:48

AW: PNGImageList
 
Hast Recht, in dem Fall ist es so.

Uwe Raabe 31. Jan 2013 09:37

AW: PNGImageList
 
Zitat:

Zitat von Spectre (Beitrag 1201314)
Delphi 7 benutze ich. die png komponente ist von 2003..bischen älter.

Du kannst dir hier den aktuellen Stand herunterladen. Lass dich nicht vom Titel irritieren - die gehen auch mit Delphi 7. Du musst nur die PngImage-Dateien beibehalten, die du schon hast. Seit Delphi 2009 sind die in Delphi enthalten, deshalb sind sie bei den PngComponents nicht mehr dabei.

Popov 31. Jan 2013 10:05

AW: PNGImageList
 
Uwe, was machst du für Sachen. Ich hab gestern tatsächlich versucht die Komponente zu testen, fand sogar diese Seite und bin weg, wegen dem Titel.

Uwe Raabe 31. Jan 2013 21:44

AW: PNGImageList
 
Zitat:

Zitat von Popov (Beitrag 1201466)
Uwe, was machst du für Sachen. Ich hab gestern tatsächlich versucht die Komponente zu testen, fand sogar diese Seite und bin weg, wegen dem Titel.

Das hat rechtliche Gründe. Die originalen PngComponents kamen immer mit den PngImage-Units von Gustavo Daud, die ab D2009 aber zu Delphi gehören. Auf meine Anfrage, ob ich diese für ältere Delphi-Versionen weiterhin mit verbreiten dürfe, bekam ich leider keine Antwort. Da für mich somit die Rechtslage unklar war, habe ich die Units aus dem Package entfernt. Damit sind die PngComponents formell nicht unter D<2009 zu verwenden - es sei denn man hat noch oder kommt irgendwie an die PngImage-Units. Daher habe ich einen entsprechenden Hinweis im Text eingefügt.

Spectre 1. Feb 2013 22:20

AW: PNGImageList
 
Code:
Image1.Picture.Graphic := TX2GraphicCollectionItem(X2GraphicContainer1.Graphics[0]).picture.graphic;
funktioniert zwar mit normalen bildern, aber bei GIFs streikt die komponente ?
ich kann sie zwar in die collection laden samt vorschau, aber sie werden nicht angezeigt...wie löse ich das? hat jemand nen tip?!

danke!

Spectre 1. Feb 2013 22:26

AW: PNGImageList
 
Zitat:

Zitat von Spectre (Beitrag 1201717)
Code:
Image1.Picture.Graphic := TX2GraphicCollectionItem(X2GraphicContainer1.Graphics[0]).picture.graphic;
funktioniert zwar mit normalen bildern, aber bei GIFs streikt die komponente ?
ich kann sie zwar in die collection laden samt vorschau, aber sie werden nicht angezeigt...wie löse ich das? hat jemand nen tip?!

danke!


muss ich tatsächlich 53 Timages auf meine form legen wenn ich in afrika für jedes land animierte GIF flaggen anzeigen will? oder kann ich die auch irgendwie mit in die imagelist laden? :-/

sry konnte den vorigen beitrag nicht löschen

ich weiß ich könnte mit "LoadfromFile" arbeiten, ich möchte allerdings wenn das tool fertig ist möglichst nur die .exe zur verfügung stellen müssen und nicht nen haufen files die bearbeitet werden können...ich habe über ne .DLL nachgedacht mit der das evtl möglich wäre wenn ich die gifs da rein lade? kenne mich damit nicht wirklich aus aber wenn ihr mir das ans herz legt würde ich mich dll technisch reinarbeiten...vlt gibts ja andere wege das zu bewerkstelligen.

lg robin

Uwe Raabe 2. Feb 2013 11:20

AW: PNGImageList
 
Da du mittlerweile bei GIFs angekommen bist, die nun gar nichts mehr mit TPngImageList zu tun haben, würde ich dir empfehlen einen neuen Thread mit einem dazu passenden Titel zu starten. Dann sprichst du eventuell auch die Leute an, die sich damit auskennen.

Spectre 8. Feb 2013 00:45

AW: PNGImageList
 
ok, danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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