TO:沈前卫(0分)

  • 主题发起人 主题发起人 windz
  • 开始时间 开始时间
W

windz

Unregistered / Unconfirmed
GUEST, unregistred user!
给你发了两封信(shenqw@cmmail.com),没有得到你的回答,
不知你收到了没有?以下是原信照抄:
沈前卫:
你好!
我在大富翁看到了你编写的DBDateTimePicker控件(2月28日 ID=192166)
可是这个控件在我本机编译不能通过,报了大概有五十多条错误.
第一条错误信息是: Property 'Anchors'do
es not exist in base class
我使用的是 D3 c/s + win97
是不是我的Delphi版本的问题?
(源文件在附件里)
你有没有既可以定制日期格式又可以同数据库相连的DateTimePicker控件?
若有的话,能不能给我发一个? windz@371.net
谢谢你了!
windz
 
前卫兄没看到?
 
我现在才看到,等等我改!抱歉,windz网友!
 
//现在可以设置时间格式,不过要注意,Kind属性最好与DateTimeMask相对应。
//时间仓促,文档不全,你先在D3先编译试试,如果行,我再寄个完整的Zip包给你
//使用方法与TDBEdit相同

{
作者: 沈前卫(shenqw@cmmail.com)

DelphiX的TDateTimePicker的控件非常好用,但他有个缺点
(也是他的优点),就是其时间的显示格式会随当前程序所运行
的计算机的日期与时间的格式设置不同而显示不同.有时因为
特殊原因需要使TDateTimePicker的时间与日期显示的格式必
须固定,而TDateTimePicker却没有设置时间与日期的格式的属
性.因此,我用TSQWDateTimePicker来实现此功能.
与Delphi的TDateTimePicker比较,TSQWDateTimePicker多出
一个属性DateTimeMask:string.当DateTimeMask为空时,其等
于TDateTimePicker,当DateTimeMask不为空时,时间与日期的
显示格式以DateTimeMask为准!
注意,DateTimeMask的格式与Delphi的FormatDateTime的Mask
有点区别:
年 : y,yy,yyy,yyyy (不能Y,YY,YYY,YYYY)
月 : M,MM(不能为m,mm)
日 : d,dd(不能为D)
时 : h,hh(12时). H,HH(24时)
分 : m,mm(不能为M,MM)
秒 : s,ss(不能为S,SS)
上午,下午: t,tt(不能为T,TT)
TSQWDateTimePicker的其他属性也应正确设置.
Good Luck!
注:
本控件(包括原代码)可以使用予任何目的(你应为你使用本控
件造成的任何后果负责).
}
unit DBDateTimePicker;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,DB,dbctrls,Commctrl;
type
TDBDateTimePicker = class(TDateTimePicker)
private
{ Private declarations }
FDateTimeMask:string;
FFieldDataLink:TFieldDataLink;
procedure SetDateTimeMask(ADateTimeMask:string);
function GetReadOnly:boolean;
procedure SetReadOnly(Value:boolean);
function GetDataField:string;
procedure SetDataField(Value:string);
function GetDataSource:TDataSource;
procedure SetDataSource(Value:TDataSource);
function GetField:TField;
procedure CNNotify(var Message: TWMNotify);
message CN_NOTIFY;
procedure CMExit(var Message:TCMExit);message CM_EXIT;
protected
{ Protected declarations }
procedure CreateWnd;
override;
procedure FDataChange(Sender:TObject);
procedure FUpdateData(Sender:TObject);
procedure Notification(AComponent: TComponent;
Operation: TOperation);
override;
public
{ Public declarations }
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
property Field:TField read GetField;
published
{ Published declarations }
property DateTimeMask:string read FDateTimeMask write SetDateTimeMask;
property DataSource:TDataSource read GetDataSource write SetDataSource;
property DataField:string read GetDataField write SetDataField;
property ReadOnly:boolean read GetReadOnly write SetReadOnly;
// The Date, Time, ShowCheckbox, and Checked properties must be in this order:
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Data Controls', [TDBDateTimePicker]);
end;

{ TDBDateTimePicker }
procedure TDBDateTimePicker.CMExit(var Message: TCMExit);
begin
try
FFieldDataLink.UpdateRecord;
except
Self.SetFocus;
raise;
end;
inherited;
end;

procedure TDBDateTimePicker.CNNotify(var Message: TWMNotify);
begin
FFieldDataLink.Edit;
inherited;
FFieldDataLink.Modified;
end;

constructor TDBDateTimePicker.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDateTimeMask:='';
FFieldDataLink:=TFieldDataLink.Create;
FFieldDataLink.ReadOnly:=False;
FFieldDataLink.Control:=Self;
FFieldDataLink.OnDataChange:=FDataChange;
FFieldDataLink.OnUpdateData:=FUpdateData;
end;

procedure TDBDateTimePicker.CreateWnd;
begin
inherited;
if FDateTimeMask<>'' then
SetDateTimeMask(FDateTimeMask);
end;

destructor TDBDateTimePicker.Destroy;
begin
FFieldDataLink.Free;
FFieldDataLink:=nil;
inherited;
end;

procedure TDBDateTimePicker.FDataChange(Sender: TObject);
begin
if (FFieldDataLink<>nil) and (FFieldDataLink.Field<>nil) then
begin
Self.Date:=Trunc(FFieldDataLink.Field.AsDateTime);
Self.Time:=Frac(FFieldDataLink.Field.AsDateTime);
end;
end;

procedure TDBDateTimePicker.FUpdateData(Sender: TObject);
begin
if (FFieldDataLink<>nil) and (FFieldDataLink.Field<>nil) then
FFieldDataLink.Field.AsDateTime:=TDateTime(Date);
end;

function TDBDateTimePicker.GetDataField: string;
begin
Result:=FFieldDataLink.FieldName;
end;

function TDBDateTimePicker.GetDataSource: TDataSource;
begin
Result:=FFieldDataLink.DataSource;
end;

function TDBDateTimePicker.GetField: TField;
begin
Result:=FFieldDataLink.Field;
end;

function TDBDateTimePicker.GetReadOnly: boolean;
begin
Result:=FFieldDataLink.ReadOnly;
end;

procedure TDBDateTimePicker.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent,Operation);
if (Operation=opReMove) and (FFieldDataLink<>nil) and
(AComponent=FFieldDataLink.DataSource) then
FFieldDataLink.DataSource:=nil;
end;

procedure TDBDateTimePicker.SetDataField(Value: string);
begin
FFieldDataLink.FieldName:=Value;
end;

procedure TDBDateTimePicker.SetDataSource(Value: TDataSource);
begin
FFieldDataLink.DataSource:=Value;
if Value<>nil then
Value.FreeNotification(Self);
end;

procedure TDBDateTimePicker.SetDateTimeMask(ADateTimeMask: string);
begin
FDateTimeMask:=ADateTimeMask;
if FDateTimeMask<>'' then
DateTime_SetFormat(Handle,PChar(FDateTimeMask))
else
RecreateWnd;
end;

procedure TDBDateTimePicker.SetReadOnly(Value: boolean);
begin
FFieldDataLink.ReadOnly:=Value;
end;

end.
 
谢谢沈前卫!
这次编译通过了,但安装后该组件并未出现在组件模版中.
使用View>Component list中的Search也找不到.
但在Packages dclusr30.dpl中可以找到.
显然我并没有完全安装成功.不知道是什么原因?
 
如果你真确安装,在与TDBEdit相同的面版上。
如果好不行,在这里留言。OK?
 
原因找到了.是因为安装后TDBDateTimePicker控件的默认属性为Hide.
把它Show出来就好了.
还有一个问题:
为什么设置Field属性时,它一定要求ShowChecked属性为True呢?
我已经在非技术区新开了一个问题,注意领分哦.
非常感谢!
 
我好象没遇到此问题,说详细些吧?
 
如果当前记录时间字段为空值时,程序执行将会出错误提示:
You must be in showcheckbox mode to set to this date.
 
等我试试
 
windz:
如果为null,你认为显示什么为好。(处理起来还比较麻烦).
 
我感觉如果为null的话,显示空串比较好.
 
windz:
算了吧,不要使用这个控件。
如果时间是非null字段,本控件确实比较方便,如果是可为null字段,那处理就
非常麻烦,或者说不可能实现。主要是时间的问题,对于日期,我可以规定9999-12-31
代表是NULL字段,可是时间却没办法,我不可能让23:59:59代表时间是NULL,所以
这个障碍很难逾越。算了吧,不要使用这个控件。
那100分.....我看还是还给你吧?
 
如果我只使用日期而不使用时间,是不是就可以用这个控件了?
日期如果为空值,必须显示一个代表空值的时间,而不能什么也不显示,对吗?
100分的事就不要再提了.无论如何我都该感谢你的.
谢谢你!
我看明天就把这个问题关闭吧.
 
如果你的时间是非NULL,还是比较好,主要是时间,日期还好办。没办法了。
 
我要结束问题了.
再次向你表示感谢!
 
接受答案了.
 
后退
顶部