Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2007
juanfergl juanfergl is offline
Miembro
 
Registrado: ago 2006
Posts: 23
Poder: 0
juanfergl Va por buen camino
Envento OnCreate para todos los Forms

Hola señores.

En el dia de hoy tengo la siguiente inquietud

-Tengo una aplicacion MDI con 100 forms que se crean en ejecucion, segun lo requiera el usuario

resulta que deseo hacer que cada form en su evento OnCreate() ejecute una instruccion, seria muy dispendioso copiar la instruccion en cada form, hay alguna forma de que cada vez que se intente crear una de esas pantallas pase primero por otro evento oncreateXX() desde mi formulario MDI

Gracias.
Responder Con Cita
  #2  
Antiguo 25-01-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
puedes aplicar herencia o podrias hacer algo como esto
Código Delphi [-]
procedure mifuncion(Sender: Tobject);
begin
end;

var
  x : TForm;
begin
  x := Tform.create(self);
  x.onCreate = mifuncion;
end;
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 25-01-2007
juanfergl juanfergl is offline
Miembro
 
Registrado: ago 2006
Posts: 23
Poder: 0
juanfergl Va por buen camino
Gracias por la Respuesta

Precisamente eso es lo ke kiero evitar,
deseo detectar que ventana se va a crear y en ese momento adicionarle el nuevo evento

Gracias por la respuesta
Responder Con Cita
  #4  
Antiguo 26-01-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal vez como dice el compañero puedas preparar un formulario del que heredarán los que sean menester. Puedes hacerlo "visualmente", creando el formulario y añadiéndolo al inspector de objetos de Delphi. En todo caso la cosa sería más o menos así, en mi opinión:

Código Delphi [-]

type
  TFormEx = class(TForm)
  public
    constructor Create(AOwner: TComponent); override; 
  end;

{ TFormEx }

constructor TFormEx.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  
  {...}
end;

Y a partir de ahí a heredar de "TFormEx", es decir:

Código Delphi [-]

type
  TForm1 = class(TFormEx)
  end;

Para que cuando crees una instancia de "TForm1" se ejecute el constructor de "TFormEx", en el que puedes codificar... aquello que necesites.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 26-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues se me ha ocurrido algo que puede ser interesante, un programa que modifique todos los archivos de una sola tacada.

Partimos de la base que los .pas son ficheros de texto planos, así que podemos cargarlos en un Memo ¿o no?

Pues vale, preparamos un programa que pueda abrir múltiples archivos (opendialog con multiselect a true) y procedemos a abrirlos secuencialmente.

(Necesitamos una rutina PosEx(substring, cadena:string, index:integer):Integer que pueda buscar el substring dentro de la cadena, a partir del indice index, hay rutinas por la red de este tipo)

Ahora cargamos el contenido del .pas en un StringList y buscamos el texto "class(TForm)", se supone que esa parte de nuestro .pas jamás lo hemos modificado, ya que todos heredan de él.
línea que buscamos:
Código Delphi [-]
 TFrmClientes = class(TForm)

Pues ya solo queda buscar el texto TFrmclientes.FormCreate y encontramos el constructor. Buscamos el próximo "begin" y después insertamos las líneas de código que queramos.

Otra opción es abrir el .dfm (si es texto) y buscar el nombre del evento OnCreate de cada Form, de esa forma no tenemos que buscar tantas veces en el .pas, además solventa un posible error de cambio de nombre del evento, hay veces que en el inspector de objetos, en lugar de dar doble clic, escribimos un nombre y entonces el evento no sigue el patrón descrito en la primera opción.

Edito: acabo de ver la opción del dfm y es mucho más interesante, precisamente porque la primera linea del archivo nos da el tipo de la clase "Tfrmgrupo" en este caso, después solo queda buscar un texto "OnCreate" eso si, siempre y cuando no haya la palabra "object" antes.
Código Delphi [-]
object frmgrupo: Tfrmgrupo
  Left = 339
  Top = 142
  Caption = 'Grupos de caja'
  ClientHeight = 391
  ClientWidth = 571
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsMDIChild
  OldCreateOrder = False
  Position = poMainFormCenter
  Visible = True
  OnClose = FormClose
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object tlb1: TToolBar
    Left = 0

Saludos

Salvamos el StringList y cargamos el siguiente.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 26-01-2007 a las 12:22:46.
Responder Con Cita
  #6  
Antiguo 26-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ya puestos, podríamos crear un programa que le añada herencia a los 100 Forms, y añada el "uses " correspondiente.

Solo tenemos que buscar "uses" en el .pas y añadir el formulario base que queremos crear, después buscar "class(TForm)" y sustituir ese "TForm" por "UBaseForm" siendo éste último nuestra forma de la que heredan todos.

(Quizás es más complejo, porque tendríamos que añadir el "override" en el OnCreate de cada Form hijo, y su llamada "inherited Create (AOwner);")

Al final te veo copiando y pegando ...

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 26-01-2007 a las 12:38:58.
Responder Con Cita
  #7  
Antiguo 26-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La idea es magnífica. De hecho ayer que vi este hilo, lo primero que hice fue ver si las gexperts tenían algo similar, pero creo que no ¡Ya estoy esperando tu wizard que lo haga!

// Saludos
Responder Con Cita
  #8  
Antiguo 26-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por roman
La idea es magnífica. De hecho ayer que vi este hilo, lo primero que hice fue ver si las gexperts tenían algo similar, pero creo que no ¡Ya estoy esperando tu wizard que lo haga!

// Saludos
... Por supuesto hablas con juanfergl ¿no?

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 30-01-2007
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
En realidad yo tambien estaba necesitando algo similar.

Otra alternativa de la que comenta Lepe es usar el evento OnActiveFormChange de la clase TScreen y verificas que el control sea un TForm.

El problema es que estas capturando el evento Active y no el verdadero create, pero te muestro como parchearlo.

igualmente te dejo un poco de codigo:

en el Form Create de tu MainForm escribes (tambien puede ser otro lado)
Código Delphi [-]
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Screen.OnActiveFormChange := FormActiveFormChange;
end;

donde FormActiveFormChange es el nombre de tu metodo.

Luego:
Código Delphi [-]
Procedure TMainForm.FormActiveFormChange(Sender:TObject);
Begin
  if (Screen.ActiveForm is TForm) then  // solo verificamos
     if Screen.ActiveForm.Tag <> 1 then
     begin
       Screen.ActiveForm.Tag:=1;  // de esta forma sabemos si ya se creo o no
       .....  // todo tu codigo
    end;
end;

igualmente si alguien sabe de otro metodo mejor que comente.

Estuve realizando algunas pruebas intentando capturar el mensaje de windows WM_CREATE, pero al parecer este solo lo envia a la ventana que se esta creando.

Tambien probe con Application.OnMessage, pero envia casi todos los mensajes menos WM_CREATE, en realidad en la ayuda lo avisaba.

No se cual otra queda . Seguro que capturando otro mensaje de windows, pero todavia no encontre cual.
__________________
[Crandel]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear Form en ejecucion y OnCreate FGarcia Varios 2 17-06-2006 16:02:04
ShowMessage dentro de OnCreate gluglu Varios 3 13-11-2005 16:44:04
Organizar ventanas y ver todos los forms recata Varios 2 11-10-2005 17:26:33
Saludo para todos edwin1 OOP 4 08-10-2003 15:51:04
Felix día para todos edwin1 OOP 3 06-10-2003 17:58:17


La franja horaria es GMT +2. Ahora son las 07:25: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
Copyright 1996-2007 Club Delphi