Hola, podrias usar varios metodos:
- ir guardando todos los comandos ejecutados en una lista, y al pulsar deshacer, ir ejecutandolos todos desde el principio hasta el que desees (que tendria que ser el anterior)
- ir guardando las pantallas, y reponerlas al aplicar el deshacer
- ir guardando los 'anticomandos' (si un comando es linea de A a B, este seria linea de B a A con el color de fondo)
Te dejo un ejemplo de el segundo metodo, a ver si te sirve
:
Código Delphi
[-]
unit back;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Guarda;
procedure Button1Click(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
public
index : integer;
deshacer : array [0..200] of TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Guarda;
var
i : integer;
begin
label1.Caption := inttostr(index);
if index = 200 - 1 then for i := 1 to 200 - 2 do
bitblt(deshacer[i-1].Canvas.Handle,0,0,deshacer[i-1].Width,deshacer[i-1].Height,deshacer[i].Canvas.Handle,0,0,SRCCOPY);
bitblt(deshacer[index].Canvas.Handle,0,0,Width,Height,Canvas.Handle,0,0,SRCCOPY);
if index < 200 - 1 then Inc(index);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
Color := $220000;
Label1.Font.Color := clWhite;
Label1.Caption := '0';
for i := 0 to 200 - 1 do
begin
deshacer[i] := TBitmap.Create;
deshacer[i].Width := ClientWidth;
deshacer[i].Height := ClientHeight;
end;
index := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i : integer;
begin
for i := 200-1 downto 0 do
deshacer[i].Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if index = 0 then exit;
dec(index);
bitblt(Canvas.Handle,0,0,ClientWidth,ClientHeight,deshacer[index].Canvas.Handle,0,0,SRCCOPY);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
op : integer = 10;
xo : integer = 0;
yo : integer = 0;
begin
Canvas.Pen.Color := random($FFFFFF);
Canvas.MoveTo(xo,yo);
Canvas.LineTo(x,y);
op := op + 1;
xo := X;
yo := Y;
if op > 10 then begin Guarda; op := 0; end;
end;
end.
es bastante tosco (no cambies el tamaño de la ventana, pues puede dar error, gasta mucha memoria y repinta otras ventanas). Espero que te sirva de idea