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
|