![]() |
SpeedButton - kein Bild?
Mit folgender Prozedur möchte ich auf einem SpeedButton ein Bild,
aus einer Anwendung, Verknüpfung etc. (Icon) anzeigen lassen (ohne eine Icon/Bitmap-Datei speichern zu müssen).
Delphi-Quellcode:
Der SpeedButton bleibt aber bildlos.
procedure TForm1.Button1Click(Sender: TObject);
var IconIndex: Word; ImageHandle: HIcon; TmpBMP: TBitmap; TmpIcon : TIcon; begin if Edit1.Text <> '' then begin IconIndex := 0; ImageHandle := ExtractAssociatedIcon(hInstance, PChar(Edit1.Text), IconIndex); if LongInt(ImageHandle) <> 0 then begin TmpBMP := TBitmap.Create; TmpIcon := Icon.Create; TmpBMP.Width := Icon.Width; TmpBMP.Height := Icon.Height; try TmpIcon.Handle := ImageHandle; TmpBMP.Canvas.Draw(0, 0, TmpIcon); SpeedButton1.Glyph.Handle := LoadBitmap(hInstance, PChar(TmpBMP)); finally TmpBMP.Free; TmpIcon.Free; end; Memo1.Lines.Add('Icon gefunden'); end else Memo1.Lines.Add('kein Icon gefunden'); end; end; Zu dem Thema hab ich schon einiges im Forum gelesen, mittlerweile hab ich schon so viel rumprobiert dass ich den Wald vor lauter Bäume nicht mehr sehe ;-))). vllt. hat auch jemand eine bessere (resourenschonende) Variante im Petto Gruss MarLe |
Re: SpeedButton - kein Bild?
Du setzt die Größe des Bitmaps auf die Größe des Icons, obwohl das Icon noch leer ist.
Versuche mal:
Delphi-Quellcode:
Bin mir nicht sicher, ob es dann klappt - aber evtl. könnte das die Lösung sein :roll:
TmpBMP := TBitmap.Create;
TmpIcon := Icon.Create; try TmpIcon.Handle := ImageHandle; //erst zuweisen TmpBMP.Width := Icon.Width; //dann die Größe anpassen TmpBMP.Height := Icon.Height; TmpBMP.Canvas.Draw(0, 0, TmpIcon); //usw. |
Re: SpeedButton - kein Bild?
Hab's so probiert, hat aber am Problem nicht's geändert, trotzdem Danke.
|
Re: SpeedButton - kein Bild?
So, hab mal fix was gebastelt :coder:
Ist es das, was Du suchst?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var ICO: TIcon; Large, Small: HIcon; begin ExtractIconEx(PChar(Edit1.Text), 0, Large, Small, 1); ICO := TIcon.Create; try ICO.Handle := Small; //oder Large, wenn du das große Symbol willst SpeedButton1.Glyph.Width := ICO.Width; SpeedButton1.Glyph.Height := ICO.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO); finally ICO.Free; end; end |
Re: SpeedButton - kein Bild?
War bisher immer der Meinung ich müsste ein Bitmap zuweisen?!?.
Da ich mich nicht nur auf EXE/DLL beschränken will verwende ich ExtractAssociatedIcon. Sinnvoll ist auch noch jeweils das Bild zurückzusetzen ansonsten überlappen sich die Bilder bei mehrmaliger Zuweisung. Super funktioniert Danke - anbei leicht geänderte Code für andere "Unwissende"
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var ICO: TIcon; Large, Small: HIcon; IconIndex: Word; begin ICO := TIcon.Create; try IconIndex := 0; ICO.Handle := ExtractAssociatedIcon(hInstance, PChar(Edit1.Text), IconIndex); SpeedButton1.Glyph := nil; SpeedButton1.Glyph.Width := ICO.Width; SpeedButton1.Glyph.Height := ICO.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO); finally ICO.Free; end; end; |
Re: SpeedButton - kein Bild?
Der Glyph eines SpeedButtons ist auch ein Bitmap.
Durch die Funktion Canvas.Draw kann allerdings jede beliebige Graphik auf den Glyph, also das Bitmap, gemalt werden - dies kann ein Icon, Bitmap, JPEG-Bild oder was auch immer sein. Dadurch wird auch die Zuweisung SpeedButton1.Glyph := nil; überflüssig, da das Bitmap mit Canvas.Draw komplett übermalt wird. Ein Überlappen kann nicht entstehen, da der Glyph - also das Bitmap - vorher auf die Größe des Icons gesetzt wurde. |
Re: SpeedButton - kein Bild?
Das kann ich jetzt so nicht bestätigen.
Ohne die Zeile
Delphi-Quellcode:
wird das letzte Bild über das erste gelegt, ich sehe also noch die Bildreste?!?
SpeedButton1.Glyph := nil;
|
Re: SpeedButton - kein Bild?
Zitat:
Gruß Neutral General |
Re: SpeedButton - kein Bild?
Ich würde Euch ja glauben, aber die Praxis zeigt mir noch Bildreste bei obigen Code?!?
|
Re: SpeedButton - kein Bild?
also ich kann sowieso kaum glauben, was ich hier sehe:
Delphi-Quellcode:
Man nillt einen Instanzenzeiger und greift dann darauf zu - halte ich für sehr gefährlich.
SpeedButton1.Glyph := nil;
SpeedButton1.Glyph.Width := ICO.Width; SpeedButton1.Glyph.Height := ICO.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO); Lieber so:
Delphi-Quellcode:
Damit hat man definitiv ein neues Bild als Glyph erstellt, und es sollte auch keine Bildreste geben, sobald man einmal Invlaidate/Refresh/Repaint aufgerufen hat.
SpeedButton1.Glyph := nil;
SpeedButton1.Glyph := TBitmap.Create; SpeedButton1.Glyph.Width := ICO.Width; SpeedButton1.Glyph.Height := ICO.Height; SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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