要将DateTimePicker的“星期一、星期二……星期日”改成“一、二……日”,该如何改改VCL源码?(200分)

  • 主题发起人 雁孤行
  • 开始时间

雁孤行

Unregistered / Unconfirmed
GUEST, unregistred user!
  要将DateTimePicker 的“星期一、星期二……星期日”改成“一、二……日”,该
如何改VCL源码?在一层层的继承里翻了老半天也没找到相关的过程和函数,请问哪位兄
台知道在哪里改?
 
这样简单就好了,这是Windows本身的东西,相关字符串资源不在VCL源码里。
 
改原码是够戗了,跟计算机的操作系统的区域设置(以及语言)有关。
 
应该是从Windows里面获取字符串。。。

可以通过自己进行字符串的转换,实现自己要显示的名字。。。。[:)]
 
to CJF:
  是啊!可找不到相关实现的函数在VCL源码的哪里,无从下手:(
 
如果在TMonthCalendar里面不好处理。。。。

可以在C:/Program Files/Borland/Delphi6/Source/Samples/Calendar.pas的基础上进行修改。。。

 
同意Door2000,应该从系统注册表考虑,相信不会很难,查查这方面相关的资料……
 
我用DEVEXPRESS的控件也碰到此问题
 
这问题我也想过,不过也没找着在哪里改,解决后告诉我,delphilai@163.com,谢谢
 
只要加上
ShortDayNames[1]:='日';
ShortDayNames[2]:='一';
ShortDayNames[3]:='二';
ShortDayNames[4]:='三';
ShortDayNames[5]:='四';
ShortDayNames[6]:='五';
ShortDayNames[7]:='六';
就可以了。
 
哇楼上,这么简单啊?
学习,收藏。
 
同意楼上观点. 可以查看帮助: Currency and date/time formatting variables

The following are a set of variables used to define the format for numeric or date/time strings:

var CurrencyString: string;
var CurrencyFormat: Byte;
var NegCurrFormat: Byte;
var ThousandSeparator: Char;
var DecimalSeparator: Char;
var CurrencyDecimals: Byte;
var DateSeparator: Char;
var ShortDateFormat: string;
var LongDateFormat: string;
var TimeSeparator: Char;
var TimeAMString: string;
var TimePMString: string;
var ShortTimeFormat: string;

var LongTimeFormat: string;
var ShortMonthNames: array[1..12] of string;
var LongMonthNames: array[1..12] of string;
var ShortDayNames: array[1..7] of string;
var LongDayNames: array[1..7] of string;

var SysLocale: TSysLocale;
var EraNames: array[1..7] of string;
var EraYearOffsets: array[1..7] of Integer;
var TwoDigitYearCenturyWindow: Word = 50;

var TListSeparator: Char;
 
好象对这个问题无效!
 
to: [blue]fanqun[/blue]
DateTimePicker控件的ShortDayNames值是能过API函数GetLocaleInfo得来的;
The GetLocaleInfo function retrieves information about a locale.
请按下面的方法试一下看行不行:
在C:/Program Files/Borland/Delphi6/Source/Samples/Calendar.pas的
GetCellText方法里加上
ShortDayNames[1]:='日';
ShortDayNames[2]:='一';
ShortDayNames[3]:='二';
ShortDayNames[4]:='三';
ShortDayNames[5]:='四';
ShortDayNames[6]:='五';
ShortDayNames[7]:='六';
保存后重新编译VCL,应该能行,这样就不用改计算机设置了!
 
我将VCL里所有涉及到ShortDayNames的过程和函数都改了,并重新编译了
相关单元。但只有TCalendar可以,TDateTimePicker和TMonthCalendar不
行,TDateTimePicker里的星期标识好像不是从ShortDayNames里来的。
 
To:[blue]雁孤行[/blue]
[:(]对不起,说错了,TDateTimePicker和TMonthCalendar与Calendar.pas单元并不相关,所有
的Win32元件都与系统相关,Borland只是给这些Win32元件加上了一层Object Pascal外套,
所以我建议您还是从系统入手,能帮您的也只有这一点点了……,顺便提一下,设置本地设
置用SetLocaleInfo函数……
http://efplus.com/techref/os/win/api/win32/func/src/f79_12.htm
 
多谢!我再仔细研究研究,看能不能解决。
 
  问这个问题的主要缘故是在用Developer Express Inc的dxDateEdit控件
时,星期标识都挤在一起,只显示出一个“星”字,类似的还有RxLib等第三
方日历控件,十分难看。
  现在我已经把问题解决了,总结一下,希望对其它被这样问题困扰的朋友
有一些帮助:在dxDateEdit的源码里第1302行用到了ShortDayNames,在第1300
后写上:
ShortDayNames[1]:='日';
ShortDayNames[2]:='一';
ShortDayNames[3]:='二';
ShortDayNames[4]:='三';
ShortDayNames[5]:='四';
ShortDayNames[6]:='五';
ShortDayNames[7]:='六';
可以将这个控件修改成显示“日、一、二……”的,但[blue]强烈建议[/blue]你不要这样
写,因为ShortDayNames是默认的全局变量,这样写的结果是:当你在窗体上
放了dxDateEdit控件,其它用到了ShortDayNames的控件的显示也会变(如果
是动态建立,则会在Create之后发生改变)。正确的写法应该是把“日、一、
二……”通过
  if J > 7 then Dec(J, 7);
   S :=
赋值给S”
  如果你懒得改控件,可以通过一个简单的方法解决:在主窗体的OnCreate
事件里写
ShortDayNames[1]:='日';
ShortDayNames[2]:='一';
ShortDayNames[3]:='二';
ShortDayNames[4]:='三';
ShortDayNames[5]:='四';
ShortDayNames[6]:='五';
ShortDayNames[7]:='六';
就可以了,总之问题的焦点在ShortDayNames,只要是用到了ShortDayNames的控
件都可以依此办理。
 
顶部