19-10-2012, 09:07 AM
السلام عليكم و رحمة الله و بركاته
لقد قمت اليوم بابلاغ ال Quality Central ب Bug اكتشفتها في مكون TButtonColor , ال Bug تظهر عندما يتم تفعيل ال VCL Style .
هذا مظهر العادي للمكون بدون ال VCL Style
بعد اضافة ال VCL STYLE
كما تلاحظ فأن المكون TButtonColor لا يظهر أي ألوان (مثل ال Button العادي)
السبب : يعود السبب على حسب تحليلاتي , أن المكون TButtonColor مسجل من المكون TButton بدون أي تعديلات ..
للأسف فلم أستطع التعمق كثيرا لاني لا أملك السورس الخاص ب TButtonColor
الحل : كحل أولي اعتمدنه في حل المشكلة هو كتابة StyleHook ,
لكن للأسف فمكون TButtonColor لا يحتوي على StyleHook خاص به (TButtonColorStyleHook),
لذلك سنقوم بكتابة ال StyleHook انطلاقا من TButtonStyleHook
الآن كل ما عليك القيام به هو ارفاق VCLButtonColorFix
النتيجة :
لقد قمت اليوم بابلاغ ال Quality Central ب Bug اكتشفتها في مكون TButtonColor , ال Bug تظهر عندما يتم تفعيل ال VCL Style .
هذا مظهر العادي للمكون بدون ال VCL Style
كود :
http://delphinews.files.wordpress.com/2012/10/buttoncolor1.png
كود :
http://delphinews.files.wordpress.com/2012/10/vclbuttoncolor1.png
السبب : يعود السبب على حسب تحليلاتي , أن المكون TButtonColor مسجل من المكون TButton بدون أي تعديلات ..
PHP كود :
TStyleManager.Engine.RegisterStyleHook(TButtonColor, TButtonStyleHook);
الحل : كحل أولي اعتمدنه في حل المشكلة هو كتابة 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.
PHP كود :
uses VCLButtonColorFix;
كود :
http://delphinews.files.wordpress.com/2012/10/buttoncolorfix.png