Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Speedbutton Bitmap zur Laufzeit zuordnen (https://www.delphipraxis.net/193136-speedbutton-bitmap-zur-laufzeit-zuordnen.html)

Hobbycoder 25. Jun 2017 09:32

Speedbutton Bitmap zur Laufzeit zuordnen
 
Hi,

ich möchte etwas ganz simples machen (10.1 Berlin):

Delphi-Quellcode:
procedure Tfrm_textformattoolbox.FillBtnWithColor(color: TColor;
  btn: TSpeedButton);
var
  bmp: TBitmap;
begin
  bmp:=TBitmap.Create;
  try
    bmp.PixelFormat:= pf32Bit;
    bmp.SetSize(14, 14);
    bmp.Canvas.Brush.Color:=color;
    bmp.Canvas.Pen.Color:=color;
    bmp.Canvas.FillRect(Rect(0,0,bmp.Width+1,bmp.Height+1));
    btn.Glyph:=nil;
    btn.Glyph.Assign(bmp);
    btn.Refresh;
  finally
    bmp.Free;
  end;
end;
Sollte doch mal locker funktionieren. Speedbuttons Zeigen aber alle keine Bitmap an. Irgendwie steh ich so ein bischen auf dem Schlauch. Mache ich hier einen Fehler?
Die Bitmap wird richtig erzeugt, das habe mal mittels SaveToFile kontrolliert.

SneakyBagels 25. Jun 2017 09:38

AW: Speedbutton Bitmap zur Laufzeit zuordnen
 
So sieht die Lösung aus

Delphi-Quellcode:
 // mit einer ImageList
 ImageList1.GetBitmap(XYZ, btn.Glyph);

 // mit einem bitmap vermutlich so
 btn.Glyph := bmp;
Das
Delphi-Quellcode:
btn.Glyph:=nil;
kannst du übrigens weglassen.
Und
Delphi-Quellcode:
btn.Refresh;
braucht man auch nicht.

Wenn es dann nicht funktioniert stimmt vermutlich irgendwas mit deinem Bitmap nicht.

Hobbycoder 25. Jun 2017 09:46

AW: Speedbutton Bitmap zur Laufzeit zuordnen
 
das Glyph:=Nil und glyph.refresh hatte ich zu Testen gemacht.

Wenn ich glyph:=bmp verwende, dann kann ich aber bmp danach nicht freigeben.
In dem Fall müsste ich ja des alte glyph vorweg freigeben, damit mir keine Memoryleaks entstehen.

Was hat glyph.assign denn sonst für eine Funktion? Denn laut Hilfe ist Glyph ja ein TBitmap.

Hobbycoder 25. Jun 2017 10:11

AW: Speedbutton Bitmap zur Laufzeit zuordnen
 
also glyph:=bmp functioniert auch nicht.

was sollte an der bmp nicht in Ordnung sein?
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  bmp:=TBitmap.Create;
  try
    bmp.SetSize(14, 14);
    bmp.Canvas.Brush.Color:=color;
    bmp.Canvas.Pen.Color:=color;
    bmp.Canvas.FillRect(Rect(0,0,bmp.Width+1,bmp.Height+1));
    btn.Glyph.Assign(bmp);
  finally
    bmp.Free;
  end;
wird ganz normal aus der VCL erzeugt. Wie gesagt, wenn ich sie per SaveToFile mal abspeichere, sieht sie ganz normal aus.

Hobbycoder 25. Jun 2017 10:23

AW: Speedbutton Bitmap zur Laufzeit zuordnen
 
Fehler selbst gefunden.

Es lag an der bmp.TransparentColor. Da ich im Bmp auch den Pixel(0,0) mit der Farbe fülle,
nimmt der SpeedButten die Farbe des Pixel(0,0) als TransparentColor und zeichnet eben alles andere in dieser Farbe nicht mit. Und der der Rest die gleiche Farbe hat.... ;-)

Als Lösung habe ich halt folgendes gemacht:
Delphi-Quellcode:
    if color<>clFuchsia then bmp.TransparentColor:=clFuchsia else bmp.TransparentColor:=clMaroon;
Somit unterscheidet sich die TransparentColor auf jeden Fall von meiner Color auf Pixel(0,0) und das Rechteck wird auch gezeichnet.

Man hatte auch einfach einen andersfarbigen Rahmen Drumherum setzen können.

Danke dir aber für deine Zeit. Hattest also doch irgendwie recht, am ende lag es an der Bitmap ;-)


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