Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Deshabilitar Control !!! (https://www.clubdelphi.com/foros/showthread.php?t=14976)

vpepen 06-10-2004 15:02:14

Deshabilitar Control !!!
 
Hola Foro:

Tengo el siguiente problemita: Necesito deshabilitar un control y que no guarde ningún evento mientras esté deshabilitado.

Por ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
Button1.Enabled := False;
for i := 1 to 2000 do begin
Label1.Caption := IntToStr(i);
Label1.Repaint;
end;
Button1.Enabled := True;
end;

Si el usuario hace clic en el botón, se iniciará el contador y deshabilitará el botón, pero mientras el botón está deshabilitado, si el usuario hace clic de nuevo, cuando finalice el proceso repetirá el conteo otra vez, cuando no debería de hacerlo, ya que el control está deshabilitado.

Las gracias anticipadas,

Víctor.-

vic_ia 06-10-2004 17:48:41

hola....

se me ocurre que en lugar de deshabilitarlo deberias desasignar el procedimiento al evento OnClick del Boton... algo asi como ...

Código Delphi [-]
...
Botton1.OnClick := nil;
....  // tu proceso
Botton1.OnClick := Button1Click;
espero te funcione....

saludos...

vpepen 07-10-2004 14:20:12

Hola Vic ia:

La verdad es que probé la opción presentada por ti, pero no me resultó, aparentemente sigue reconociendo el onclick:

Código Delphi [-]

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  Button1.OnClick := Nil;
  For i := 1 to 5000 do begin
      Label1.Caption := IntToStr(i);
      Label1.Repaint;
  end;
  Button1.OnClick := Button1Click;
end;

maeyanes 07-10-2004 15:47:51

Si lo que quieres es que después de ejecutar el contador no se pueda hacer de nuevo, tienes 2 opciones

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;

begin
  Button1.Enabled := False;  // Deshabilitar el botón o
  Button1.OnClick := nil;      // Quitar el manejador de evento
  For i := 1 to 5000 do begin
      Label1.Caption := IntToStr(i);
      Label1.Repaint;
  end
end;

El chiste es no regresarlo a su estado anterior... o sea, si lo deshabilitas, no lo vuelva a habilitar al final del proceso...


Espero que te sirva...


Saludos...

vpepen 08-10-2004 14:17:57

Hola Marcos,

Sucede lo siguiente, yo no quiero que el usuario pueda hacer clic sobre el botón mientras esté ejecutándose el proceso, pero si quiero, que cuando termine le permita ejecutarlo de nuevo, es decir, necesito regresarle su estado anterior.

Las dos opciones:
Button1.Enabled := False; // Deshabilitar el botón o
Button1.OnClick := nil; // Quitar el manejador de evento

son buenas, pero no resuelven el problemita, ya que al usuario dar clic sobre el botón desactivado, cuando termina el proceso vuelve e inicia, es decir, el botón me está funcionando aunque esté deshabilitado.

Espero haberme explicado bien,

Víctor.-

basti 08-10-2004 14:29:56

Hola.

Puedes poner Application.ProcessMessages antes de habilitar el botón, no te hace falta deshabilitar el evento.

un saludo

maeyanes 08-10-2004 15:44:02

Cita:

Empezado por vpepen
Hola Marcos,

Sucede lo siguiente, yo no quiero que el usuario pueda hacer clic sobre el botón mientras esté ejecutándose el proceso, pero si quiero, que cuando termine le permita ejecutarlo de nuevo, es decir, necesito regresarle su estado anterior.

Las dos opciones:
Button1.Enabled := False; // Deshabilitar el botón o
Button1.OnClick := nil; // Quitar el manejador de evento

son buenas, pero no resuelven el problemita, ya que al usuario dar clic sobre el botón desactivado, cuando termina el proceso vuelve e inicia, es decir, el botón me está funcionando aunque esté deshabilitado.

Espero haberme explicado bien,

Víctor.-

Hasta donde se y he usado, un botón con su propiedad Enabled := False no se puede utilizar.

Pero puedes intentar esto:

Código Delphi [-]
type
  Form1 = class(TForm)
    // Declaraciones aquí
  private
    FProcessDone: Boolean;
    // Más declaraciones aquí
  end;

implementation

constructor Form1.Create(AOwner: TComponent);
begin
  // Tu código
  FProcessDone := False
end;

procedure Button1.OnClick(Sender: TObject);
var
  i: Integer;

begin
  if not FProcessDone then
  begin
    Button1.Enabled := False;
    For i := 1 to 5000 do
    begin
      Label1.Caption := IntToStr(i);
      Label1.Repaint;
    end;
    Button1.Enabled := True;
    FProcessDone := True
  end
end;

Con esto lograrás que el proceso solo se ejecute la primera vez que des click en el botón...


Espero que te sirva...


Saludos...


La franja horaria es GMT +2. Ahora son las 13:58:55.

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