delphi4arab منتديات دلفي للعرب
Fix TButtonColor Bug – VCL Style - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : Fix TButtonColor Bug – VCL Style (/showthread.php?tid=4650)



Fix TButtonColor Bug – VCL Style - SMP3 - 19-10-2012

السلام عليكم و رحمة الله و بركاته

لقد قمت اليوم بابلاغ ال Quality Central ب Bug اكتشفتها في مكون TButtonColor , ال Bug تظهر عندما يتم تفعيل ال VCL Style .

هذا مظهر العادي للمكون بدون ال VCL Style
كود :
http://delphinews.files.wordpress.com/2012/10/buttoncolor1.png
بعد اضافة ال VCL STYLE
كود :
http://delphinews.files.wordpress.com/2012/10/vclbuttoncolor1.png
كما تلاحظ فأن المكون TButtonColor لا يظهر أي ألوان (مثل ال Button العادي)

السبب : يعود السبب على حسب تحليلاتي , أن المكون TButtonColor مسجل من المكون TButton بدون أي تعديلات ..

PHP كود :
TStyleManager.Engine.RegisterStyleHook(TButtonColor, TButtonStyleHook); 
للأسف فلم أستطع التعمق كثيرا لاني لا أملك السورس الخاص ب TButtonColor

الحل : كحل أولي اعتمدنه في حل المشكلة هو كتابة StyleHook ,
لكن للأسف فمكون TButtonColor لا يحتوي على StyleHook خاص به (TButtonColorStyleHook),

لذلك سنقوم بكتابة ال StyleHook انطلاقا من TButtonStyleHook
PHP كود :
(*
 
Fix TButtonColor Bug when enabling VCL Style
 VCLButtonColorFix by 
.::. SMP3 .::.
 
My Blog : DelphiNews.WordPress.Com


*)
unit VCLButtonColorFix;

interface
uses
WinApi
.Windows,Vcl.StdCtrls,VCL.Graphics,VCL.Themes,VCL.Styles,VCLTee.TeCanvas;

type
 TButtonColorStyleHookFix 
= class(TButtonStyleHook)
 protected
 
procedure Paint(Canvas: TCanvas); override;
 
end;
// to access to all TButton fields such : SymboleRectangle
TButtonColor =class(VCLTee.TeCanvas.TButtonColor);

implementation
 procedure TButtonColorStyleHookFix
.Paint(Canvas: TCanvas);
var
 
ThemeDetails : TThemedElementDetails;
 
sButtonColor:TButtonColor;
 
sRect:TRect;
 
sStyle : TCustomStyleServices;

begin

sStyle
:=StyleServices;
if 
sStyle.IsSystemStyle then exit;

sButtonColor:=TButtonColor(Control);

if 
FPressed then
ThemeDetails 
:= sStyle.GetElementDetails(tbPushButtonPressed)
else
if 
MouseInControl then
ThemeDetails 
:= sStyle.GetElementDetails(tbPushButtonHot)
else
if 
Focused then
ThemeDetails 
:= sStyle.GetElementDetails(tbPushButtonDefaulted)
else
if 
Self.Control.Enabled then
ThemeDetails 
:= sStyle.GetElementDetails(tbPushButtonNormal)
else
ThemeDetails := sStyle.GetElementDetails(tbPushButtonDisabled);

sStyle.DrawElement(Canvas.Handle, ThemeDetails, Control.ClientRect );

sRect:=Control.ClientRect ;
// Draw Text
sStyle.DrawText(Canvas.Handle, ThemeDetails, self.Text ,sRect , [tfCenter, tfSingleLine, tfVerticalCenter]);

Canvas.Brush.Color := sButtonColor.SymbolColor ;
Canvas.Pen.Color := clBlack;
// Draw Color Rectangle
canvas.Rectangle(sButtonColor.SymbolRectangle) ;

//canvas.FillRect(sButtonColor.SymbolRectangle );

end;
initialization
 
// Register The new Style for TButtonColor (The Fix)
TStyleManager.Engine.RegisterStyleHook(TButtonColor, TButtonColorStyleHookFix);

end. 
الآن كل ما عليك القيام به هو ارفاق VCLButtonColorFix

PHP كود :
uses VCLButtonColorFix; 
النتيجة :
كود :
http://delphinews.files.wordpress.com/2012/10/buttoncolorfix.png



Fix TButtonColor Bug – VCL Style - Virus.Clown - 10-09-2013

الله يعطيك العافية

اضافة جميلة لتزين المشاريع