Ver Mensaje Individual
  #2  
Antiguo 24-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Reputación: 0
coso Va por buen camino
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
    { Private declarations }
  public
    { Public declarations }
    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  // si hay mas de 200, 'movemos' todos para el principio, perdiendo la primera pantalla guardada
     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
Archivos Adjuntos
Tipo de Archivo: zip deshacer.zip (159,4 KB, 14 visitas)

Última edición por coso fecha: 24-11-2008 a las 23:05:50.
Responder Con Cita