解决Raize日历控件显示的问题
解决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日历控件显示的问题的更多相关文章
- Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...
- Extjs datefield 日历控件中文显示
原版的日历控件选择的时候是英文的,不是中文的.后来将在extjs包中src下locale下ext-lang-zh_CN.js引用进来就汉化了
- 日历控件修改的JS代码
var bMoveable=true; var _VersionInfo=" " ; //============================================= ...
- TWaver初学实战——如何在TWaver属性表中添加日历控件?
在日期输入框中添加日历控件,是一种非常流行和实用的做法.临渊羡鱼不如退而写代码,今天就看看在TWaver中是如何实现的. 资源准备 TWaver的在线使用文档中,就有TWaver Proper ...
- 简洁JS 日历控件 支持日期和月份选择
原文出处 以下这个JS日历控件是我的闲暇之余自己编写的,所有的代码全部在IE7/IE8/Firefox下面测试通过, 而且可以解决被iframe层遮盖的问题.现在只提供两种风格(简洁版和古典版)和两种 ...
- 推荐一款JavaScript日历控件:kimsoft-jscalendar
一.什么是 kimsoft-jscalendar 一个简洁的avaScript日历控件,可在Java Web项目,.NET Web 项目中使用 二.kimsoft-jscalendar 有什么 ...
- JS实现日历控件选择后自动填充
最近在做人事档案的项目,在做项目的初期对B/S这块不是很熟悉,感觉信心不是很强,随着和师哥同组人员的交流后发现,调试程序越来越好了,现在信心是倍增,只要自己自己踏实的去研究.理解代码慢慢的效果就出来了 ...
- Android自己定义组件之日历控件-精美日历实现(内容、样式可扩展)
需求 我们知道.Android系统本身有自带的日历控件,网络上也有非常多开源的日历控件资源.可是这些日历控件往往样式较单一.API较多.不易于在实际项目中扩展并实现出符合详细样式风格的,内容可定制的效 ...
- 如何使用jqueryUi的datepicker日历控件?
参考: http://www.jb51.net/article/85007.htm 这里的日历控件是, 基于jquery的jqureyui中的一个 widget. 需要js 文件: 外部的js文件, ...
随机推荐
- POJ1088 动态规划
题意: id=1088">题目链接 解答: 这个题目和最长子序列什么的极为类似.只是之前都是一维,如今变成二维的了.仅此而已.因此我们能够想办法把它先变成一维的. 先用一个结构体存储这 ...
- Python 的数据表示
一.常量.变量和对象 1.常量:是指在程序的执行过程中不变的量.如:1,2,3,4,……,true.false 也有一些包含在模块中的用符号表示的常量,常用的如math模块中的pi和e,如: > ...
- 用jQuery和PHP来实现转盘抽奖程序
准备工作 首先要准备素材,抽奖的界面用到两张图片,圆盘图片和指针图片,实际应用中可以根据不同的需求制作不同的圆盘图片. 接着制作html页面,实例中我们在body中加入如下代码: <div cl ...
- left与margin-left区别
left,right,top,bottom仅对于position:relative|absolute|fixed的元素有意义. <!DOCTYPE html PUBLIC "-//W3 ...
- 数组传到后台 string[] 获取
调试的 时候js 断点到后台 js上面也可以查看 传到后台的数据 方便查看~~
- WPF入门教程系列一
WPF入门教程 一. 前言 公司项目基于WPF开发,最近项目上线有点空闲时间写一篇基于wpf的基础教材,WPF也是近期才接触,学习WPF也是在网上查资料与微软的MSDN进行学习,写本博客的目为了温 ...
- 一个文件查看你选择 Run as Android applications 都干了啥
<?xml version="1.0" encoding="UTF-8"?> <project name="PushFastDemo ...
- CentOS-6.*安装配置SVN
安装说明 系统环境:CentOS-6.3 安装方式:yum install (源码安装容易产生版本兼容的问题) 安装软件:系统自动下载SVN软件 检查已安装版本 #检查是否安装了低版本的SVN [ro ...
- javaweb项目开发错误代码
HTTP状态码(HTTP Status Code) 一些常见的状态码为:200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应) ...
- AndroidManifest.xml配置
AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xm ...