解决Raize日历控件显示的问题

近自己的程序被测试人员发现一个小问题,就是程序中的日历选择框,显示中的“星期一、星期二。。。。”都显示成了“星。。。。。”,我自己看了代码,原来是raize的控件问题,并且无论用4.x版本还是5.x版本,问题都依然存在。没办法,就在网上找找看,结果还是找到了,原来需要修改下源代码文件:
修改:RzPopups.pas,该文件在raize目录下的source子目录,修改其中的procedure TRzCalendar.Paint这个过程,下面是修改后的代码:

procedure TRzCalendar.Paint;
var
S, S2, F: string;
R, WR, SelRect, DaysRect, DayR: TRect;
I, J, WN, Offset, MaxLen, SaveFontSize: Integer;
DrawDate: TDateTime;
Year, Month, Day, ViewMonth, ViewYear: Word;
DayColor, DayFontColor, TempC, C: TColor;
DayFontStyle: TFontStyles;
CustomDayFormat: Boolean;
PMBoldDays, NMBoldDays, CMBoldDays, BoldDaysMask: Cardinal;
ArrowFont: TFont;
ButtonsVisible, DrawFlat: Boolean;
Areas: TRzCalendarAreas; procedure DrawHorizontalLine( ALeft, ARight, AHeight: Integer );
var
ElementDetails: TThemedElementDetails;
begin
if FThemeAware and ThemeServices.ThemesEnabled then
begin
ElementDetails := ThemeServices.GetElementDetails( ttbSeparatorVertNormal );
ThemeServices.DrawElement( Canvas.Handle, ElementDetails, Rect( ALeft, AHeight, ARight, AHeight + ) );
end
else
begin
Canvas.Pen.Color := FCalendarColors.Lines;
Canvas.MoveTo( ALeft, AHeight );
Canvas.LineTo( ARight, AHeight );
end;
end; procedure DrawVerticalLine( ATop, ABottom, ALeft: Integer );
var
ElementDetails: TThemedElementDetails;
begin
if FThemeAware and ThemeServices.ThemesEnabled then
begin
ElementDetails := ThemeServices.GetElementDetails( ttbSeparatorNormal );
ThemeServices.DrawElement( Canvas.Handle, ElementDetails, Rect( ALeft, ATop, ALeft + , ABottom ) );
end
else
begin
Canvas.Pen.Color := FCalendarColors.Lines;
Canvas.MoveTo( ALeft, ATop );
Canvas.LineTo( ALeft, ABottom );
end;
end;
begin {= TRzCalendar.Paint =}
if FThemeAware and ThemeServices.ThemesEnabled then
begin
C := GetXPThemeColor( xptcEditBorder );
R := DrawBox( Canvas, ClientRect, C );
Canvas.Brush.Color := Color;
Canvas.FillRect( R );
end
else
inherited;
DrawFlat := BorderOuter in [ fsFlat, fsFlatBold, fsFlatRounded ];
CalcAreas( Areas );
// Draw Month and Year Bar
if ( [ ceMonth, ceYear ] * FElements ) <> [ ] then
begin
if FShowDays then
begin
R := Areas[ caYear ];
if FThemeAware and ThemeServices.ThemesEnabled then
begin
GetGradientPanelColors( gcsMSOffice, TempC, C );
end
else
begin
if not DrawFlat then
R := DrawBorder( Canvas, R, fsPopup );
C := FButtonColor;
end;
Canvas.Brush.Color := C;
Canvas.FillRect( R );
end;
SetBkMode( Canvas.Handle, Windows.Transparent );
if ceArrows in FElements then
begin
ArrowFont := TFont.Create;
try
ArrowFont.Name := 'Marlett';
ArrowFont.Size := Font.Size + ;
Canvas.Font.Assign( ArrowFont );
finally
ArrowFont.Free;
end;
DrawStringCentered( Canvas, '', Areas[ caLeftArrow ] ); // Draw Left Arrow
DrawStringCentered( Canvas, '', Areas[ caRightArrow ] ); // Draw Right Arrow
end;
// Draw month and year
Canvas.Font.Assign( Font );
Canvas.Font.Color := FButtonFontColor;
F := 'mmmm';
if ceYear in FElements then
F := F + ' yyyy';
DrawStringCentered( Canvas, FormatDateTime( F, ViewDate ), Areas[ caYear ] );
end;
if FShowDays then
begin
ButtonsVisible := False;
// Draw Today button
if ceTodayButton in FElements then
begin
if FCaptionTodayBtn <> '' then
S := FCaptionTodayBtn
else
S := '今日';
DrawButton( Canvas, Areas[ caTodayButton ], S,
FButtonColor, FButtonFontColor, DrawFlat,
( FPressedArea = caTodayButton ) and ( FOverArea = caTodayButton ),
FThemeAware );
ButtonsVisible := True;
end;
// Draw Clear Button
if ceClearButton in FElements then
begin
if FCaptionClearBtn <> '' then
S := FCaptionClearBtn
else
S := '清除';
DrawButton( Canvas, Areas[ caClearButton ], S,
FButtonColor, FButtonFontColor, DrawFlat,
( FPressedArea = caClearButton ) and ( FOverArea = caClearButton ),
FThemeAware );
ButtonsVisible := True;
end;
// Draw Day of Week Headings
if ceDaysOfWeek in FElements then
begin
Canvas.Brush.Color := Color;
Canvas.Font.Color := FCalendarColors.DaysOfWeek;
SaveFontSize := Canvas.Font.Size;
Canvas.Font.Size := SaveFontSize - ;
R := Bounds( Areas[ caDaysOfWeek ].Left, Areas[ caDaysOfWeek ].Top - ,
FCellSize.X - , FCellSize.Y );
MaxLen := GetMaxShortDayNameLength;
for I := to do
begin
J := FFirstDay + I + ;
if J > then
Dec( J, );
S := ShortDayNames[ J ];
if j= then s:='日';
if j= then s:='一';
if j= then s:='二';
if j= then s:='三';
if j= then s:='四';
if j= then s:='五';
if j= then s:='六';
if MaxLen > ( R.Right - R.Left ) then
begin
if SysLocale.DefaultLCID <> $040D then
S2 := Copy( S, , )
else // Hebrew - Day name abbreviations handled differently
begin
if Length( S ) >= then
S2 := S[ ]
else
S2 := S[ ];
end;
if Canvas.TextWidth( S2 ) > ( R.Right - R.Left ) then
DrawString( Canvas, S2[ ], R, dt_VCenter or dt_SingleLine or dt_Right or dt_NoClip )
else
DrawString( Canvas, S2, R, dt_VCenter or dt_SingleLine or dt_Right or dt_NoClip )
end
else
DrawString( Canvas, S, R, dt_VCenter or dt_SingleLine or dt_Right or dt_NoClip );
OffsetRect( R, FCellSize.X, );
end;
Canvas.Font.Size := SaveFontSize;
if ceWeekNumbers in FElements then
begin
if FThemeAware and ThemeServices.ThemesEnabled then
Offset :=
else
Offset := ;
DrawHorizontalLine( Areas[ caWeekNumbers ].Right - Offset, Areas[ caDaysOfWeek ].Right, R.Bottom );
end
else
DrawHorizontalLine( Areas[ caDaysOfWeek ].Left, Areas[ caDaysOfWeek ].Right, R.Bottom );
end;
// Draw Days
DaysRect := Areas[ caDays ];
CMBoldDays := ; // Current Month
PMBoldDays := ; // Previous Month
NMBoldDays := ; // Next Month
DecodeDate( FViewDate, ViewYear, ViewMonth, Day );
GetBoldDays( ViewYear, ViewMonth, CMBoldDays );
if ceFillDays in FElements then
begin
DecodeDate( IncMonth( FViewDate, - ), Year, Month, Day );
GetBoldDays( Year, Month, PMBoldDays );
DecodeDate( IncMonth( FViewDate, ), Year, Month, Day );
GetBoldDays( Year, Month, NMBoldDays );
end;
if ceWeekNumbers in FElements then
begin
Canvas.Pen.Color := FCalendarColors.DaysOfWeek;
if FThemeAware and ThemeServices.ThemesEnabled then
Offset :=
else
Offset := ;
DrawVerticalLine( Areas[ caWeekNumbers ].Top - Offset, Areas[ caWeekNumbers ].Bottom + Offset, Areas[ caWeekNumbers ].Right - );
end;
R := Bounds( DaysRect.Left, DaysRect.Top - , FCellSize.X - , FCellSize.Y );
WR := Areas[ caWeekNumbers ];
Inc( WR.Top, );
WR.Bottom := WR.Top + FCellSize.Y;
Dec( WR.Right, );
DrawDate := FFirstDateInGrid;
for I := to do
begin
for J := to do
begin
DecodeDate( DrawDate, Year, Month, Day );
DayColor := Color;
DayFontStyle := [];
if ( Month = ViewMonth ) and ( Year = ViewYear ) then
begin
DayFontColor := FCalendarColors.Days;
BoldDaysMask := CMBoldDays;
end
else
begin
DayFontColor := FCalendarColors.FillDays;
if EncodeDate( Year, Month, ) > EncodeDate( ViewYear, ViewMonth, ) then
BoldDaysMask := NMBoldDays
else
BoldDaysMask := PMBoldDays;
end;
if ( ( ceFillDays in FElements ) or ( Month = ViewMonth ) ) then
begin
// Determine Day Color
CustomDayFormat := GetDayFormat( DrawDate, Year, Month, Day,
DayColor, DayFontColor, DayFontStyle );
Canvas.Font.Color := DayFontColor;
Canvas.Font.Style := DayFontStyle;
Canvas.Brush.Color := DayColor;
if ColorToRGB( DayColor ) <> ColorToRGB( Color ) then
begin
DayR := R;
Inc( DayR.Right, );
Canvas.FillRect( DayR );
end;
if not CustomDayFormat then
begin
// if not using a CustomDayFormat, then go ahead and apply BoldDaysMask
if ( BoldDaysMask and ( $ shl ( Day - ) ) ) = then
Canvas.Font.Style := Canvas.Font.Style - [ fsBold ]
else
Canvas.Font.Style := Canvas.Font.Style + [ fsBold ];
end;
if DrawDate = Trunc( FDate ) then
begin
// Highlight selected Date
SelRect := R;
Inc( SelRect.Right, );
Canvas.Font.Color := FCalendarColors.SelectedDateFore;
Canvas.Brush.Color := FCalendarColors.SelectedDateBack;
FillRect( Canvas.Handle, SelRect, Canvas.Brush.Handle );
if Focused then
Canvas.DrawFocusRect( SelRect );
end;
DrawString( Canvas, IntToStr( Day ), R, dt_VCenter or dt_SingleLine or dt_Right or dt_NoClip );
if DrawDate = Trunc( SysUtils.Date ) then
begin
// Highlight Today's date
Canvas.Pen.Color := FCalendarColors.TodaysDateFrame;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle( R.Left, R.Top, R.Right + , R.Bottom );
Canvas.Brush.Style := bsSolid;
end;
end;
OffsetRect( R, FCellSize.X, );
DrawDate := DrawDate + ;
end;
if ceWeekNumbers in FElements then
begin
Canvas.Brush.Color := Color;
Canvas.Font.Color := FCalendarColors.DaysOfWeek;
if Assigned( FOnGetWeekNumber ) then
begin
WN := WeekOf( DrawDate - );
FOnGetWeekNumber( Self, DrawDate, WN );
DrawStringCentered( Canvas, IntToStr( WN ), WR );
end
else
DrawStringCentered( Canvas, IntToStr( WeekOf( DrawDate - ) ), WR );
OffsetRect( WR, , FCellSize.Y );
end;
OffsetRect( R, DaysRect.Left - R.Left, FCellSize.Y );
end;
if ButtonsVisible then
begin
if ceWeekNumbers in FElements then
begin
if FThemeAware and ThemeServices.ThemesEnabled then
Offset :=
else
Offset := ;
DrawHorizontalLine( Areas[ caWeekNumbers ].Right - Offset, DaysRect.Right, DaysRect.Bottom - );
end
else
DrawHorizontalLine( DaysRect.Left, DaysRect.Right, DaysRect.Bottom - );
end;
end;
end; {= TRzCalendar.Paint =}

修改后需要重新编译,然后将编译后的dcu拷贝至delphi的引用目录下即可。但是,在编译的时候又遇到麻烦了,编译不过去,老是提示RzBorder.pas有问题,最后也改了这个文件,主要更改的地方有两个地方:
1、TRzLEDValidChars = Chr( 32 )..Chr( 126 ); //原来是255,修改为126,其实已经够用了
2、DotMasks: TRzLEDCharacters = .......//这个声明也改了,将( {~} Col0: $40; Col1: $80; Col2: $40; Col3: $20; Col4: $40 )后面的都截掉了,这样就可以编译通过,目前还没有发现有啥副作用。

解决Raize日历控件显示的问题的更多相关文章

  1. Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php

    Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...

  2. Extjs datefield 日历控件中文显示

    原版的日历控件选择的时候是英文的,不是中文的.后来将在extjs包中src下locale下ext-lang-zh_CN.js引用进来就汉化了

  3. 日历控件修改的JS代码

    var bMoveable=true; var _VersionInfo=" " ; //============================================= ...

  4. TWaver初学实战——如何在TWaver属性表中添加日历控件?

    在日期输入框中添加日历控件,是一种非常流行和实用的做法.临渊羡鱼不如退而写代码,今天就看看在TWaver中是如何实现的.   资源准备   TWaver的在线使用文档中,就有TWaver Proper ...

  5. 简洁JS 日历控件 支持日期和月份选择

    原文出处 以下这个JS日历控件是我的闲暇之余自己编写的,所有的代码全部在IE7/IE8/Firefox下面测试通过, 而且可以解决被iframe层遮盖的问题.现在只提供两种风格(简洁版和古典版)和两种 ...

  6. 推荐一款JavaScript日历控件:kimsoft-jscalendar

    一.什么是 kimsoft-jscalendar     一个简洁的avaScript日历控件,可在Java Web项目,.NET Web 项目中使用 二.kimsoft-jscalendar 有什么 ...

  7. JS实现日历控件选择后自动填充

    最近在做人事档案的项目,在做项目的初期对B/S这块不是很熟悉,感觉信心不是很强,随着和师哥同组人员的交流后发现,调试程序越来越好了,现在信心是倍增,只要自己自己踏实的去研究.理解代码慢慢的效果就出来了 ...

  8. Android自己定义组件之日历控件-精美日历实现(内容、样式可扩展)

    需求 我们知道.Android系统本身有自带的日历控件,网络上也有非常多开源的日历控件资源.可是这些日历控件往往样式较单一.API较多.不易于在实际项目中扩展并实现出符合详细样式风格的,内容可定制的效 ...

  9. 如何使用jqueryUi的datepicker日历控件?

    参考: http://www.jb51.net/article/85007.htm 这里的日历控件是, 基于jquery的jqureyui中的一个 widget. 需要js 文件: 外部的js文件, ...

随机推荐

  1. Phalcon 訪问控制列表 ACL(Access Control Lists ACL)

    Phalcon在权限方面通过 Phalcon\Acl 提供了一个轻量级的 ACL(訪问控制列表). Access Control Lists (ACL) 同意系统对用户的訪问权限进行控制,比方同意訪问 ...

  2. 关于升级 phpStudy 中 MySQL 版本至 5.7.17

    mysql版本低于5.6 自动更新时间会报错.因此要升级mysql版本.综合网上资料和实际过程中遇到的问题,具体细节和注意事项如下: 1.从官网上下载高版本的 MySQL :https://dev.m ...

  3. sql DATEPART() MONTH() convert() cast() dateadd() DATEDIFF() with(nolock)

    DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法 DATEPART(datepart,date) date 参数是合法的日期表达式.datepart 参数 ...

  4. 使用swap 清空vector

    //最简单的使用swap,清除元素并回收内存 vector <int>().swap(vecInt); //清除容器并最小化它的容量, // vecInt.swap(vector<i ...

  5. Linux管理员必须知道的sudo命令

    "Sudo"是Unix/Linux平台上的一个很实用的工具,它同意系统管理员分配给普通用户一些合理的"权利",让他们执行一些仅仅有超级用户或其它 特许用户才干完 ...

  6. Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结

    Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结 1.1. 要兼容的重要语言api1 1.2. 常用基础api分类 core api1 1.3. 比较常用的扩展库 ...

  7. NHibernate Transformers.AliasToEntityMap 返回Hashtable

    string query = "select a.CustomerName as CustomerName, b.ProductName as ProductName from Custom ...

  8. ubuntu如何使用minicom

    minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利,下面将讲解minicom的安装和配置. 一.安装mi ...

  9. php 循环简写

    <?php class a{ public function news($news){ $articles = array(); foreach ($news as $key => $va ...

  10. Linux vi 文件编辑

    1.通过vi filename 进入编辑状态 2.退出 vi 编辑器 退出命令 说明 q 如果文件未被修改,会直接退回到Shell:否则提示保存文件. q! 强行退出,不保存修改内容. wq w 命令 ...