Board logo

Subject: CnCalendar.pas和CnCalClass.pas的问题 [Print This Page]

Author: gdlpc    Time: 2007-2-14 02:46     Subject: CnCalendar.pas和CnCalClass.pas的问题

十分感谢你们提供了历法控件,但在使用中发现一个问题:
  四柱中年不能跟二十四节气转变,例如2007年1月1日至2007年2月4日(立春)应该还是属于“丙戌”年,但你们的控件已显示是“丁亥”年。
  请开发组修正这问题,多谢!
Author: Passion    Time: 2007-2-14 10:10

您可能使用的是旧版本的CnCalendar.pas,旧版本的CnCalendar中是有这个问题,而我们最新的CVS上的代码已经修正了这个问题。
如果您想获得最新的CVS代码,请参考网站上的CVS使用说明。
Author: Passion    Time: 2007-2-14 10:12

目前CnCalendar的行为是这样的:2007年1月1日至2007年2月3日(立春前一天)我们显示为“丙戌”年,2007年2月4日(立春)及以后显示为“丁亥”年,请问是否符合您的要求?
Author: gdlpc    Time: 2007-2-14 11:38

多谢版主!
  你说的符合要求。
  但我用的是cnpack_20061001版,是有上述的问题。
Author: Passion    Time: 2007-2-14 14:13

网站上的打包下载的源文件是有这个问题。请上CVS获得最新的代码。
如果您不能上CVS,可以留个联系法子,我想法把这部分代码给你。
Author: gdlpc    Time: 2007-2-14 15:05

真是万分感谢版主!
  如方便,麻烦您发邮件到:nflpc88@21cn.com
Author: Passion    Time: 2007-2-14 17:32

好的。晚上发。
Author: Passion    Time: 2007-2-15 08:55

已发,请查收。
Author: gdlpc    Time: 2007-2-15 11:09

多谢管理员LiuXiao
  但附件不能解压(它说文件损坏),请问可否重新压缩原件给寄上?
Author: Passion    Time: 2007-2-15 11:32

又发了一回,没压缩的。
Author: jAmEs_    Time: 2007-2-15 11:52

天啊。。。
Author: gdlpc    Time: 2007-2-15 12:10

多谢管理员LiuXiao
     你们的效率很高,祝你们的开发组万事胜意,新春进步,财源滚滚!
又要麻烦管理员LiuXiao了,我用了您发来的CnCalendar.pas和CnCalClass.pas也不能解决问题,是否我的用法不当或还需要其它设置?
Author: Passion    Time: 2007-2-15 12:44

请贴贴代码?
Author: Passion    Time: 2007-2-15 13:00

抱歉,经过查证,CnCalendar.pas 中的算法虽然没有问题,但如果您是使用CnCalClass中的日的类及其子类,子类在给日期赋值的时候未重新更新计算年干支,这是CnCalClasses中的一个bug。
我已经把修复问题后的此文件发到您的油箱。
Author: gdlpc    Time: 2007-2-15 19:57

管理员LiuXiao您好。
  经测试,控件中的“年”是按公历的年定义的,跟“月”(节气)无关?不知我的看法是否正确?或者还要用哪一个函数,我基本不懂(我只会仿你们的代码)。请指教,多谢!

以下是我的测试过程。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    YearEdit: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses CnCalendar, CnCalClass;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  HourObj: TCnHourObj;
begin
  HourObj:=TCnHourObj.Create;
  HourObj.Year:=StrtoInt(Trim(YearEdit.Text)); //2005;
  Showmessage(GetGanZhiFromNumber(HourObj.YearGanZhi));

end;

end.
Author: Passion    Time: 2007-2-15 23:52

类中的年月日目前都是公历年月日。
类如果直接用年而不用月和日的话,计算出来的年干支默认以立春后的某日为准。
TCnHourObj如果给月和日也赋值了的话,才会根据年月日在立春前面还是后面来区分年干支是前一年的还是后一年的。
Author: gdlpc    Time: 2007-2-16 00:22

您现在还在写控件,真是辛苦了!
如是这样,GetGanZhiFromNumbe这个函数如何使用?(有时间再回复吧)
Author: Passion    Time: 2007-2-16 09:41

看看CnCalendar的说明?

function GetGanZhiFromNumber(const AValue: Integer): string;
{* 从数字获得天干地支名, 0-59}

这个函数用来把类中返回的干支数字转换成中文的干支名,干支数字以0到59表示。
只要类返回的干支数值正确,转换的中文名也会正确。

我上面说的问题的关键是类返回年干支数值有点问题,现已修正。
Author: gdlpc    Time: 2007-2-16 20:37

多谢你们了。
  用这个函数GetGanZhiFromNumber(GetGanZhiFromYear(AYear, AMonth, ADay))就可以了。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0