PDA

Ver la Versión Completa : Ayuda con este problema


Suriu
30-03-2012, 23:17:35
Hola, estoy creando una aplicacion que realiza algo paresido al pincel en el paint, pero utilizando la propiedad canvas de in TImagen. E estado mirando por hay y ya he hecho algo parecido.

El TImagen es de color predeterminado ( Blanco ) y sobre este pinto una linea de estilo libre mediante canvas.Pen, la cual pongo en blanco mediante el evento OnCreate del Form; y en megro mediante un Timer la propiedad Interval en 1000 , para que al acabar el tiempo lanse un evento mediante el OnTimer que cambie el canvas.Pen a negro.

Hasta aqui todo bien el problema es que al hacer clik en el TImagen me enpiesa a pintar en blanco y trascurrodo el tiempo es que empiesa a pintar en negro. Este es el problema " como diminuir el tiempo para cambiar de un color a otro de forma que paresca instantaneo ". La otra pregunta seria " Como hacerlo sin el Timer".

Codigo:


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, Buttons,ExtCtrls, ShellAPI, TypInfo;

type
TForm2 = class(TForm)
Image11: TImage;
Timer1: TTimer;
procedure Image11MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image11MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image11MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Image11DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
img: TImage;
end;

var
Form2: TForm2;

implementation

uses Unit3, Unit1;

{$R *.dfm}

var
Rect: TRect = (Left: -1);
z,c: integer;
hola : boolean;

procedure TForm2.Image11MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Rect.TopLeft := Point(X,Y);
Rect.BottomRight := Point(X, Y);
hola := true;
Timer1.Enabled := true;
end;

procedure TForm2.Image11MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Rect.Left > -1 then
Rect.TopLeft := Point(X,Y);
z := x;
c := y;
if hola then
Image11.Canvas.LineTo(x,y);
end;

procedure TForm2.Image11MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Rect.Left := -1;
hola := false;
Image11.Canvas.Pen.Color := clWhite;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Image11.Canvas.Pen.Color := clWhite;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
Image11.Canvas.Pen.Color := clBlack;
Timer1.Enabled := false;
end;

procedure TForm2.Image11DblClick(Sender: TObject);
begin
hola := False;
end;

end.

ecfisa
30-03-2012, 23:23:00
Hola Suriu.

Por favor recuerda poner a tus mensajes títulos significativos, "Ayuda con este problema" no dice mucho sobre el mismo. También es importante que ubiques tus mensajes en los foros correspondientes, el mensaje no tiene que ver con el foro: Sistemas operativos > Windows.

Saludos y gracias por tu colaboración. :)

CSIE
02-04-2012, 12:58:45
La verdad es que no entiendo cuál es el problema.

Mirando el código puedo ver que el pen lo pones a blanco en el create del form, pero también el el mouseup y lo cambias a negro en el timer (tras 1 segundo) y el timer lo activas cada mousedown. ¿era eso lo que buscabas?

Saludos

ElDioni
02-04-2012, 13:46:41
Hola,

¿Porqué utilizas un timer?, si pones el color del pen a black en el onmousedown funciona igual que poniendolo en el timer y empieza a pintar directamente.

Saludos.