Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Canvas dolor de cabeza+helpme (https://www.clubdelphi.com/foros/showthread.php?t=80025)

Comandant 29-08-2012 02:29:52

Canvas dolor de cabeza+helpme
 
Hola a todos este es mi primer post asi que espero hacerme entender.
Bien mi problema radica en que quiero copiar un canvas que creo en una imagen. Bien ya esta casi todo menos la ubicación exacta del canvas origen que aun no he podido resolver, ya que en el canvas destino me sale corrido. Desde ya muchas gracias.
//Creo k se puede probar al tok poniendo un timage y sus respectivos eventos.

Código:

...
public
var
alto, ancho, StartX, StartY : integer;
...
procedure TForm1.imagenMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
begin
//para sakar el inicio del canvas
StartX:= X;
StartY:= Y;
end;


procedure TForm1.imagenMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Origen, Destino, R: TRect;
begin
//realizar el canvas
Canvas.Brush.Style:= bsClear;
  with Canvas do
  begin
    R.Left := StartX;
    R.Top := StartY;
    R.Right := x;
    R.Bottom := y;
    Canvas.Rectangle(R);
    Origen:= R;
    Destino.Left := 0;
    Destino.Top := 0;
    Destino.Right := ancho;
    Destino.Bottom := alto;
    CopyRect( Destino, Imagen.Canvas, Origen );
  end;
end;


procedure TForm1.imagenMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
arriba, abajo, izquierda, derecha: integer;
begin
//para sakar el alto y el ancho
  if ssLeft in Shift then { make sure button is down }
  begin
    if Y > StartY then
      begin
      abajo:= Y;
      arriba:= StartY;
      end
    else
      begin
      arriba:= Y;
      abajo:= StartY;

      end;
    if X > StartX then
      begin
      izquierda:= StartX;
      derecha:= X;
      end
    else
      begin
      izquierda:= X;
      derecha:= StartX;
      end;
      alto:= abajo - arriba;
      ancho:= derecha - izquierda;
  end;
end;


Casimiro Noteví 29-08-2012 02:53:37

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags correctos al código fuente, ejemplo:



Y no olvides poner títulos descriptivos a tus preguntas, sirven luego para las búsquedas y ordenar los temas: "canvas dolor de cabeza+helme" no es ningún título descriptivo sobre lo que preguntas.

Gracias :)

Comandant 29-08-2012 04:42:05

Ok perdon no volvera a pasar, creo que no se puede editar titulo y aun así no se me ocurre ninguno jeje. Copiar selección del canvas a otro canvas se me ocurre

Casimiro Noteví 29-08-2012 10:43:00

Bueno, no te preocupes, es tu primer mensaje en estos foros y es normal que no lo supieras.

Lo del título sirve, entre otras cosas, porque al final de esta página aparecen enlaces con términos similares y puede que alguno sea lo que buscas.
En este caso, como puedes ver, han salido enlaces que no sirven para nada, al igual que el titulo que has puesto.

Creo que lo que quieres es copiar una imagen, supongo que de un TImage a otro sitio, a ver si alguien puede echarte una mano con eso.
Saludos.

escafandra 29-08-2012 14:10:49

Creo que es esto lo que quieres hacer:
Código Delphi [-]
var
StartX, StartY : integer;

procedure TForm1.ImagenMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Origen, Destino: TRect;
begin
  Origen.Left := StartX;
  Origen.Top := StartY;
  Origen.Right := x;
  Origen.Bottom := y;

  Destino.Left := 0;
  Destino.Top := 0;
  Destino.Right := abs(Origen.Left - Origen.Right);
  Destino.Bottom := abs(Origen.Top - Origen.Bottom);
  Canvas.Rectangle(Destino);
  Canvas.CopyRect(Destino, Imagen.Picture.Bitmap.Canvas, Origen);
end;

procedure TForm1.ImagenMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StartX:= X;
  StartY:= Y;
end;



Saludos.

Comandant 29-08-2012 19:19:37

Hola nuevamente, agradezco por su atención y estoy en deuda, aunque hoy estuve viendo mi código y me anduvo muy bien, nose porque la otra vez no me dio el resultado esperado me quede pensando en el porque?, Bien escafandra tu código es lo mismo que el mio nada mas que mas simplificado y me diste nuevas ideas con el valor absoluto, porque había probado de sumar a su left el width de un elemento dado y a veces me daba excepciones por el número negativo, dejo avisando que ambos códigos tienen un problema y es que cuando haces un rectángulo de derecha a izquierda da como un resultado final una imagen tipo espejo, no creo que sea muy difícil de solucionar así que me pondré a trabajar. Desde ya muchas Gracias

Aqui esta código final para los que lo quieran, obviamente el resto ya lo saben...

Código Delphi [-]
procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Origen, Destino: TRect;
begin
//realizar el canvas
Canvas.Brush.Style:= bsClear;
  with Canvas do
  begin
    if StartX > X then
      begin
      Origen.Left := X;
      Origen.Right := StartX;
      end
    else
      begin
      Origen.Left := StartX;
      Origen.Right := x;
      end;
    if StartY > Y then
      begin
      Origen.Top := Y;
      Origen.Bottom := StartY;
      end
    else
      begin
      Origen.Top := StartY;
      Origen.Bottom := y;
      end;
    Canvas.Rectangle(Origen);
    Destino.Left := 0;
    Destino.Top := 0;
    Destino.Right := abs(Origen.Left - Origen.Right);
    Destino.Bottom := abs(Origen.Top - Origen.Bottom);
    CopyRect( Destino, Image1.Canvas, Origen);
  end;
end;

escafandra 29-08-2012 21:05:27

Cita:

Empezado por Comandant (Mensaje 441100)
cuando haces un rectángulo de derecha a izquierda da como un resultado final una imagen tipo espejo...

Puedes simplificarlo así:
Código Delphi [-]
uses Math;
var
StartX, StartY : integer;

procedure TForm1.ImagenMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Origen, Destino: TRect;
begin
  Origen.Left := Min(StartX, x);
  Origen.Top := Min(StartY, y);
  Origen.Right := Max(StartX, x);
  Origen.Bottom := Max(StartY, y);;

  Destino.Left := 0;
  Destino.Top := 0;
  Destino.Right := abs(Origen.Left - Origen.Right);
  Destino.Bottom := abs(Origen.Top - Origen.Bottom);
  Canvas.Rectangle(Destino);
  Canvas.CopyRect(Destino, Imagen.Picture.Bitmap.Canvas, Origen);
end;

procedure TForm1.ImagenMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StartX:= X;
  StartY:= Y;
end;


Saludos.


La franja horaria es GMT +2. Ahora son las 05:16:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi