Delphi – TDataSet确定它是否在插入/编辑状态时被修改

前端之家收集整理的这篇文章主要介绍了Delphi – TDataSet确定它是否在插入/编辑状态时被修改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当数据集已处于插入状态时,如何确定数据感知组件字段是否已被修改?我想知道一个字段是否“真正”修改过. (我不在乎用户是否在某个字段中输入了某些东西,然后删除了所有内容,这意味着发生了修改).

DataSet.Modified,DataSet.UpdateStatusChangeCount没有解决我的问题.

LE:让我更深入地解释一下.所以,初始数据集看起来像

  1. -------------------------------------
  2. |PK | Field1| Field2| Field3|Field4|
  3. -------------------------------------
  4. | 1 | a | b | c | d |
  5. -------------------------------------

插入后

  1. -------------------------------------
  2. |PK | Field1| Field2| Field3|Field4|
  3. -------------------------------------
  4. | 2 | | | | |
  5. -------------------------------------
  6. | 1 | a | b | c | d |
  7. -------------------------------------

当数据集真正被修改

  1. -------------------------------------
  2. |PK | Field1| Field2| Field3|Field4|
  3. -------------------------------------
  4. | 2 | avalue| | | |
  5. -------------------------------------
  6. | 1 | a | b | c | d |
  7. -------------------------------------

解决方法

您可以破解DataSet以在AfterInsert / AfterEdit上更改它的Modified属性(并设置初始值/默认值),然后测试DataSet.Modified(例如在发布之前打开).
为了确定哪些特定字段被修改,我持有初始记录的副本,例如:
  1. type
  2. TDataRecord = array of record
  3. FieldName: string;
  4. Value: Variant;
  5. end;
  6.  
  7. type
  8. TForm1 = class(TForm)
  9. ...
  10. private
  11. FInitRecord,FPostRecord: TDataRecord;
  12. end;
  13.  
  14. function GetDataRecord(DataSet: TDataSet): TDataRecord;
  15. var
  16. I: Integer;
  17. begin
  18. Result := nil;
  19. if Assigned(DataSet) then begin
  20. SetLength(Result,DataSet.FieldCount);
  21. for I := 0 to DataSet.FieldCount - 1 do begin
  22. Result[I].FieldName := DataSet.Fields[I].FieldName;
  23. Result[I].Value := DataSet.Fields[I].Value;
  24. end;
  25. end;
  26. end;
  27.  
  28. type
  29. TDataSetAccess = class(TDataSet);
  30.  
  31. procedure TForm1.ADODataSet1AfterInsert(DataSet: TDataSet);
  32. begin
  33. // set initial values
  34. ADODataSet1.FieldByName('PK').Value := GetMyPKValue;
  35. ADODataSet1.FieldByName('DateCreated').AsDateTime := Now();
  36. // un-modify
  37. TDataSetAccess(ADODataSet1).SetModified(False);
  38. // save initial record
  39. FInitRecord := GetDataRecord(ADODataSet1);
  40. end;
  41.  
  42. procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
  43. var
  44. I: Integer;
  45. begin
  46. if ADODataSet1.Modified then
  47. begin
  48. FPostRecord := GetDataRecord(ADODataSet1);
  49. Memo1.Lines.Clear;
  50. for I := 0 to Length(FPostRecord) - 1 do begin
  51. if FPostRecord[I].Value <> FInitRecord[I].Value then
  52. Memo1.Lines.Add(Format('Field %s was modified',[FPostRecord[I].FieldName]));
  53. end;
  54. end;
  55. end;

好吧,无论如何,这是抽象的想法.您可以像我一样对您的TDataSet进行子类化,并直接在您的TDataSet组件中实现此功能.

猜你在找的Delphi相关文章