Fórum Undo e Redo nos gráficos #255869

25/10/2004

0

Meus caros amigos,

Sei que já estou enchendo o saco, como nunca trabalhei com imagens, estou nessa crise de produção.

Vejam, tenho a imagem de uma planta baixa em bmp ou jpg, e desenho áreas nelas para medir os níveis de iluminação, obter tamanho de área e perímetros, número de tomadas (TUG´s e TUE´s), tensão e etc.
Vamos supor que eu marque uma área e depois queira desfazer o processo, como eu poderia fazer o processo de [b:7d91f8de6f]UNDO[/b:7d91f8de6f] ou [b:7d91f8de6f] REDO[/b:7d91f8de6f]?

Agradeço desde já pelas respostas.


Eixox

Eixox

Responder

Posts

25/10/2004

Marcio.theis

você pode tentar o seguinte,

if Edit.HandleAllocated then
SendMessage(Edit.Handle, EM_UNDO, 0, 0);

no caso adicionei um edit e um botão, e no onclick coloquei este código, no caso deu certo...

espero ter ajudado...


Responder

Gostei + 0

25/10/2004

Marcelo Saviski

Eu fiz assim, pelo menos:

Toda vez que muda alguma coisa, vc tem que registrar isso, para isso teria as alterações que pudesse fazer assim:

TComando = (cmMoveu, cmAdicionou, cmRemoveu);


e depois um registro do que mudou:

  PUndo = ^TUndo;
  TUndo = record;
  case Comando: TComando of
    cmMoveu: (PosicaoAntiga: TPoint);
    cmAdicionou, cmRemoveu: (Referencia: {Uma refrência a oque removeu ou adicionou aqui);
end;


ai teria uma lista dessas alterações:

UndoList: TStack;


para registrar uma alteração:

var
  Undo: PUndo;
begin
  New(Undo)
  //se moveu:
  Undo.Comando := cmMoveu;
  Undo.PosicaoAntiga := Point(AntigoX, AntigoY);
  //se adicionou
  Undo.Comando := cmAdicionou;
  Undo.Referencia := ;
  //se removeu
  Undo.Comando := cmRemoveu
  Undo.Referencia := {O Que Foi Removido};
  UndoList.Push(Undo);  
end;


depois para desfazer:

var
  Undo: PUndo;
begin
  Undo := UndoList.Pop;
  //ai verifica qual foi a alteração feita e faz a operação reversa
  case Undo.Comando of
    cmMoveu: Posicao := PosicaoAntiga;
    cmAdicionou: //Remove o que adiciou
    cmRemoveu: //Readiciona
  end;
  Dispose(Undo);
end;


e p/ Limpar a Lista de comando p/ refazer ou quando finalizar:

var
  Undo: PUndo;
while UndoList.Count > 0 then
begin
  Undo := UndoList.Pop;
  case Undo.Comando of
    cmMoveu: //verifica se há alguma coisa que foi criada quado chmou Push e libera aqui, faz isso p/ todas as opções que requerem algo alocado
  end;
  Dispose(Undo);
end;


Isso é um pouco genérico, mas eu usei assim e funcionou. D
ê mais detalhes sobre como cv está fazendo.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar