Delphi Can
Button Renk sorunu - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Button Renk sorunu (/showthread.php?tid=8307)



Button Renk sorunu - CesuR - 15-05-2026

VCL uygulamalarda speedbutton gibi bileşenlerin neden propertisinde color rengi yok anlamış değilim. Formdaki nesnelerin renklerini Delphi 7 de ne güzel basitçe değiştirebiliyorduk.  Rad Studio ise style desinger koymuş resmen ayrı bir dil oda. Arkadaş kolaylık yapacaklarına zorluk çıkarmışlar resmen..


Cvp: Button Renk sorunu - emailx45 - 16-05-2026

(15-05-2026, Saat: 00:35)CesuR Adlı Kullanıcıdan Alıntı: VCL uygulamalarda speedbutton gibi bileşenlerin neden propertisinde color rengi yok anlamış değilim. Formdaki nesnelerin renklerini Delphi 7 de ne güzel basitçe değiştirebiliyorduk.  Rad Studio ise style desinger koymuş resmen ayrı bir dil oda. Arkadaş kolaylık yapacaklarına zorluk çıkarmışlar resmen..

1) VCL kontrolleri tamamen MSWindows işletim sistemi kontrollerine dayanır, bu nedenle varsayılan olarak Object Pascal (Delphi) nesneleri değil, yalnızca orijinal işletim sistemi kontrollerini paketleyen bir "sarmalayıcı"dır. Stiller ve diğer "tuval" özellikleri kısıtlanmadığı ve serbestçe kullanılabildiği Delphi'de oluşturulan kontrollerin aksine.

2) Varsayılan olarak, Delphi sistemin stilini yakalamaya ve bunu kendi avantajına kullanmaya çalışır, ancak yerel MSWindows kontrolleri için son söz genellikle MSWindows'a aittir ve kullanıcının ekranında efekt ve renk "karnavalı" oluşturmaktan kaçınmak için kuralları katıdır.

3) Bununla birlikte, tüm TControl'ler için, temelde kontrolleri yeniden oluşturmanız veya Delphi temel sınıfında özel bir teknik kullanarak ortak davranışını yakalamanız veya değiştirmeniz gerekir.

4) Bunu yapmanın daha kolay bir yolu, örneğin TButton gibi standart sınıfa dayalı yeni bir sınıf (veya bileşen) oluşturmak ve bileşen penceresinin işletim sisteminden almayı beklediği yöntemleri veya mesajları değiştirmektir. Bu şekilde, bileşenin veya nesnenin davranışını değiştirebilirsiniz. Ancak, bunun kolay olmadığını hatırlatmalıyım, çünkü bileşene her zaman düzinelerce veya yüzlerce mesaj geliyor ve son olarak, Delphi stil yöneticisi, MSWindows, Linux, Android, macOS vb. işletim sisteminin dayattığı kurallara uymaya çalışıyor...

5) TButton'larla ilgili sorununuzu çözmek için, aşağıdaki gibi bazı yöntemlerin davranışını düzenleyebilir veya değiştirebilirsiniz:

private
{ Mesaj Kesicileri }

  private
    { Interceptadores de Mensagem }
    procedure CNDrawItem( var Message: TWMDrawItem ); message CN_DRAWITEM;
    procedure WMEraseBkgnd( var Message: TWMEraseBkgnd ); message WM_ERASEBKGND;
    procedure CMMouseEnter( var Message: TMessage ); message CM_MOUSEENTER;
    procedure CMMouseLeave( var Message: TMessage ); message CM_MOUSELEAVE;
    procedure WMSize( var Message: TWMSize ); message WM_SIZE;


korumalı
procedure CreateParams( var Params: TCreateParams ); override;
procedure SetButtonStyle( ADefault: Boolean ); override;

6) Bu şekilde, SetButtonStyle(...) yöntemini "sessize" edebilirsiniz, yani sınıftaki temel işlevi olmadan: düğmeyi biçimlendirmek!!!

7) Düğmenin tuvaline kendi stilinizi çizmek için yapabileceğiniz bir şey şöyledir. Başlangıçta, düğmeyi şu parametrelerle oluşturursunuz:

{ Win32 Mesajları }

procedure TBlueButton.CreateParams( var Params: TCreateParams );
begin
  inherited CreateParams( Params );
  Params.Style := Params.Style or BS_OWNERDRAW;
end;


procedure TBlueButton.SetButtonStyle( ADefault: Boolean );
begin
  // VCL'yi sessize alır
end;

8) Şimdi, düğmeyi istediğiniz gibi biçimlendirmek için yukarıdaki diğer yöntemleri kullanabilirsiniz: renk, kenarlıklar vb...

9) Örneğe bakın:


SOURCE CODE FULL


Cvp: Button Renk sorunu - CesuR - 19-05-2026

(16-05-2026, Saat: 05:53)emailx45 Adlı Kullanıcıdan Alıntı:
(15-05-2026, Saat: 00:35)CesuR Adlı Kullanıcıdan Alıntı: VCL uygulamalarda speedbutton gibi bileşenlerin neden propertisinde color rengi yok anlamış değilim. Formdaki nesnelerin renklerini Delphi 7 de ne güzel basitçe değiştirebiliyorduk.  Rad Studio ise style desinger koymuş resmen ayrı bir dil oda. Arkadaş kolaylık yapacaklarına zorluk çıkarmışlar resmen..

1) VCL kontrolleri tamamen MSWindows işletim sistemi kontrollerine dayanır, bu nedenle varsayılan olarak Object Pascal (Delphi) nesneleri değil, yalnızca orijinal işletim sistemi kontrollerini paketleyen bir "sarmalayıcı"dır. Stiller ve diğer "tuval" özellikleri kısıtlanmadığı ve serbestçe kullanılabildiği Delphi'de oluşturulan kontrollerin aksine.

2) Varsayılan olarak, Delphi sistemin stilini yakalamaya ve bunu kendi avantajına kullanmaya çalışır, ancak yerel MSWindows kontrolleri için son söz genellikle MSWindows'a aittir ve kullanıcının ekranında efekt ve renk "karnavalı" oluşturmaktan kaçınmak için kuralları katıdır.

3) Bununla birlikte, tüm TControl'ler için, temelde kontrolleri yeniden oluşturmanız veya Delphi temel sınıfında özel bir teknik kullanarak ortak davranışını yakalamanız veya değiştirmeniz gerekir.

4) Bunu yapmanın daha kolay bir yolu, örneğin TButton gibi standart sınıfa dayalı yeni bir sınıf (veya bileşen) oluşturmak ve bileşen penceresinin işletim sisteminden almayı beklediği yöntemleri veya mesajları değiştirmektir. Bu şekilde, bileşenin veya nesnenin davranışını değiştirebilirsiniz. Ancak, bunun kolay olmadığını hatırlatmalıyım, çünkü bileşene her zaman düzinelerce veya yüzlerce mesaj geliyor ve son olarak, Delphi stil yöneticisi, MSWindows, Linux, Android, macOS vb. işletim sisteminin dayattığı kurallara uymaya çalışıyor...

5) TButton'larla ilgili sorununuzu çözmek için, aşağıdaki gibi bazı yöntemlerin davranışını düzenleyebilir veya değiştirebilirsiniz:

private
{ Mesaj Kesicileri }

  private
    { Interceptadores de Mensagem }
    procedure CNDrawItem( var Message: TWMDrawItem ); message CN_DRAWITEM;
    procedure WMEraseBkgnd( var Message: TWMEraseBkgnd ); message WM_ERASEBKGND;
    procedure CMMouseEnter( var Message: TMessage ); message CM_MOUSEENTER;
    procedure CMMouseLeave( var Message: TMessage ); message CM_MOUSELEAVE;
    procedure WMSize( var Message: TWMSize ); message WM_SIZE;


korumalı
procedure CreateParams( var Params: TCreateParams ); override;
procedure SetButtonStyle( ADefault: Boolean ); override;

6) Bu şekilde, SetButtonStyle(...) yöntemini "sessize" edebilirsiniz, yani sınıftaki temel işlevi olmadan: düğmeyi biçimlendirmek!!!

7) Düğmenin tuvaline kendi stilinizi çizmek için yapabileceğiniz bir şey şöyledir. Başlangıçta, düğmeyi şu parametrelerle oluşturursunuz:

{ Win32 Mesajları }

procedure TBlueButton.CreateParams( var Params: TCreateParams );
begin
  inherited CreateParams( Params );
  Params.Style := Params.Style or BS_OWNERDRAW;
end;


procedure TBlueButton.SetButtonStyle( ADefault: Boolean );
begin
  // VCL'yi sessize alır
end;

8) Şimdi, düğmeyi istediğiniz gibi biçimlendirmek için yukarıdaki diğer yöntemleri kullanabilirsiniz: renk, kenarlıklar vb...

9) Örneğe bakın:

implementation

{$R *.dfm}

var
 LWidth : integer;
 LHeight: integer;
 FMeuBotaoAzul: TBlueButton;  // TBlueButton = class(TButton );  // .... changed using the "methods above" and much code for this ...

procedure TForm1.btnAumentarClick( Sender: TObject );
begin
 FMeuBotaoAzul.Width  := FMeuBotaoAzul.Width + LWidth;
 FMeuBotaoAzul.Height := FMeuBotaoAzul.Height + LHeight;
end;

procedure TForm1.btnDiminuirClick( Sender: TObject );
begin
 FMeuBotaoAzul.Width  := FMeuBotaoAzul.Width - LWidth;
 FMeuBotaoAzul.Height := FMeuBotaoAzul.Height - LHeight;
end;

procedure TForm1.btnHorizontAlignmentClick( Sender: TObject );
const
 C_Horizontal: array [ 0 .. 2 ] of TAlignment = ( TAlignment.taLeftJustify, TAlignment.taCenter, TAlignment.taRightJustify );
begin
 FMeuBotaoAzul.TextAlign := TAlignment( random( 3 ) );
end;

procedure TForm1.btnUse3DClick( Sender: TObject );
const
 C_Use3D: array [ boolean ] of TButtonLayoutOption = ( blFlat, bl3D );
begin
 FMeuBotaoAzul.ButtonLayout := TButtonLayoutOption( boolean( random( 2 ) ) );
end;

procedure TForm1.btnVerticalAligmentClick( Sender: TObject );
const
 C_Horizontal: array [ 0 .. 2 ] of TTextLayout = ( TTextLayout.tlTop, TTextLayout.tlCenter, TTextLayout.tlBottom );
begin
 FMeuBotaoAzul.TextLayout := TTextLayout( random( 3 ) );
end;

procedure TForm1.Button1Click( Sender: TObject );
begin
 FMeuBotaoAzul.Enabled := not FMeuBotaoAzul.Enabled;
end;

{ TButton }

procedure TForm1.FormCreate( Sender: TObject );
begin
 // StyleHook'u eklenmiş olan düğmemizi oluşturuyoruz.
 FMeuBotaoAzul        := TBlueButton.Create( Self );
 FMeuBotaoAzul.Parent := Self;                // Formun oluşturma ağacına ekler
 FMeuBotaoAzul.SetBounds( 400, 50, 200, 50 ); Konumlandırma
 FMeuBotaoAzul.Caption    := 'Processar Dados';
 FMeuBotaoAzul.Font.Size  := 14;
 FMeuBotaoAzul.Font.Style := [ fsBold ];
 FMeuBotaoAzul.OnClick    := MeuBotaoClick;
 //
 // ---> Yeni Hizalama Özellikleri <---
 FMeuBotaoAzul.TextAlign  := taLeftJustify; // taLeftJustify, taCenter, taRightJustify
 FMeuBotaoAzul.TextLayout := tlCenter;      // tlTop, tlCenter, tlBottom
 //
 FMeuBotaoAzul.DisabledImages     := ImageList1;
 FMeuBotaoAzul.DisabledImageIndex := 1;
 FMeuBotaoAzul.Images             := ImageList1;
 FMeuBotaoAzul.ImageIndex         := 5;
 //
 // Renk paletini Yeşil Düğme olarak değiştirir
 FMeuBotaoAzul.ColorNormal       := clGreen;
 FMeuBotaoAzul.ColorBorderNormal := clOlive;

 FMeuBotaoAzul.ColorHot       := RGB( 0, 180, 0 ); Fareyle üzerine gelindiğinde açık yeşil renk
 FMeuBotaoAzul.ColorBorderHot := clGreen;

 FMeuBotaoAzul.ColorPressed       := RGB( 0, 80, 0 ); Koyu Yeşil (Tıkla)
 FMeuBotaoAzul.ColorBorderPressed := RGB( 0, 50, 0 );
 //
 Klasik 3D görünümü etkinleştirin!
 FMeuBotaoAzul.ButtonLayout := bl3D;
 //
 LWidth  := Trunc( FMeuBotaoAzul.Width * 0.10 );
 LHeight := Trunc( FMeuBotaoAzul.Height * 0.10 );
 //
end;

procedure TForm1.MeuBotaoClick( Sender: TObject );
begin
 ShowMessage( 'Mavi renkli kanca kancayı yakaladı ve mükemmel çalıştı!' );
end;

{ Opções de Estilo Visual (Design) }
 TButtonLayoutOption = ( blFlat, bl3D );

 TBlueButton = class( TButton )
 private
   FMouseInControl     : Boolean;
   FProportionsCaptured: Boolean;
   FBaseBtnWidth       : Integer;
   FBaseBtnHeight      : Integer;

   { Alinhamento }
   FTextAlign : TAlignment;
   FTextLayout: TTextLayout;

   { Estilo Visual }
   FButtonLayout: TButtonLayoutOption;

   { Cores: Estado Normal }
   FColorNormal      : TColor;
   FColorBorderNormal: TColor;
   FColorTextNormal  : TColor;

   { Cores: Estado Hover (Mouse Over) }
   FColorHot      : TColor;
   FColorBorderHot: TColor;
   FColorTextHot  : TColor;

   { Cores: Estado Pressionado (Click) }
   FColorPressed      : TColor;
   FColorBorderPressed: TColor;
   FColorTextPressed  : TColor;

   { Cores: Estado Desabilitado }
   FColorDisabled      : TColor;
   FColorBorderDisabled: TColor;
   FColorTextDisabled  : TColor;

   procedure SetTextAlign( const Value: TAlignment );
   procedure SetTextLayout( const Value: TTextLayout );
   procedure SetButtonLayout( const Value: TButtonLayoutOption );

   { Setters de Cores }
   procedure SetColorNormal( const Value: TColor );
   procedure SetColorBorderNormal( const Value: TColor );
   procedure SetColorTextNormal( const Value: TColor );
   procedure SetColorHot( const Value: TColor );
   procedure SetColorBorderHot( const Value: TColor );
   procedure SetColorTextHot( const Value: TColor );
   procedure SetColorPressed( const Value: TColor );
   procedure SetColorBorderPressed( const Value: TColor );
   procedure SetColorTextPressed( const Value: TColor );
   procedure SetColorDisabled( const Value: TColor );
   procedure SetColorBorderDisabled( const Value: TColor );
   procedure SetColorTextDisabled( const Value: TColor );

   { Interceptadores de Mensagem }
   procedure CNDrawItem( var Message: TWMDrawItem ); message CN_DRAWITEM;
   procedure WMEraseBkgnd( var Message: TWMEraseBkgnd ); message WM_ERASEBKGND;
   procedure CMMouseEnter( var Message: TMessage ); message CM_MOUSEENTER;
   procedure CMMouseLeave( var Message: TMessage ); message CM_MOUSELEAVE;
   procedure WMSize( var Message: TWMSize ); message WM_SIZE;

 protected
   procedure CreateParams( var Params: TCreateParams ); override;
   procedure SetButtonStyle( ADefault: Boolean ); override;

 public
   constructor Create( AOwner: TComponent ); override;

 published
   { Propriedade de Estilo Visual }
   property  ButtonLayout: TButtonLayoutOption
     read    FButtonLayout
     write   SetButtonLayout
     default blFlat;

   { Propriedades de Alinhamento }
   property  TextAlign: TAlignment
     read    FTextAlign
     write   SetTextAlign
     default taLeftJustify;
   property  TextLayout: TTextLayout
     read    FTextLayout
     write   SetTextLayout
     default tlCenter;

   { Propriedades de Cores }
   property ColorNormal: TColor
     read   FColorNormal
     write  SetColorNormal;
   property ColorBorderNormal: TColor
     read   FColorBorderNormal
     write  SetColorBorderNormal;
   property ColorTextNormal: TColor
     read   FColorTextNormal
     write  SetColorTextNormal;
   property ColorHot: TColor
     read   FColorHot
     write  SetColorHot;
   property ColorBorderHot: TColor
     read   FColorBorderHot
     write  SetColorBorderHot;
   property ColorTextHot: TColor
     read   FColorTextHot
     write  SetColorTextHot;
   property ColorPressed: TColor
     read   FColorPressed
     write  SetColorPressed;
   property ColorBorderPressed: TColor
     read   FColorBorderPressed
     write  SetColorBorderPressed;
   property ColorTextPressed: TColor
     read   FColorTextPressed
     write  SetColorTextPressed;
   property ColorDisabled: TColor
     read   FColorDisabled
     write  SetColorDisabled;
   property ColorBorderDisabled: TColor
     read   FColorBorderDisabled
     write  SetColorBorderDisabled;
   property ColorTextDisabled: TColor
     read   FColorTextDisabled
     write  SetColorTextDisabled;
 end;

emeğine sağlık çok teşekkür ederim. Bu yaklaşımınız çok güzel fakat bir renk değiştirebilmek bu kadar zahmetli olması üzücü. Eski sürüm delphilerde bu daha kolaydı. Sorunumu tools menüsündeki bitmap desinger ile grafikleri düzenleyerek çözüme ulaştım. Ama sizin örneğinizide hemen deniyorum


Cvp: Button Renk sorunu - emailx45 - 21-05-2026

FULL SOURCE for Tests