Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como me entero de ke delphi termino de crear la forma? (https://www.clubdelphi.com/foros/showthread.php?t=77352)

Anel Hernandez 17-01-2012 19:26:36

Como me entero de ke delphi termino de crear la forma?
 
Hola,

Necesito saber si existe alguna propiedad ke me diga si ya termino de crear la form1. La principal.

Lo ke me pasa es que cuando se crea la forma se me activan varios procedimientos que tengo en onclick de varios componentes y kiero ponerle como condicion ke se ejecuten solo despues de creada la forma.

Lo hice creando una variable boolean que cuando se crea la forma se hace true. pero kisiera saber si delphi me lo puede decir sin tener ke crear una variable adicional.

saludos y gracias

roman 17-01-2012 19:37:07

Pues ¿qué no para eso es el evento OnCreate?

// Saludos

ecfisa 17-01-2012 19:51:59

Cita:

y kiero ponerle como condicion ke se ejecuten solo despues de creada la forma.
Hola.

Una opción podría ser:
Código Delphi [-]
...
const
  WM_AFTER_CREATE = WM_USER + 100;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
  public
  end;
...
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Acciones que se ejecutarán en la creación
  PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
end;

procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
  // Acciones que se ejecutarán después de la creación
end;
...

Saludos.

roman 17-01-2012 20:12:09

Sigo sin ver la necesidad de esto. En Delphi, a menos que OldCreateOrder sea true, el evento OnCreate se llama una vez que el formulario y sus componentes se han terminado de construir. De hecho, la VCL, una vez terminado el constructor Create, llama al método AfterConstruct (que vendría siendo el equivalente al PostMessage) y desde ahí se llama al evento OnCreate.

// Saludos

Anel Hernandez 17-01-2012 20:22:38

re
 
Hola,

parece ke no me explike bien.

por supuesto ke pasa por el oncreate. pero eso es un evento y necesito una propiedad.

lo ke me pasa es ke cuando pasa por el oncreate actualizo varios componentes y entonces se me activan varios eventos onclick.

lo ke kisiera es ke en esos eventos onclick comprobar si ya la forma esta creada para ke se ejecuten sus acciones si no, no.

hasta ahora tengo un boolean que se hace true al finalizar el oncreate. lo ke kiero saber es si delphi tiene alguna propiedad ke me indike ke la la forma principal se creo sin tener ke programar nada adicional, ni crear variables nuevas, ni constantes.

algo asi como:

if sender.abierto then ...

gracias mil

Anel Hernandez 17-01-2012 20:26:13

Hola,

bueno si es como dice roman, entonces lo ke necesito es enterarme si Delphi cambia alguna propiedad luego de ejecutarse el oncreate.

Gracias

ecfisa 17-01-2012 22:59:54

Hola Anel.

Veo que no comprendí lo que buscabas en tu primer mensaje y debo reconocer que todavía no termino de entender lo que deseas hacer... :o


Cita:

una vez terminado el constructor Create, llama al método AfterConstruct (que vendría siendo el equivalente al PostMessage) y desde ahí se llama al evento OnCreate.
Roman, con respecto al órden que mencionas, y por favor corrígeme si estoy equivocado, siempre tuve la idea que el órden era: Create -> OnCreate -> AfterConstruction.

Hice una pequeña prueba y pareciera comportarse de ese modo.
Código Delphi [-]
...
constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  ShowMessage('Create');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage('OnCreate');
end;

procedure TForm1.AfterConstruction;
begin
  inherited;
  ShowMessage('AfterConstruction');
end;
...

Saludos

roman 17-01-2012 23:43:57

Je, je, claro. Pero estás haciendo trampa :D

Ponlo así:

Código Delphi [-]
procedure TForm1.AfterConstruction;
begin
  ShowMessage('AfterConstruction');
  inherited;
end;

Tal como lo tienes, se ejecuta primero tu AfterConstruction pero antes del ShowMessage llamas a inherited y éste llama a tu FormCreate y por eso ves antes el ShowMessage del OnCreate. Pon puntos de ruptura en los begin correspondiente y verás el orden real.

En cuanto a la pregunta de la compañera, pues no vería cuál es el problema, esto es, no habría que verificar nada pues el sólo hecho de que ejecute el OnClick de un componente en el OnCreate del formulario, ya garantiza que el formulario ha sido creado.

// Saludos

roman 17-01-2012 23:48:49

Para mayor claridad, este es el código de TCustomForm.AfterConstruction:

Código Delphi [-]
procedure TCustomForm.AfterConstruction;
begin
  if not OldCreateOrder then DoCreate;
  if fsActivated in FFormState then
  begin
    Activate;
    Exclude(FFormState, fsActivated);
  end;
end;

mientras que DoCreate es así:

Código Delphi [-]
procedure TCustomForm.DoCreate;
begin
  if Assigned(FOnCreate) then
  try
    FOnCreate(Self);
  except
    if not HandleCreateException then
      raise;
  end;
  if fsVisible in FFormState then Visible := True;
end;

Ahí es donde se llama a OnCcreate, a menos, que OldCreateOrder sea true.

// Saludos

ecfisa 18-01-2012 00:06:33

Cita:

Empezado por roman (Mensaje 423188)
Tal como lo tienes, se ejecuta primero tu AfterConstruction pero antes del ShowMessage llamas a inherited y éste llama a tu FormCreate y por eso ves antes el ShowMessage del OnCreate

Muchas gracias por la aclaración, nunca es tarde para corregir conceptos ;).

Un saludo. :)

Anel Hernandez 18-01-2012 00:24:07

Hola,

de nuevo y con otras palabras.

en mi aplicacion, en el evento oncrete tengo varias asignaciones a propiedades de componentes:

text1.edit:=... parametro ke leo de fichero
text2.edit:=... idem
checkbox1.checked:= true si del fichero se lee una condicion que lo pone en true
etc....

y asi le asigno propiedades a varios componentes.

al hacer esto, se activan varios eventos .onclick de los componentes actualizados. yo desearia ke esos eventos onclick se activaran solo cuando se diera click sobre ellos y no cuando se esta lanzando el programa y se ejecuta el evento .oncreate de la form principal.

la idea ke se me ocurrio fue poner una variable boolean global (abierto) ke se le asigna true al final del .oncreate y en los .onclick de los componentes la condicion if abierto then etc.

La pregunta es si hay alguna propiedad de la forma principal, o de algun componente de mi aplicacion ke me permita determinar si ya se concluto de lanzar mi aplicacion y no tener ke crear una nueva variable.

La pregunta tambien pudiera ser si hay alguna manera de ke no se ejecuten los eventos .onclick cuando se esta lanzando la aplicacion de alguna otra via.

gracias mil

ecfisa 18-01-2012 00:32:13

Hola Anel.

Ahora creo entenderte... me parece que de este modo vas a lograr lo que buscas, por ejemplo:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ...
    procedure FormCreate(Sender: TObject);
    ...
    procedure FormDestroy(Sender: TObject);
  private
    procedure Edit1Change(Sender: TObject);
    ...
  public
  end;
...
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Asignar valores a propiedades de componentes
  Edit1.Text:= 'xxxx';
  ...
  // Asignar eventos
  Edit1.OnChange:= Edit1Change; // Evento asignado posteriormente (no se dispara OnChange)
  ...
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ShowMessage('CHANGE');
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
   // Desasignar
   Edit1.OnChange:= nil;
  ...
end;
Claro que previamente tendrías que quitar los eventos asignados por código desde el Object Inspector

Saludos.

roman 18-01-2012 00:35:44

Cita:

Empezado por Anel Hernandez (Mensaje 423191)
yo desearia ke esos eventos onclick se activaran solo cuando se diera click sobre ellos y no cuando se esta lanzando el programa y se ejecuta el evento .oncreate de la form principal.

¡Ah pues! Esto es mucho más claro. Una forma de comprobar podría ser, en los eventos OnClick examinar la proiedad Visible del formulario, que estará en false en el OnCreate.

// Saludos

Neftali [Germán.Estévez] 18-01-2012 12:43:26

Otra opción diferente a las comentadas, es utilizar el procedimiento Loaded.
Sobreescribirlo e inicializar lo que necesitas después del inherited.

roman 18-01-2012 17:25:42

Pero viene a ser lo mismo. Una asignación como

Código Delphi [-]
CheckBox1.Checked := true;

en el método Loaded de todas maneras activa el evento OnClick del CheckBox por lo que se tendría aún que verificar si se activó por el usuario o por la asignación.

// Saludos

maeyanes 18-01-2012 19:58:41

Hola...

A mi solo me quedó la duda: ¿será que al teclado de Anel le falla la tecla Q? ;)


Saludos...

Anel Hernandez 20-01-2012 02:15:43

Hola,

gracias. Al final he resuelto con la propiedad visible. Muchas Gracias.

Lo de la K por Q se debe a Que escribo desde un lugar con una conexion muy lenta y debo escribir muy rapido porque se cae constantemente.

saludos y gracias


La franja horaria es GMT +2. Ahora son las 15:31:19.

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