📄 errform.pas
字号:
unit Errform;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, IBCustomDataset, DB;
type
TUpdateErrorForm = class(TForm)
ErrorText: TLabel;
UpdateType: TLabel;
UpdateData: TStringGrid;
SkipButton: TButton;
RetryButton: TButton;
AbortButton: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure UpdateDataSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: string);
private
FDataFields: TStringList;
procedure GetFieldValues(DataSet: TDataSet);
procedure SetFieldValues(DataSet: TDataSet);
public
function HandleError(DataSet: TDataSet; E: EDatabaseError;
UpdateKind: TUpdateKind): TIBUpdateAction;
end;
var
UpdateErrorForm: TUpdateErrorForm;
implementation
uses Variants;
{$R *.dfm}
function TUpdateErrorForm.HandleError(DataSet: TDataSet; E: EDatabaseError;
UpdateKind: TUpdateKind): TIBUpdateAction;
const
UpdateKindStr: array[TUpdateKind] of string = ('Modified', 'Inserted',
'Deleted');
begin
//用label显示出错信息
UpdateType.Caption := UpdateKindStr[UpdateKind];
ErrorText.Caption := E.Message;
//把更新字段的值填到StringGrid中
GetFieldValues(DataSet);
ShowModal;
//根据用户输入的命令来操作
case ModalResult of
mrRetry:
begin
//当用户输入重试时,从修改的值重传到相关的数据集
SetFieldValues(DataSet);
Result := IBCustomDataset.uaRetry;
end;
mrIgnore:
Result := IBCustomDataset.uaSkip; //跳过
else
Result := IBCustomDataset.uaAbort; //退出
end;
end;
procedure TUpdateErrorForm.GetFieldValues(DataSet: TDataSet);
var
I: Integer;
F: TField;
begin
//创建数据集的某个字段的一个列表并存储起来,
//我们也可以根据这个列表来判断哪个被编辑过
FDataFields.Clear;
for I := 0 to DataSet.FieldCount - 1 do
with Dataset.Fields[I] do
if (FieldKind = fkData) then
FDataFields.AddObject('', DataSet.Fields[I]);
//把列表中的数据传送到StringGrid显示
UpdateData.RowCount := FDataFields.Count + 1;
for I := 0 to FDataFields.Count - 1 do
begin
F := TField(FDataFields.Objects[I]);
UpdateData.Cells[0, I + 1] := VarToStr(F.NewValue);
UpdateData.Cells[1, I + 1] := VarToStr(F.OldValue);
end;
end;
procedure TUpdateErrorForm.SetFieldValues(DataSet: TDataSet);
var
I: Integer;
F: TField;
begin
for I := 0 to FDataFields.Count - 1 do
//把所有修改过的行重新赋值
if FDataFields[I] = '*' then
begin
F := TField(FDataFields.Objects[I]);
F.NewValue := UpdateData.Cells[0, I + 1];
end;
end;
{ Event handlers }
procedure TUpdateErrorForm.FormCreate(Sender: TObject);
begin
FDataFields := TStringList.Create;
//初始化第一行
UpdateData.Cells[0,0] := 'New Value';
UpdateData.Cells[1,0] := 'Old Value';
end;
procedure TUpdateErrorForm.FormDestroy(Sender: TObject);
begin
FDataFields.Free;
end;
procedure TUpdateErrorForm.UpdateDataSetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: string);
begin
//把用户修改的行标注为'*'
FDataFields[ARow - 1] := '*';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -