type
rcd = record
ACol, ARow: Integer;
txt: string;
end;
const
anzahl = 10; // Anzahl der Schritte, die rückgängig gemacht werden können
welcher: byte = 0;
eingabe: boolean = false;
var
a: array[0..anzahl - 1] of rcd;
procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.options := stringgrid1.options + [goEditing];
// kann auch im Objektinspektor eingestellt werden
end;
procedure undo_proc(C, R: integer; txt: string);
var x: integer;
begin
if welcher = anzahl then begin
for x := 0 to anzahl - 2 do begin
a[x].ACol := a[x + 1].ACol;
a[x].ARow := a[x + 1].ARow;
a[x].txt := a[x + 1].txt;
end;
dec(welcher);
end;
a[welcher].ACol := C;
a[welcher].Arow := R;
a[welcher].txt := txt;
inc(welcher);
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
eingabe := false;
end;
procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
eingabe := false;
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then eingabe := false;
end;
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
ARow: Integer; var Value: string);
begin
if not eingabe then undo_proc(ACol, ARow, Value);
eingabe := true;
end;
// Undo durchführen
procedure TForm1.Button3Click(Sender: TObject);
begin
if welcher > 0 then begin
dec(welcher);
stringgrid1.col := a[welcher].ACol;
stringgrid1.row := a[welcher].ARow;
stringgrid1.cells[a[welcher].ACol, a[welcher].ARow] := a[welcher].txt;
end;
end;