Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Se borran la lineas dibujadas (https://www.clubdelphi.com/foros/showthread.php?t=82268)

CarlosAlberto 15-02-2013 23:11:51

Se borran la lineas dibujadas
 
Estimados amigos del Club
Ten el siguiente problema: al abrir una ventana cualquiera de otra aplicación se me borran las lineas dibujadas con la funciones "Moveto y lineto" del formulario que tengo abierto, ¿como puedo hacer para que esto no suceda?.
Muchas gracias y saludos.
Carlos Alberto

Al González 15-02-2013 23:49:15

Es demasiado corto tu mensaje para comprender a fondo lo que estás haciendo, usando qué y por qué. Sin embargo, quizá debas dibujar esas líneas en el evento OnPaint del formulario. :)

De la ayuda de Delphi:
Cita:

OnPaint event (TCustomForm)

Delphi syntax:

property OnPaint: TNotifyEvent;

Description

Use OnPaint to perform special processing when the form is redrawn. Any special painting on the form should be done in this event. OnPaint occurs before any controls on the form are painted.

To determine which portions of the form’s canvas need to be repainted, use the ClipRect property of the canvas.

If you use the form’s Canvas property outside the OnPaint event, it will be erased and drawn-over by the next OnPaint event.

nlsgarcia 16-02-2013 04:04:40

CarlosAlberto,

Cita:

Empezado por CarlosAlberto
al abrir una ventana cualquiera de otra aplicación se me borran las lineas dibujadas con la funciones "Moveto y lineto" del formulario que tengo abierto, ¿como puedo hacer para que esto no suceda?

En el evento OnActivate del formulario en cuestión coloca el siguiente código:
Código Delphi [-]
procedure TFormX.FormActivate(Sender: TObject);
begin
   Refresh;
end;
El código anterior refresca el formulario al hacer Click sobre este. Adicionalmente te sugiero verificar en el Setup de tu Sistema si puedes ampliar la memoria asignada a la Tarjeta de Video, lo cual suele ser la causa de este tipo de problemas de refrescamiento.

Cita:

Empezado por Delphi Help:
Call Refresh method to repaint the control immediately. Refresh calls the Repaint method. Use the Refresh and Repaint methods interchangeably.

Espero sea útil :)

Nelson.

CarlosAlberto 16-02-2013 14:39:26

Se borran las lineas dibujadas
 
Estimados amigos del club:
Gracias por sus repuestas pero hasta ahora se siguen borrando. En el evento OnActive del Form coloque "form1.Canvas.Refresh" pero no solucionó el problema. Explico con mas detalle: hice una aplicación en donde dibujo lineas horizontales y verticales en el canvas de un formulario, luego de dibujadas abro una aplicación por ejemplo el Word y al volver sobre mi aplicación me encuentro que las lineas dibujadas no están presentes en el formulario.
Saludos.
Carlos Alberto

Casimiro Notevi 16-02-2013 15:26:02

Cita:

Empezado por CarlosAlberto (Mensaje 455115)
En el evento OnActive

Te han comentado que lo pongas en el onactivate y en el onpaint, ¿has probado los dos?

ecfisa 16-02-2013 16:51:05

Hola Carlos.

Usando el evento OnPaint, como te sugiere Al, tendría que funcionar correctamente.

Ejemplo:
Código Delphi [-]
...
uses ShellApi;

procedure TForm1.DrawLines;
begin
  with Canvas do
  begin
    Pen.Width:= 3;
    MoveTo(40,100);
    LineTo(300,50);
    MoveTo(60,50);
    LineTo(350,90);
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  DrawLines
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Application.Handle, 'open', 'notepad.exe', nil, nil, SW_SHOWNORMAL);
end;
En el ejemplo, podrás comprobar que desplazando el notepad sobre las líneas del formulario, no se percibe el borrado de las mismas. En cambio si desactivas el llamado a DrawLines en el evento OnPaint (// DrawLines), el notepad se comporta como si fuese una goma de borrar.

Saludos.

nlsgarcia 16-02-2013 17:30:44

CarlosAlberto,

Cita:

Empezado por CarlosAlberto
...pero hasta ahora se siguen borrando. En el evento OnActive del Form coloque "form1.Canvas.Refresh" pero no solucionó el problema...

Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   i: Integer;
begin
   Canvas.FillRect(self.Canvas.ClipRect);
   Randomize;
   for i := 1 to 100 do
   begin
      Canvas.Pen.Color := RGB(Random(256), Random(256), Random(256));
      Canvas.LineTo(Random(ClientWidth), Random(ClientHeight));
   end;
end;
El código anterior dibuja 100 lineas de forma aleatoria sobre el Canvas de Form1, pero al redimensionar Form1 o superponer otra ventana sobre este, las líneas son Borradas en Runtime. Este código reproduce el problema de Persistencia de la Imagen descrito en tu requerimiento.

Revisa este código:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
   i: Integer;
   Image1 : TImage;
begin
   Image1 := TImage.Create(Self);
   Image1.Parent := Self;
   Image1.Height := ClientHeight;
   Image1.Width := ClientWidth;
   Image1.Canvas.FillRect(self.Canvas.ClipRect);
   for i := 1 to 100 do
   begin
      Image1.Canvas.Pen.Color := RGB(Random(256), Random(256), Random(256));
      Image1.Canvas.LineTo(Random(ClientWidth), Random(ClientHeight));
   end;
end;
El código anterior dibuja 100 lineas de forma aleatoria, pero con la diferencia de que no lo hace sobre el Canvas de Form1, sino sobre el Canvas de un control TImage creado en Runtime con las dimensiones de Form1 el cual resuelve el problema de Persistencia de la Imagen descrito anteriormente al redimensionar Form1 o superponer otra ventana sobre este.

Otra opción es el uso del evento OnPaint del formulario en cuestión descrito en mensajes previos.

Espero sea útil :)

Nelson.

Neftali [Germán.Estévez] 18-02-2013 11:05:14

Cita:

Empezado por CarlosAlberto (Mensaje 455115)
...En el evento OnActive del Form coloque "form1.Canvas.Refresh" pero no solucionó el problema. Explico con mas detalle: hice una aplicación en donde dibujo lineas horizontales y verticales en el canvas de un formulario, luego de dibujadas abro una aplicación por ejemplo el Word y al volver sobre mi aplicación me encuentro que las lineas dibujadas no están presentes en el formulario.

El problema es que estas líneas no son persistentes.
Si deseas que lo sean debes programar tú esa persistencia. Es decir, deberás redibujar esas líneas cada vez que sea necesario. Creo que ya te han comentado los eventos a utilizar.

CarlosAlberto 01-03-2013 01:18:18

Dibjuar lineas y que no se borren
 
Estimados amigos del club:
Muchas gracias por sus repuestas. Probé la del Sr. usuario Ecfisa "Drawlines" y funcionó.
Saludos.
Carlos Alberto


La franja horaria es GMT +2. Ahora son las 12:57:16.

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