解决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. mysql数据库初始化(启动mysql时候报很多错误,初始化)

    ./mysql_install_db --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/us ...

  2. rxjs来啦

    var text = document.querySelector('#text'); var inputStream = Rx.Observable.fromEvent(text, 'keyup') ...

  3. 关于top按钮的网页设置

    方法一: 直接用html实现,没有缓冲的效果,直接彪到顶部. HTMl: <a id="return-top" href="#top"> <s ...

  4. SQL——使用游标进行遍历

    前两天一个同事大叔问了这样一个问题,他要对表做个类似foreach的效果,问我怎么搞.我想了想,就拿游标回答他,当时事实上也没用过数据库中的游标,可是曾经用过ADO里面的,感觉应该几乎相同. 今天闲下 ...

  5. __attribute__系列之cleanup

    cleanup属性:当变量离开它的作用域时,设置的cleanup_function函数将被调用. cleanup (cleanup_function) The cleanup attribute ru ...

  6. php类库PHP QR Code 二维码

    php类库PHP QR Code 二维码 php类库PHP QR Code 二维码 php类库PHP QR CodePHP QR Code is open source (LGPL) library ...

  7. Dig HOWTO 中文手册--dig命令使用大全

    Dig HOWTO 中文手册--dig命令使用大全 DNS -- 本人翻译的dig howto手册. 译者序: 可以这样说,翻译本篇文档的过程就是我重新学习DNS的过程,dig命令可以帮助我们学习DN ...

  8. java-SimpleDateFormatDemo & BirthDemo

    java日期格式设置,以及案例BirthDemo package com.example; import java.text.ParseException; import java.text.Simp ...

  9. c++ istream(ostream)是如何转换为bool的

    http://www.cplusplus.com/reference/ios/ios/operator_not/ http://stackoverflow.com/questions/8117566/ ...

  10. js获取屏幕的大小等信息

    <html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...