Ich glaub jetzt habe ich die Lösung:
Das mit der "miesen Bildqualität" liegt wohl am Alpha-Kanal der 32 Bit-Icons - das von dem alten Icon noch Reste übrig waren wenn ein neues drübergemalt wurde, liegt an der Transparenz der Icons.
Da ein leeres Bitmap immer weiß ist, bleiben die Stellen wo eine Halbtransparenz beim Alpha-Kanal des Icons ist, beim Bitmap weiß.
Lösung:
Einfach das Bitmap vorher komplett in die Farbe der Form (clBtnFace) einfärben, so wird als transparente Farbe clBtnFace verwendet und nicht mehr weiß.
Der Alpha-Kanal wird nun mit clBtnFace und nicht mehr in weiß dargestellt.
Des Weiteren verschwindet durch das Einfärben in clBtnFace das alte Bitmap komplett und es bleiben keine Reste mehr.
Somit wird die Zuweisung des Bitmaps auf NIL oder das Setzen der Größe des Bitmaps (Width und Height) auf 0 überflüssig.
Außerdem kannst Du die nicht verwendeten Variablen
Large, Small: HIcon; logischerweise weglassen.
So sähe es dann aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
ICO: TIcon;
IconIndex: Word;
buf: array[0..max_path] of Char;
begin
ICO := TIcon.Create;
try
StrPCopy(buf, Edit1.Text);
IconIndex := 0;
ICO.Handle := ExtractAssociatedIcon(hInstance, buf, IconIndex);
SpeedButton1.Glyph.Width := ICO.Width;
SpeedButton1.Glyph.Height := ICO.Height;
SpeedButton1.Glyph.Canvas.Brush.Color := Color; //Farbe der Form
SpeedButton1.Glyph.Canvas.FillRect(Rect(0, 0, SpeedButton1.Glyph.Width, SpeedButton1.Glyph.Height)); //Bitmap füllen
SpeedButton1.Glyph.Canvas.Draw(0, 0, ICO);
finally
ICO.Free;
end;
end;
... und Bild wieder entfernen:
Delphi-Quellcode:
procedure TForm1.ButtonResetClick(Sender: TObject);
begin
SpeedButton1.Glyph.Canvas.Brush.Color := Color;
SpeedButton1.Glyph.Canvas.FillRect(Rect(0, 0, SpeedButton1.Glyph.Width, SpeedButton1.Glyph.Height));
end;