Fix TButtonColor Bug – VCL Style
#1
السلام عليكم و رحمة الله و بركاته

لقد قمت اليوم بابلاغ ال 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(TButtonColorTButtonStyleHook); 
للأسف فلم أستطع التعمق كثيرا لاني لا أملك السورس الخاص ب 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(CanvasTCanvas); override;
 
end;
// to access to all TButton fields such : SymboleRectangle
TButtonColor =class(VCLTee.TeCanvas.TButtonColor);

implementation
 procedure TButtonColorStyleHookFix
.Paint(CanvasTCanvas);
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.HandleThemeDetailsControl.ClientRect );

sRect:=Control.ClientRect ;
// Draw Text
sStyle.DrawText(Canvas.HandleThemeDetailsself.Text ,sRect , [tfCentertfSingleLinetfVerticalCenter]);

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(TButtonColorTButtonColorStyleHookFix);

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

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


الملفات المرفقة
.rar   TButtonColorFix.rar (الحجم : 202.71 ك ب / التحميلات : 56)
الرد
#2
الله يعطيك العافية

اضافة جميلة لتزين المشاريع
طالب جديد لديكم Smile
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم