Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
¿código adecuado? Perdona D&W, pero no se ha dicho si quiere una instancia o varias del mismo Form, hecho que nos haría modificar bastante nuestro código.

Tampoco se dice si se quiere tener una referencia a la ventana creada, o no le importa.

Código adecuado no creo que exista, lo tendrá que adaptar a sus necesidades y a su gusto. Al menos yo pretendía dar ideas, después él tendrá que adaptarlo.

Cita:
Empezado por D&W Ver Mensaje
Código Delphi [-]
Procedure TMainForm.CreateOrRestoreForm(aForm : TForm);
1  if not Assigned(aForm) Then begin
2    aForm := TFormClass(aForm).Create(Application);
3    aForm.Show;
4  end
5  else begin
6    if aForm.WindowState = wsMinimized then  
7        aForm.WindowState := wsNormal;
8    aForm.BringToFront;
9  end;
En cuanto a tu código, no entiendo muy bien como harías una llamada a esa rutina, porque el parámetro es de tipo TForm y después haces un moldeo de tipos a TFormClass en la línea 2. Que conste que no es una crítica, es más bien una duda.


Otros comentarios:
- La línea 3 puede quitarse, como son mdichild, al crear la ventana se muestra por defecto.

nelostanley en el código de maeyanes, no verás ninguna parte hacer referencia a frmC1, por eso no puedes hacer referencia con frmC1.LoQueSea. Aunque es fácil convertir ese procedimiento a una función y que devuelva el "aForm".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #2  
Antiguo 05-01-2008
nelostanley nelostanley is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
nelostanley Va por buen camino
un empujonsito mas ...

Cita:
Empezado por Lepe;256131

[B
nelostanley[/b] en el código de maeyanes, no verás ninguna parte hacer referencia a frmC1, por eso no puedes hacer referencia con frmC1.LoQueSea. Aunque es fácil convertir ese procedimiento a una función y que devuelva el "aForm".

Saludos
Obviamente para un novato como yo, necesito hacer referencia a los frmC1.loquesea, te agradeceria decirme como.

Gracias por tu tiempo.
Responder Con Cita
  #3  
Antiguo 05-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Dentro de un tiempo, no tanto como crees, sonreirás al ver este mensaje . Te invito a que intentes deducir qué hace el código metiendo ShowMessages, cambiando líneas de código, etc, ya que es la única forma de aprender.

Código Delphi [-]
function ShowMDIChildForm(AFormClass: TFormClass):TForm;
var
  I: Integer;
begin
  for I := 0 to Pred(Application.MainForm.MDIChildCount) do
  begin
    Result := Application.MainForm.MDIChildren[i];
    if Result is AFormClass then
    begin
      if IsIconic(Result.Handle) then
        ShowWindow(Result.Handle, SW_RESTORE);
      Result.BringToFront;
      Exit
    end
  end;
  Result := AFormClass.Create(nil) // ejem, yo en lugar de "nil" pondría "Application"
// es más seguro si tienes varias ventanas hijas abiertas y le das a cerrar
// la ventana principal.
end;

Ahora puedes llamar a esa rutina así:

Código Delphi [-]
procedure Mio;
var F: TFrmClientes;
begin
  F=:  TFrmClientes(ShowMDIChildForm(TFrmClientes));
  F.LoqueSea

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: 05-01-2008 a las 02:28:13.
Responder Con Cita
  #4  
Antiguo 05-01-2008
nelostanley nelostanley is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
nelostanley Va por buen camino
no da....

Compila correcto ... pero cuando haces refrencia a F.Cualquiercosa sigue el error de "Access Violation".

Ejm. Cuando en un reporte R1 quieres hacer refrencia algo de F1.CualquierCosa, te tira el mismo error, cosa que no sucede en lo absoluto cuando llamas al formulario.

Código Delphi [-]
  if not Assigned(frmC1) Then begin
    frmC1 := TfrmC1.Create(Application);
    frmC1.Show;
  end  else begin
    if frmC1.WindowState = wsMinimized then 
          frmC1.WindowState := wsNormal;
    frmC1.BringToFront;
  end;

Asi corre de 10 !! pero cuando lo llevas a la funcion o procedimiento no funcina las refrencias.

Para evitarme recodificar varias cosas he optado por llamar algunos formularios directamente sin funcion o procedimiento.

Ojala alguien tenga un poquito de paciencia, sino de todas formas gracias.
Responder Con Cita
  #5  
Antiguo 05-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Supongo que no estas haciendo la asignación al llamar a la función.

La llamada debiera lucir algo como esto:

Código Delphi [-]
  Form1 := ShowMDIChildForm(TForm1) as TForm1;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 06-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Cita:
Empezado por nelostanley Ver Mensaje
Compila correcto ... pero cuando haces refrencia a F.Cualquiercosa sigue el error de "Access Violation".
Otro detalle que no se ha comentado.

En la Unit del TForm1, no harás referencia para nada a FrmC1 ¿verdad?

Me explico, si tienes un código así:
Código Delphi [-]
procedure TForm1.ElEventoQuesea(...);
begin 
   frmC1.Loquesea
end;

Eso dará un Access Violation, porque estamos creando la ventana con la variable "F" (desde nuestra rutina), pero en el TForm1 estamos usando la variable frmC1 que no ha sido creada, tiene un puntero nulo.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 07-01-2008
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
... Perdona D&W, pero no se ha dicho si quiere una instancia o varias del mismo Form, hecho que nos haría modificar bastante nuestro código.

Tampoco se dice si se quiere tener una referencia a la ventana creada, o no le importa.
Disculpa Lepe, pero de que haya una o varias instancias del mismo form, eso depende de la variable que se le pase como paramentro a la función que postie. (Si siempre le paso Form1, sólo habrá una instancia de tipo TForm1 y será siempre Form1.

Cita:
Empezado por Lepe Ver Mensaje
Código adecuado no creo que exista, lo tendrá que adaptar a sus necesidades y a su gusto. Al menos yo pretendía dar ideas, después él tendrá que adaptarlo.
En el club, cuando posteamos un código, se da por sobre entendido que es un molde y en muchos casos una sugencia. Cuando dije "Poco adecuado" en ningún momento pretendí decir que era un mal código, al contrario.

Cita:
Empezado por Lepe Ver Mensaje
En cuanto a tu código, no entiendo muy bien como harías una llamada a esa rutina, porque el parámetro es de tipo TForm y después haces un moldeo de tipos a TFormClass en la línea 2. Que conste que no es una crítica, es más bien una duda.
Si yo pido como parámetro una variable tipo TFormClass entonces me tendrían que pasar por ejemplo TForm1 en vez de Form1 (según entiendo Hasta donde llega mi limitada comprensión del lenguaje). De todos modos, luego que postie el código me dí cuenta que produciía el Acccess Violation que me mencionó nelostanley , fue entonces que ví que había que pedir dos parámentros en vez de sólo uno -el nombre de la varíable y el tipo de variable o form- no puede postear los cambios porque no me dio tiempo de hacerlo.

Cita:
Empezado por Lepe Ver Mensaje
Otros comentarios:
- La línea 3 puede quitarse, como son mdichild, al crear la ventana se muestra por defecto.
Gracias por la aclaración, ya lo sabía. También sé que no está de más la linea y que de esa forma la función también puede servir para todo tipo de formularios, ya sean mdiChild o mdiNormal.

aquí va la modificación, espero sirva.
Código Delphi [-]
Procedure TMainForm.CreateOrRestoreForm(aForm : TForm, aFormClass : TFormClass);
  if not Assigned(aForm) Then begin
    aForm := aFormClass.Create(Application);
    aForm.Show;
  end
  else begin
    if aForm.WindowState = wsMinimized then  
        aForm.WindowState := wsNormal;
    aForm.BringToFront;
  end;
end;
Para llamar a la función lo haces así:
Código Delphi [-]
CreateOrRestoreForm(frmC1,TfrmC1);
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 07-01-2008 a las 17:53:43.
Responder Con Cita
  #8  
Antiguo 07-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Solo una observación.

Cita:
Empezado por D&W Ver Mensaje
aquí va la modificación, espero sirva.
Código Delphi [-]
Procedure TMainForm.CreateOrRestoreForm(aForm : TForm, aFormClass : TFormClass);
  if not Assigned(aForm) Then begin
    aForm := aFormClass.Create(Application);
    aForm.Show;
  end
  else begin
    if aForm.WindowState = wsMinimized then  
        aForm.WindowState := wsNormal;
    aForm.BringToFront;
  end;
end;
Con esta rutina propuesta, ninguna asignación ocurre sobre la variable de formulario que se pasa como parámetro.

Si se hacen dos llamadas consecutivas, por ejemplo:

Código Delphi [-]
var
  Form1: TForm1;
begin
  MainForm.CreateOrRestoreForm(Form1, TForm1);
  MainForm.CreateOrRestoreForm(Form1, TForm1);
end;

Se tendrá dos instancias de TForm1.

Hasta luego.



Sugerencia: Si querés crear una rutina que asigne el valor de esa variable, date una vuelta por el código fuente del método CreateForm de la clase TApplication.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 07-01-2008 a las 17:57:30. Razón: Añadir sugerencia
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Formularios Caro OOP 13 08-08-2007 17:41:17
Formularios MDI CoCaInE OOP 6 25-12-2006 13:25:34
Creación dinamica de Formularios Caro OOP 2 25-01-2006 13:20:01
Formularios Caro Varios 5 14-07-2005 14:51:30
Formularios MDI mierteran Varios 1 03-12-2004 11:28:35


La franja horaria es GMT +2. Ahora son las 10:12:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi