第三方控件BusinessSkinForm各个版本都存在这样的Bug:日期控件TbsSkinDateEdit的选择面板上方只能显示一排“星期”,而是正常的“星期一、星期二……”。 网上翻了个底朝天,总算找到如下解决办法:
在控件源路径下找到bsCalendar 单元(bsCalendar.pas),用记事本或任何文本编辑器打开后,注释掉下述截断字符的语句即可:
procedure TbsSkinMonthCalendar.DrawCalendar(Cnvs: TCanvas);
……
for I := 0 to 6 do
begin
S := ShortDayNames[(Ord(FirstDayOfWeek) + I) mod 7 + 1];
//
// if Length(S) > 4 then S := Copy(S, 1, 4); //将这一句注释就行了
//
X2 := X + CellW div 2 - TextWidth(S) div 2;
TextOut(X2, Y, S);
X := X + CellW;
end;
……
注释之后周名虽然显示正常了,但我们仍感不足,原因主要是每列标注“星期一”三个字太占地了,导致日期选择面板长宽比例难以调整:正常比例的话一排周名挤得一塌糊涂,调宽的话狭长的面板又令人不爽……要是只标“一、二、三……”岂不更好?
其实稍稍分析上述被注释的语句就会发现,变量“S”存储的应是从本地系统中取出的周名称,对于咱们汉语种来说,就是“星期一、星期二……”等,S := Copy(S, 1, 4)的后果是什么?只截取 S 中存储字符的前4个字节也即两个汉字,这就导致无论“星期一”还是“星期二”都只能截到“星期”了。既然如此,那我就截取后两个字节,不就实现只标“一、二、三……”的需求了吗?去掉上述注释符,修改如下(注:此法仅在汉语种操作系统下测试通过):
if Length(S) > 4 then S := Copy(S, Length(S)-1, 2);
如果要想的设计期间看到效果,须重新编译控件。运行期间正确无误。
附效果——