TFieldDataLink中自動保存(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我想改進一下DBComboBox功能﹐因為我喜歡將他的style改為csDropDownList﹐這樣每當我
新增資料的時候﹐他就將ItemIndex自動改為-1了。我現在已經解決了這個問題﹐新增資料
時﹐會自動設好一個默認值﹐但奇怪的是保存不了資料﹐若我點擊Click或改變Change資料﹐
再保存就行﹐若不執行這個動作﹐哪怕我將Click寫在程序中都不行﹐這是為什么﹐怎樣才
能自動保存呢﹖我的想法是﹐若新增資料﹐就自動將設的初值顯出來﹐若別人看到就是這個
初值而不去點擊的話也要能存進資料。現在的毛病就是若動到他就能存﹐不動他就不能存。
另外﹐還有一個問題﹐怎樣判斷日期為空﹐我現在只有用Length(AsString)﹐但我覺得不好﹐
希望有另外的方法判斷日期為空或無效。謝謝﹗

 
关于日期有效:
Try
StrToDate(Text);
有效;
Except
无效;
End;
 
大俠﹐主要是保存問題﹐判斷日期是否有效想看看有沒有更好的法子。
 
我用的是RxDBDateEdit控件,判断日期可以用下面方法。
if rxdbdateedit1.date<>0 then//<>0表示日期有效
虽然理论上说不过去,但实际上却是可行了。你可以试试看

Dataset.afterinsert
Tdbcombobox.field.value:=Tdbcombobox.text;
 
我現在寫了一個DBDateTime控件﹐但不能自動保存資料。
控件現在可以將資料讀出來﹐若我改變了資料﹐也可以存進去﹐但是﹐若操作中我不動這個
控件﹐數據就不會自動保存進去。我繼承的DateTimePicker﹐加上了DataSource
和DataField。
例﹕放十個該控件﹐新增時﹐十個控件里的資料都為空﹐控件就會自動顯示當前的時間。
若我改動了5個﹐其它5個沒有動﹐那么保存的時候就只存了5個進去﹐而我想全部保存
進去﹐請問怎么辦﹖

源碼﹕
procedure TMeDBDateTimePicker.Change;
begin
FDataLink.Edit;
inherited Change;
FDataLink.Modified;
end;

procedure TMeDBDateTimePicker.Click;
begin
FDataLink.Edit;
inherited Click;
FDataLink.Modified;
end;

constructor TMeDBDateTimePicker.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
FDataLink.OnEditingChange := EditingChange;
Width:=89;
end;

procedure TMeDBDateTimePicker.DataChange(Sender: TObject);
begin
if FDataLink.Field<>nil then
begin
if Length(FDataLink.Field.AsString)>0 then
DateTime:=FDataLink.Field.AsDateTime
else
begin
DateTime:=Now;//在這兒若數據庫中沒有資料﹐就自動加上當前的時間
end;
end;
//若我加上Change或Click事件在這兒﹐就會出錯.
end;

destructor TMeDBDateTimePicker.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;

procedure TMeDBDateTimePicker.EditingChange(Sender: TObject);
begin

end;

function TMeDBDateTimePicker.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;

function TMeDBDateTimePicker.GetDataSource: TDataSource;
begin
Result:=FDataLink.DataSource;
end;

function TMeDBDateTimePicker.GetField: TField;
begin
Result:= FDataLink.Field;
end;

function TMeDBDateTimePicker.GetReadOnly: Boolean;
begin

end;

procedure TMeDBDateTimePicker.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;

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

procedure TMeDBDateTimePicker.UpdateData(Sender: TObject);
begin
FDataLink.Field.AsDateTime:= DateTime;
end;
 
大俠們﹕快點幫幫我呀。
 
你应该在适当的地方调用 DataLink 的 UpdateRecord 方法吧。UpdateRecord 会调用你
赋给 DataLike.OnUpdateData 的处理过程,修改字段的值。我看了一下 VCL 的源代码,
好多数据敏感控件都在对 CM_EXIT 消息的处理方法中调用了 DataLink 的 UpdateRecord
方法,你可以试一下。
DataLink 的 OnDataChange 是 Field 的值改变时触发的,一般在事件处理过程中相应
修改控件的外观,不应在这时反过来修改 Field 的值。
 
大蝦﹐現在其它的問題都差不多解決了﹐還剩下一個。若我最初給它一個初始值﹐在保存的
時候﹐操作員根本沒有動過它﹐那么就不會自動存下來。請問這個怎么解決呢﹖若操作員對
它有過操作﹐哪怕只是過一下路﹐都能存下來﹐但若沒操作﹐就不能存下來。想問一下﹐怎
樣才能實現沒動它﹐也將默認值存下來。
 
你是在 DataChange 中将 DateTime 设为 Now 的吗?如果是的话,试试在
DataTime := Now; 后加上 UpdateData 一句话,看行不行。
...
if Length(FDataLink.Field.AsString)>0 then
DateTime:=FDataLink.Field.AsDateTime
else
begin
DateTime:=Now;
UpdateData;
end;
 
bbkxjy;你的法子试过,不行.说当前不在修改模式下.
 
再试试:
...
else begin
DateTime:=Now;
FDataLink.Edit;
UpdateData;
FDataLink.Modified;
end;
 
bbkxjy:谢谢你!100分都是你的啦.不过,我还想问一个问题,在DateTimePicker中怎么让它
显示为空呢?就是若这天没有记录的话,就不要显示内容.新增的时候,再默认为哪一天.
好像日期型没有为空,就是1899年什么的.
 
bbkxjy, can you help me?
 
dadabox:
你好,datetimepicker 封装的是 Windows 带的 Common Controls 。要显示空日期好象
跟它的 ShowCheckbox 和 Checked 属性还有关联,刚开始我看了一下它的源码,不是很懂,
后来也没时间看。请你再等等,我帮你想想看。
 
bbkxjy,
谢谢你!我先将分给你算了。
 

Similar threads

后退
顶部