AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SpeedButton - kein Bild?

Ein Thema von MarLe · begonnen am 29. Aug 2006 · letzter Beitrag vom 1. Sep 2006
Antwort Antwort
Seite 1 von 3  1 23      
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#1

SpeedButton - kein Bild?

  Alt 29. Aug 2006, 14:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: SpeedButton - kein Bild?

  Alt 29. Aug 2006, 15:30
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
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#3

Re: SpeedButton - kein Bild?

  Alt 29. Aug 2006, 15:41
Hab's so probiert, hat aber am Problem nicht's geändert, trotzdem Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: SpeedButton - kein Bild?

  Alt 29. Aug 2006, 16:02
So, hab mal fix was gebastelt

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
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#5

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 09:02
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;
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 14:15
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.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#7

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 14:20
Das kann ich jetzt so nicht bestätigen.
Ohne die Zeile

SpeedButton1.Glyph := nil; wird das letzte Bild über das erste gelegt, ich sehe also noch die Bildreste?!?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 14:23
Zitat von MarLe:
Das kann ich jetzt so nicht bestätigen.
Ohne die Zeile

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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#9

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 14:26
Ich würde Euch ja glauben, aber die Praxis zeigt mir noch Bildreste bei obigen Code?!?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: SpeedButton - kein Bild?

  Alt 30. Aug 2006, 14:31
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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