Fix TRibbon Bug
#1
السلام عليكم و رحمة الله و بركاته

مكون TRibbon الشهير الخاص بدلفي .. يحتوي على Bug عند تغيير الستايل الخاص ب TRibbon في وقت التنفيذ
كود :
http://delphinews.files.wordpress.com/2013/05/ribbon-bug.gif
كما تلاحظ بعد أن يتم تغيير الستايل الخاص TRibbon في وقت التنفيذ لا يتم اعادة رسم ال Page بالستايل الجديد

السبب : هو أنه لا يتم اعادة رسم ActivePage بعد تغيير الستايل , حتى ولو قمت باجبار TRibbon على اعادة الرسم .
PHP كود :
Ribbon1.Refresh

عندما يتم تغيير الستايل يتم اعادة رسم ال TRibbon و كل ال Childs الخاصة بها ماعدا الكلاس TCustomRibbonPage , فلا يتم اعادة رسمه .

الحل : يجب أن نقوم بعمل Refresh لل ActivePage
PHP كود :
unit RibbonFix;
Fix Bug when you change Ribbon Style }

interface

uses

{$IF CompilerVersion >= 23}
  
WinApi.MessagesVcl.Ribbon,
  
Vcl.RibbonStyleActnCtrls,
  
Vcl.RibbonLunaStyleActnCtrls;
{
$ELSE}
  
MessagesRibbonRibbonStyleActnCtrls,
  
RibbonLunaStyleActnCtrls;
{
$IFEND}

type
  TRibbon 
= class(Vcl.Ribbon.TRibbon)
  private

    
FCurrentStyleTRibbonStyleActionBars;
    function 
GetStyleTRibbonStyleActionBars;
    
procedure SetStyle(const ValueTRibbonStyleActionBars);

  
published
    property Style
TRibbonStyleActionBars read GetStyle write SetStyle;

  
end;

implementation

{ --------> By SMP3 <----------- }

function 
TRibbon.GetStyleTRibbonStyleActionBars;
begin
  
if (ActionManager <> nil) and (ActionManager.Style is TRibbonStyleActionBars)
  
then
    begin
      Result 
:= TRibbonStyleActionBars(ActionManager.Style);
    
end
  
else
    
begin
      Result 
:= RibbonLunaStyle;
      
SetStyle(Result);
    
end;
  if 
FCurrentStyle <> Result then
    Invalidate
;
  
FCurrentStyle := Result;
end;

procedure TRibbon.SetStyle(const ValueTRibbonStyleActionBars);
var
  
iinteger;
begin
  
if ActionManager <> nil then
    begin
      
if (Value nil) or not(Value is TRibbonStyleActionBarsthen
        ActionManager
.Style := RibbonLunaStyle
      
else
        
ActionManager.Style := Value;
      
// Force the recreation of the correct colormap for the selected style
      // SetColorMap(nil);
      
ColorMap := nil;
      
Invalidate;
      
DoGroupStyleChanged;
      
Parent.Perform(WM_NCPAINT00);

      for 
:= 0 to Tabs.Count do
        
Tabs.Items[i].Page.Refresh; { Refresh All Pages }

    
end;

end;

end

الآن كل ما عليك فعله هو ارفاق الوحدة RibbonFix في المشروع

ملاحظة : الوحدة RibbonFix يجب أن تكون مرفقة بعد وحدة Ribbon و ليس قبلها .
PHP كود :
uses Vcl.Ribbon,RibbonFix,... ; 

كود :
http://delphinews.files.wordpress.com/2013/05/ribbon-fix.gif


الردود في هذا الموضوع
Fix TRibbon Bug - بواسطة SMP3 - 09-05-2013, 07:39 PM

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


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف