Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SpeedButton - kein Bild? (https://www.delphipraxis.net/76069-speedbutton-kein-bild.html)

MarLe 29. Aug 2006 13:48


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:
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;
Der SpeedButton bleibt aber bildlos.
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

Martin K 29. Aug 2006 14:30

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:
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.
Bin mir nicht sicher, ob es dann klappt - aber evtl. könnte das die Lösung sein :roll:

MarLe 29. Aug 2006 14:41

Re: SpeedButton - kein Bild?
 
Hab's so probiert, hat aber am Problem nicht's geändert, trotzdem Danke.

Martin K 29. Aug 2006 15:02

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

MarLe 30. Aug 2006 08:02

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;

Martin K 30. Aug 2006 13:15

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.

MarLe 30. Aug 2006 13:20

Re: SpeedButton - kein Bild?
 
Das kann ich jetzt so nicht bestätigen.
Ohne die Zeile

Delphi-Quellcode:
SpeedButton1.Glyph := nil;
wird das letzte Bild über das erste gelegt, ich sehe also noch die Bildreste?!?

Neutral General 30. Aug 2006 13:23

Re: SpeedButton - kein Bild?
 
Zitat:

Zitat von MarLe
Das kann ich jetzt so nicht bestätigen.
Ohne die Zeile

Delphi-Quellcode:
SpeedButton1.Glyph := nil;
wird das letzte Bild über das erste gelegt, ich sehe also noch die Bildreste?!?

Nein es entstehen keine Bildreste. Das ist das gleich, wie wenn du eine Datei ausschneidest, in einen Ordner reinkopierst wo schon eine Datei mit dem Namen ist und du ersetzen klickst.. Danach ist auch nichts mehr von der alten Datei übrig und du musst sie auch nicht vorher löschen ;)

Gruß
Neutral General

MarLe 30. Aug 2006 13:26

Re: SpeedButton - kein Bild?
 
Ich würde Euch ja glauben, aber die Praxis zeigt mir noch Bildreste bei obigen Code?!?

DGL-luke 30. Aug 2006 13:31

Re: SpeedButton - kein Bild?
 
also ich kann sowieso kaum glauben, was ich hier sehe:

Delphi-Quellcode:
    SpeedButton1.Glyph := nil;
    SpeedButton1.Glyph.Width := ICO.Width;
    SpeedButton1.Glyph.Height := ICO.Height;
    SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO);
Man nillt einen Instanzenzeiger und greift dann darauf zu - halte ich für sehr gefährlich.
Lieber so:

Delphi-Quellcode:
    SpeedButton1.Glyph := nil;
    SpeedButton1.Glyph := TBitmap.Create;
    SpeedButton1.Glyph.Width := ICO.Width;
    SpeedButton1.Glyph.Height := ICO.Height;
    SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO);
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Seite 1 von 3  1 23      

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