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 27-09-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
argumentos FormCreate

¿Se puede pasar argumentos a este procedimiento tan especial?

La operación tiene esta cabecera:
Código Delphi [-]
procedure FormCreate(Sender: TObject; lista: TLista);

Y la llamo como sigue:
Código Delphi [-]
For:=TFor.Create(For,list);
Responder Con Cita
  #2  
Antiguo 27-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Para que la asignación de la segunda sentencia que presentás sea válida, la primera debiera tener un constructor y no un método cualquiera. Por ejemplo:

Código Delphi [-]
type
  TFor = class(TForm)
    ...
  public
    constructor Create(AOwner: TComponent; Lista: TList);
...

procedure TMainForm.Button10Click(Sender: TObject);
begin
  For := TFor.Create(Self, Lista);
end;

Esto sería perfectamente válido, solamente tener cuidado de en el constructor de la clase debe llamarse a algún constructor de la clase padre, para que la creación e inicialización de, en este caso, la forma se realice correctamente.

También tener en cuenta que el constructor create declarado en este caso no sustituye al constructor create de la clase TForm, aun cuando tenga el mismo nombre, por lo que por ejemplo, una llamada a Application.CreateForm, seguirá usando el constructor create de TForm y no el create de TFor.

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
  #3  
Antiguo 27-09-2006
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
Aunque no es fundamental, para que el compilador no nos grite con sus advertencias, yo usaría la directiva reintroduce:

Código Delphi [-]
  TFor = class(TForm)
    ...
  public
    constructor Create(AOwner: TComponent; Lista: TList); reintroduce;

...

Por cierto, con For, esto no va a compilar

// Saludos
Responder Con Cita
  #4  
Antiguo 27-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por roman
Por cierto, con For, esto no va a compilar
¡Es cierto!, no había caido en la cuenta de ello.

Probemos...

c/For/AFor

Ok. ahora compilará..

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
  #5  
Antiguo 27-09-2006
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
Cita:
Empezado por jachguate
c/For/AFor
¿Qué es esto? ¿vi?

// Saludos
Responder Con Cita
  #6  
Antiguo 27-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
ups... :s lo siento:

[alt][s] [r] For [tab] AFor [alt][a] [Intro]



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
  #7  
Antiguo 28-09-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Muchas gracias jachguate creo q con tu ejemplo servirá.

Última edición por senda fecha: 28-09-2006 a las 10:31:48.
Responder Con Cita
  #8  
Antiguo 28-09-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Cita:
Empezado por roman
Aunque no es fundamental, para que el compilador no nos grite con sus advertencias, yo usaría la directiva reintroduce:
¿Para que sirve esa instrucción reintroduce?
Responder Con Cita
  #9  
Antiguo 28-09-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
He cambiado todas las operaciones que tenía en la operación FormCreate a la nueva operación (q he introducido) Create. El resultado no ha sido el esperado. Se cuelga al ejecutar la operación ShowModal tras crear el formulario.

Cita:
Empezado por jachguate
Esto sería perfectamente válido, solamente tener cuidado de en el constructor de la clase debe llamarse a algún constructor de la clase padre, para que la creación e inicialización de, en este caso, la forma se realice correctamente.
No sé exactamente como implementar esta idea.
Responder Con Cita
  #10  
Antiguo 28-09-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por senda
¿Para que sirve esa instrucción reintroduce?
Tiene que ver con la herencia. Sirve para "reintroducir" un método virtual como nuevo. Intentaré aclararlo con un ejemplo (a ver si me sale, que lo estoy haciendo de memorieta):

Código Delphi [-]
TYPE
  TBASE = CLASS (TOBJECT)
  PUBLIC
    PROCEDURE Procedimiento; VIRTUAL;
  END;

  TDERIVADA1 = CLASS (TBASE)
  PUBLIC
    PROCEDURE Procedimiento; OVERRIDE;
  END;

  TDERIVADA2 = CLASS (TBASE)
  PUBLIC
    PROCEDURE Procedimiento; REINTRODUCE;
  END;

Tenemos el método virtual Procedimiento, el cual es heredado por las dos clases derivadas. Una de ellas la implementa de nuevo (OVERRIDE) mientras que la otra la "reintroduce" de forma que tiene dos métodos con el nombre "Procedimiento". No es lo mismo que OVERLOAD, ojo.

La cosa está en lo siguiente:

Código Delphi [-]
PROCEDURE Uso (aObjeto1: TBASE, aObjeto2: TDERIVADA2);
BEGIN
  aObjeto1.Procedimiento;
  aObjeto2.Procedimiento;
END;

VAR
  ElObjeto: TDERIVADA2;
BEGIN
  ElObjeto = TDERIVADA2.Create;
  Uso (ElObjeto, ElObjeto);
  ElObjeto.Free;
END

En la primera línea llamamos al procedimiento virtual de la clase TBASE, que en tiempo de ejecución puede ser tanto la definida para TBASE como la definida para TDERIVADA1.

En la segunda línea llamamos al procedimiento "reintroducido" por la clase TDERIVADA2.

Espero que haya aclarado las cosas en lugar de liarlas más.

Última edición por Ñuño Martínez fecha: 28-09-2006 a las 12:14:03.
Responder Con Cita
  #11  
Antiguo 28-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por senda
Se cuelga al ejecutar la operación ShowModal tras crear el formulario.
Me parece que no has llegado tan dentro como sería necesario para figurarme que puede pasar con esto, así que te recomiendo intentar llegar mas allá, bien lanzando el showmodal con f7 (step into) o bien poniendo breakpoints en el código que debe ejecutarse en el código que se lanza en ese intervalo.

Para demostrar que es posible, he preparado un pequeño ejemplo, espero te sea de utilidad.

Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm2 = class(TForm)
    lDato: TLabel;
    BitBtn1: TBitBtn;
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent; Dato: string); reintroduce;
  end;

implementation

{$R *.dfm}

{ TForm2 }

constructor TForm2.Create(AOwner: TComponent; Dato: string);
begin
  inherited Create(AOwner);
  lDato.Caption := Dato;
end;

end.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  f2: TForm2;
begin
  f2 := TForm2.Create(Application, (Sender as TButton).Caption);
  try
    f2.ShowModal;
  finally
    f2.Free;
  end;
end;

end.

El evento OnClick de ambos botones está relacionado al método Button1Click.

Creo que el dfm puede deducirse fácilmente de los .pas. ¿no?

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
  #12  
Antiguo 29-09-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Muchas gracias. He conseguido ejecutar tu ejemplo perfectamente, pero no consigo arreglar mi programa. Exactamente me escupe:

Cita:
Project ej.exe raised exception class EInvalidOperation with message 'Cannot make a visible window modal'. Poccess stopped. Use Step or Run to continue.
Parando la ejecución en la instrucción For.Free (se ejecuta inmediatemente despues del Create y ShowModal).
Responder Con Cita
  #13  
Antiguo 29-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Creo que el mensaje es claro: Tu ventana ya está visible cuando llamas a ShowModal, y pues esto no tendría sentido.

Evidentemente, es tu propio código el que hace que esta ventana sea visible. Iniciá revisando que el estilo de la forma sea fsNormal, y si es así, pues dar una revisión general de las rutinas que se invocan entre el Create y el ShowModal.

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
  #14  
Antiguo 02-10-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
No se, me parece q lo voy a tirar todo y empezaré de nuevo, xq el estilo es 'fsnormal' y entre el 'create' y el 'showmodal' no hay ninguna operación (se ejecuta el showmodal inmediatamente despues del create). Muchas gasias de todos modos.

PD: Si omito el 'showmodal' no se muestra el formulario y si lo incluyo peta la ejecución, toy apañao.
Responder Con Cita
  #15  
Antiguo 02-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Antes de "tirar" todo, verifica la propiedad Visible de tu formulario, si tu ventana no es MDIChild, esta debe tener el valor False.



Saludos...
Responder Con Cita
  #16  
Antiguo 02-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Si el formulario es MDIChild, no tendría sentido mostrarlo con ShowModal. La propiedad Style del formulario debiera tener fsNormal.

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
  #17  
Antiguo 02-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Si, pero si por algún motivo cambias la propiedad FormStyle a fsMDIChild, la propiedad Visible cambia a True, pero si regresas la propiedad FormStyle a fsNormal, Visible no cambia su valor...

Así que no está de más que verifique lo que comento...



Saludos...
Responder Con Cita
  #18  
Antiguo 04-10-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
La propiedad visible sta a False.
Responder Con Cita
  #19  
Antiguo 04-10-2006
Avatar de albertresearch
albertresearch albertresearch is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
albertresearch Va por buen camino
He leido rapidamente por encima tu mensaje y creo que tu problema radica en que tienes declarada la form como "autocreada" en la proyecto de delphi. Pulsa CTRL+Mays+F11 y verifica si en el apartado de Auto-create Forms esta este formulario. Si es asi... pasalo al apartado de "available Forms" para que no se cree automaticamente. Doy por sentado que es tu codigo el que crea la form y la muestra modal no ???
Responder Con Cita
  #20  
Antiguo 09-10-2006
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Cita:
Empezado por albertresearch
He leido rapidamente por encima tu mensaje y creo que tu problema radica en que tienes declarada la form como "autocreada" en la proyecto de delphi. Pulsa CTRL+Mays+F11 y verifica si en el apartado de Auto-create Forms esta este formulario. Si es asi... pasalo al apartado de "available Forms" para que no se cree automaticamente. Doy por sentado que es tu codigo el que crea la form y la muestra modal no ???
Si.

Al final lo he conseguido resolver haciendo una función auxiliar que inicializase los parámetros antes de llamar a Create y he restaurado la operación Create sin parametros que tenia en un primer momento funcionando. Muchas gracias por todas las respuestas.
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
Duda con argumentos por consola friendspark OOP 2 14-11-2005 17:57:30
Udf y argumentos rastafarey Firebird e Interbase 2 29-07-2005 21:12:44
Error en FormCreate darkerbyte OOP 5 29-03-2005 17:42:43
¿Como recuperar los argumentos de un ejecutable? dim Varios 2 20-05-2004 11:58:17
Argumentos en procedimientos Carlitos Firebird e Interbase 3 06-03-2004 11:34:19


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