Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Frames. ¿Existe un evento similar a onActivate? (https://www.clubdelphi.com/foros/showthread.php?t=61680)

adebonis 18-11-2008 00:13:26

Frames. ¿Existe un evento similar a onActivate?
 
Hola.

Tal como digo en el título, ¿existe en un Frame un evento similar al onActivate de un Form?.

El caso es que necesito que, una vez presentado un Frame, se ejecute un cierto código. Pero debe ejecutarse una vez se haya visualizado el Frame y no antes. El evento onResize se ejecuta antes de visualizarse el frame pero no después.

Gracias.
Adolfo Bonis
Barcelona

droguerman 18-11-2008 02:42:47

Tuve el mismo problema que tú y la única manera de solucionarlo que encontré fue usar OnEnter

kasper 18-11-2008 08:07:34

Yo lo que hice fue realizar un procedimiento o función, dependiendo del caso, que realice lo que quieres hacer antes de que se muestre y después, invocarla.

Espero que te haya ayudado. Saludos.

Lepe 18-11-2008 09:15:34

El frame estará en un contenedor, muy posiblemente un Form, allí puedes usar el OnShow y llamar al procedimiento que hizo kasper.

Caro 18-11-2008 15:44:08

Hola adebonis, yo utilizo el OnShow del formulario si es que mi Frame ya esta cargado en el formulario en cuestion y el procedimiento estaría en el Frame, el cual lo llamo en el OnShow del formulario. Ahora si el frame se cargara en ejecución, lo haría justamente despues de haber insertado el Frame en el formulario.

Saluditos

Lepe 18-11-2008 15:56:11

Cita:

Empezado por Caro (Mensaje 326617)
Ahora si el frame se cargara en ejecución, lo haría justamente despues de haber insertado el Frame en el formulario.

Casi mejor modificar el constructor del Frame, así no tienes ni que llamarlo.

Código Delphi [-]
public
   constructor create(AOWner:TComponent);override;


implementation

constructor TFrame.create(AOWner:TComponent);
begin
   inherited;
   Tu_función_a_ejecutar;
end;

Saludos

Caro 18-11-2008 16:10:33

Cita:

Empezado por Lepe (Mensaje 326618)
Casi mejor modificar el constructor del Frame, así no tienes ni que llamarlo.

Sería muchísimo mejor pero no me esta funcionando, entiendo lo sobrescribir el constructor, puse el codigo tal cual lo pones arriba y en la creación e inserción del Frame lo hago de esta forma.

Código Delphi [-]
 Frame : TFrame2;

begin
 Frame := TFrame2.Create(Self);
 InsertControl(Frame);

pero no me muestra el Frame en el formulario, si lo hago sin sobreescribir el constructor lo muestra.

Saluditos

droguerman 18-11-2008 22:41:29

debes forzar la entrada al control usando SetFocus, así puedes controlar el evento OnEnter

Otra solución puede ser creando un derivado de TFrame y creando una función que maneje el mensaje CM_VISIBLECHANGED, con un poco de código lo tienes resuelto.

Lepe 19-11-2008 00:00:04

En ese caso concreto no vale mi respuesta, ¡tenías que poner la excepción que cumple la regla! :p

La función a ejecutar debe estar definida dentro del Frame. InsertControl (en este caso concreto) pertenece a la ventana donde será insertada el frame. Tu código es equivalente a :
Código Delphi [-]
Form1.InsertControl(Frame)

que podría ejecutarse así:
Código Delphi [-]
constructor TFrame.create(AOWner:TComponent);
begin
   inherited;
   self.Parent := AOWner;
end;
Cita:

Empezado por Ayuda de InsertControl
Applications should not need to call InsertControl directly. Child controls are automatically inserted and removed when added or deleted at design time. At runtime, use the Parent property of the child control to insert it in the Controls array. I

Saludos

roman 19-11-2008 03:28:56

A mi me gustaría ver cuál es la operación que usa Caro en el constructor. Según yo entendí, no es que ahí use InsertControl, sinio que ésta es la forma en que inserta el marco.

Yo hice una pequeña prueba redefiniendo el constructor del marco y no tuve ningún problema; se visualiza correctamente, tanto usando InsertControl como asignando el Parent.

// Saludos

Caro 19-11-2008 13:47:28

1 Archivos Adjunto(s)
Holitas Roman y Lepe, les adjunto la pruebita que hice, con el parent si funciona, me muestra el Frame, pero con InsertControl no, he probado con InsertControl, self.InsertControl, Form1.InserttControl y nada, no muestra el Frame, tengo una pregunta mas, me he creado dos instancias de TFrame3, pero cuando se crea una y al crear la otra me sale "A component named Frame3 already exists", ¿no se puede crear mas instancias de un Frame?.

Saluditos

Lepe 19-11-2008 14:26:23

échale una visual al calendario con frames, es el mismo frame creado 30 veces.

Básicamente, antes de asignar el Parent, debes darle un nombre único en todo ese Form. Puedes usar un contador en esa ventana que se va incrementando:
Código Delphi [-]
Frame2 := Tframe2.Create(self);
Frame2.Name := 'Frame'+ inttostr(contador);
inc(contador); // variable global en este Form
Frame2.setBounds(0, 0, 100,100);

 // ahora que ya tiene un nombre único, lo añadimos al padre.
Frame2.Parent := self;

Saludos

Caro 19-11-2008 14:47:22

Cita:

Empezado por Lepe (Mensaje 326771)
Básicamente, antes de asignar el Parent, debes darle un nombre único en todo ese Form. Puedes usar un contador en esa ventana que se va incrementando:

Pense que le había dado nombres, que verguenza :o, en que estare pensando. Sobre el SetBound no lo conocía. Muchísimas gracias Lepe.

¿Sobre el Frame que no aparece con InsertControl, lo has probado?

Saluditos

roman 19-11-2008 18:02:49

Hola,

No hace falta pelearse con nombres únicos. Basta poner Name := ''.

// Saludos

Caro 19-11-2008 18:16:53

Cita:

Empezado por roman (Mensaje 326810)
Basta poner Name := ''.

Que interesante, eso tampoco lo sabía, acabo de hacer la prueba y si funciona, muchas gracias amiguito.

Roman has probado sobre esta parte:

Cita:

Empezado por Caro (Mensaje 326768)
.....les adjunto la pruebita que hice, con el parent si funciona, me muestra el Frame, pero con InsertControl no, he probado con InsertControl, self.InsertControl, Form1.InserttControl y nada, no muestra el Frame

Solo es curiosidad, ya que como funciona con el parent lo hare de esa forma al final.

Saluditos

roman 19-11-2008 18:26:14

Cita:

Empezado por Caro (Mensaje 326815)
Roman has probado sobre esta parte:

Ya probé y, en efecto, falla, je, je, pero todavía no sé bien porqué. Ayer cuando hice la prueba me limité a poner:

Código Delphi [-]
constructor TFrame2.create(AOWner:TComponent);
begin
 inherited;
end;

:D

con lo cual no fallaba. Es al poner el método limpiar que falla. Haciendo una traza de SetParent (cuando se pone Parent := Self):

Código Delphi [-]
  if Parent <> nil then UpdateActionLists(opRemove);

  if (Parent = nil) and HandleAllocated then
    DestroyHandle;

  inherited;
  if Parent <> nil then UpdateActionLists(opInsert);

veo que si no se usa limpiar, el condicional de enmedio no se ejecuta, mientras que al usar limpiar, en algún momento se fuerza a crear el Handle del marco lo que obliga la llamada al DestroyHandle. Pero hasta ahí he llegado, todavía no sé en qué parte exactamente afecta.

// Saludos

Lepe 19-11-2008 20:15:17

Yo me echo a temblar cada vez que leo eso de "Applications should not need to call xxx directly", sobre todo cuando he usado ese xxx desde hace mucho :D.

Ya me ha pasado "cosas raras" como las que comenta Caro.

Saludos

roman 19-11-2008 21:06:59

Y sí, claro. Si la documentación lo dice, por algo será :). Pero como dice Caro, ya es más que nada por curiosidad.

// Saludos

Caro 21-11-2008 13:03:23

Perdon por responder recien, como les dije no hay problema, con el Parent ya es suficiente, muchas gracias amiguitos.

Saluditos

Lepe 21-11-2008 13:26:50

Cita:

Empezado por roman (Mensaje 326859)
Y sí, claro. Si la documentación lo dice, por algo será :). Pero como dice Caro, ya es más que nada por curiosidad.

// Saludos

Ah, creí que yo era el único "curiosón" en este foro, que alegría ver que no estoy solo :)

Saludos


La franja horaria es GMT +2. Ahora son las 20:40:41.

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