Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Button einfärben


Hannoi - Mo 08.11.10 11:37
Titel: Button einfärben
Hallo Leute,

mein Taschenrechner (geschrieben in Delphi) kann alle 4 Grundrechenarten. Ich würde nun sehr gerne den Button ( Operator ) einfärben wenn ich ihn verwendet habe. Also wenn ich Plus gedrückt habe soll der Plus Button z.B. rot sein. Wenn ich dann aber z.B auf Minus drücke soll der Minus Button Rot eingefärbt werden und der Plus Button wieder normal sein.

Lg Hannoi


Gausi - Mo 08.11.10 11:42

Mit dem normalen TButton geht das nicht. Du könntest aber andere Button-Komponenten verwenden, z.B. den SpeedButton (evtl. heißt der leicht anders). Der hat iirc eine Down-Eigenschaft, die für solche Sachen gedacht ist.


Gerd Kayser - Mo 08.11.10 11:51

user profile iconHannoi hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde nun sehr gerne den Button ( Operator ) einfärben wenn ich ihn verwendet habe.
Falls Du SpeedButtons verwendest:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TMainform.SpeedButton1Click(Sender: TObject);
begin
  if SpeedButton1.Font.Color = clBlack then
    SpeedButton1.Font.Color := clRed
  else
    SpeedButton1.Font.Color := clBlack;
  ...  // weitere Aktionen
end;
Alternativ könntest Du auch mit verschiedenen Images (Glyphs) arbeiten.


bummi - Mo 08.11.10 11:59

und die anderen zurücksetzen, PSEUDOCODE:

Delphi-Quelltext
1:
2:
3:
4:
5:
for i := ?? to ?? do
  begin
         s := TSpeedbutton(FindComponent('AktionsButton' + IntToStr(i)));
         if s <> Sender then Farbe zurücksetzen
        end;


Hannoi - Mo 08.11.10 12:03

Das ist auch alles ok so, aber ich möchte nicht die Schriftfarbe ändern! Ich möchte den Button einfärben, die schriftfarbe soll schwarz bleiben. Das graue feld darum soll eine andere Farbe kriegen.


Gerd Kayser - Mo 08.11.10 12:16

user profile iconHannoi hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte nicht die Schriftfarbe ändern! Ich möchte den Button einfärben, die schriftfarbe soll schwarz bleiben. Das graue feld darum soll eine andere Farbe kriegen.
Daß ein TButton das nicht kann, wurde Dir bereits gesagt. Und ich hatte geschrieben, daß man bei SpeedButtons alternativ mit Images arbeiten kann.


Hannoi - Mo 08.11.10 12:18

Ok, aber wie genau verwende ich ein Image bzw. hat dies dann auch die Funktion immer nur wenn der Button verwendet wird die farbe zu ändern?


bummi - Mo 08.11.10 12:27

wenn Du TSpeedbutton verwendest und Dich reinwurstel und basteln willst hier eine kleine Vorlage (muß ausgebaut werden)

Tag beim OnClick zwischen 0 und 1 toggeln...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
type
  TSpeedbutton=Class(Buttons.TSpeedbutton)
    public
    Procedure paint;override;
  End;
  TForm1 = class(TForm)
    Button1: TButton;
    SpeedButton1: TSpeedButton;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TSpeedbutton.paint;
var
  PaintRect:Trect;
  s : String;
begin
  if Tag=1 then
    begin
  PaintRect := Rect(0, 0, Width, Height);
  Canvas.Brush.Style := bsSolid;
  Canvas.Brush.Color := clLime;
  Canvas.FillRect(PaintRect);
  s := caption;
  Inflaterect(PaintRect,-10,-10);
  canvas.TextRect(PaintRect,s,[tfCenter,tfVerticalCenter]);
    end
 else
    begin
      inherited;
    end;
end;


Gerd Kayser - Mo 08.11.10 12:51

user profile iconHannoi hat folgendes geschrieben Zum zitierten Posting springen:
Ok, aber wie genau verwende ich ein Image bzw. hat dies dann auch die Funktion immer nur wenn der Button verwendet wird die farbe zu ändern?
Wenn Du die Bildchen in eine RES-Datei gepackt hast, z. B. so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TMainform.SpeedButton1Click(Sender: TObject);
begin
  if BildNr =  1 then
    begin
      SpeedButton1.Glyph.LoadFromResourceName(HInstance, 'BMP2');
      BildNr := 2;
    end
  else
    begin
      SpeedButton1.Glyph.LoadFromResourceName(HInstance, 'BMP1');
      BildNr := 1;
    end;
end;
BildNr ist hier eine globale Integer-Variable.
Ich habe vorhin gesehen, daß die TLMDSpeedButtons der LMD-Tools auch ohne Bildchen ihre Farbe ändern können. Dazu muß bei diesen SpeedButtons die Eigenschaft CtlXP im Objektinspektor auf false gesetzt sein.
Die LMD-Tools (Freeware-Edition) kannst Du hier laden (falls sie nicht bei Deiner Delphi-Version dabei waren): http://www.lmdinnovative.com/download/index.php#LMD


Delete - Mo 08.11.10 14:30

Hier gibt's was:
http://delphi.about.com/library/weekly/aa061104a.htm
http://delphi.about.com/library/weekly/code/colorbutton.zip