Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2012-07

Listado de todos los formularios de la aplicación

7 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Antonio Évora

Hola a tod en s,
Necesito listar todos los formularios de una aplicaci�n (creados y sin crear).

He probado con este c�digo:

procedure MuestraForms();
var
   n: integer;
   Salida1,
   Salida2: string;
begin
   Salida1:='';
   Salida2:='';
   for n:=0 to Application.ComponentCount-1 do
   begin
     Salida1:=Salida1+Application.Components[n].Name+LineEnding;
   end;
   for n:=0 to Screen.FormCount-1 do
   begin
     Salida2:=Salida2+Screen.Forms[n].Name+LineEnding;
   end;
Application.MessageBox(Salida1+LineEnding+LineEnding+Salida2,'',64);
end;

Segun la documentaci�n que he leido (de Delphi) con Application.Components deberia de listarme todos los formularios de la aplicacion, pero esto no es asi. La diferencia entre utilizar el objeto Application y Screen, es que el primero (Application) tambi�n me devuelve el modulo de datos, mientras que Screen me devuelve solamente los formularios, y en los dos casos solamente los que est�n cargados en memoria.

Tambi�n he le�do que esto se puede hacer en Delphi 2010 usando RTTI, pero utiliza unidades no existentes en Lazarus.

�Tiene esto soluci�n? �Es un bug de Lazarus/FPC?

Un cordial saludo y gracias de antemano.

Reply by email

Christian

Que tal si agregas

 if application.component[n] is tform then

Enviado desde Samsung tablet

Antonio �vora <aevorar en gmail.com> escribi�:

Show quoted text 45 lines
Hola a tod en s, Necesito listar todos los formularios de una aplicaci�n (creados y sin crear). He probado con este c�digo: procedure MuestraForms(); var n: integer; Salida1, Salida2: string; begin Salida1:=''; Salida2:=''; for n:=0 to Application.ComponentCount-1 do begin Salida1:=Salida1+Application.Components[n].Name+LineEnding; end; for n:=0 to Screen.FormCount-1 do begin Salida2:=Salida2+Screen.Forms[n].Name+LineEnding; end; Application.MessageBox(Salida1+LineEnding+LineEnding+Salida2,'',64); end; Segun la documentaci�n que he leido (de Delphi) con Application.Components deberia de listarme todos los formularios de la aplicacion, pero esto no es asi. La diferencia entre utilizar el objeto Application y Screen, es que el primero (Application) tambi�n me devuelve el modulo de datos, mientras que Screen me devuelve solamente los formularios, y en los dos casos solamente los que est�n cargados en memoria. Tambi�n he le�do que esto se puede hacer en Delphi 2010 usando RTTI, pero utiliza unidades no existentes en Lazarus. �Tiene esto soluci�n? �Es un bug de Lazarus/FPC? Un cordial saludo y gracias de antemano. _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

Antonio Evora
to Christian

Hola Christian,
El problema es que no lista todos los formularios de la aplicaci�n. Me explico: Tengo un proyecto con dos formularios (form1 y form2)y un modulo de datos (dmDatos). Inicialmente cargo dmDatos y form1 (quedando form2 sin cargar pues se hara din�micamente) En este ejemplo, justamente despu�s de ejecutar, en el objeto Application.Components estaria form1 y dmDatos y en Screen.Forms estaria solamente form1, pero form2 no aparece por ninguna parte. Lo que busco es alguna rutina capaz de devolver justamente despu�s de ejecutar form1, form2 y dmDatos.

Un cordial saludo y gracias de antemano.

Enviado desde mi iPad

El 09/07/2012, a las 14:49, Christian <xortix en gmail.com> escribi�:

Show quoted text 57 lines
Que tal si agregas if application.component[n] is tform then Enviado desde Samsung tablet Antonio �vora <aevorar en gmail.com> escribi�: > Hola a tod en s, > Necesito listar todos los formularios de una aplicaci�n (creados y sin > crear). > > He probado con este c�digo: > > procedure MuestraForms(); > var > n: integer; > Salida1, > Salida2: string; > begin > Salida1:=''; > Salida2:=''; > for n:=0 to Application.ComponentCount-1 do > begin > Salida1:=Salida1+Application.Components[n].Name+LineEnding; > end; > for n:=0 to Screen.FormCount-1 do > begin > Salida2:=Salida2+Screen.Forms[n].Name+LineEnding; > end; > > Application.MessageBox(Salida1+LineEnding+LineEnding+Salida2,'',64); > end; > > Segun la documentaci�n que he leido (de Delphi) con > Application.Components deberia de listarme todos los formularios de la > aplicacion, pero esto no es asi. La diferencia entre utilizar el objeto > Application y Screen, es que el primero (Application) tambi�n me > devuelve el modulo de datos, mientras que Screen me devuelve solamente > los formularios, y en los dos casos solamente los que est�n cargados en > memoria. > > Tambi�n he le�do que esto se puede hacer en Delphi 2010 usando RTTI, > pero utiliza unidades no existentes en Lazarus. > > �Tiene esto soluci�n? �Es un bug de Lazarus/FPC? > > Un cordial saludo y gracias de antemano. > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

Maxi
to Antonio Evora

El 9 de julio de 2012 14:12, Antonio Evora <aevorar en gmail.com> escribi�:

Show quoted text 81 lines
Hola Christian, El problema es que no lista todos los formularios de la aplicaci�n. Me explico: Tengo un proyecto con dos formularios (form1 y form2)y un modulo de datos (dmDatos). Inicialmente cargo dmDatos y form1 (quedando form2 sin cargar pues se hara din�micamente) En este ejemplo, justamente despu�s de ejecutar, en el objeto Application.Components estaria form1 y dmDatos y en Screen.Forms estaria solamente form1, pero form2 no aparece por ninguna parte. Lo que busco es alguna rutina capaz de devolver justamente despu�s de ejecutar form1, form2 y dmDatos. Un cordial saludo y gracias de antemano. Enviado desde mi iPad El 09/07/2012, a las 14:49, Christian <xortix en gmail.com> escribi�: > Que tal si agregas > > if application.component[n] is tform then > > Enviado desde Samsung tablet > > Antonio �vora <aevorar en gmail.com> escribi�: > >> Hola a tod en s, >> Necesito listar todos los formularios de una aplicaci�n (creados y sin >> crear). >> >> He probado con este c�digo: >> >> procedure MuestraForms(); >> var >> n: integer; >> Salida1, >> Salida2: string; >> begin >> Salida1:=''; >> Salida2:=''; >> for n:=0 to Application.ComponentCount-1 do >> begin >> Salida1:=Salida1+Application.Components[n].Name+LineEnding; >> end; >> for n:=0 to Screen.FormCount-1 do >> begin >> Salida2:=Salida2+Screen.Forms[n].Name+LineEnding; >> end; >> >> Application.MessageBox(Salida1+LineEnding+LineEnding+Salida2,'',64); >> end; >> >> Segun la documentaci�n que he leido (de Delphi) con >> Application.Components deberia de listarme todos los formularios de la >> aplicacion, pero esto no es asi. La diferencia entre utilizar el objeto >> Application y Screen, es que el primero (Application) tambi�n me >> devuelve el modulo de datos, mientras que Screen me devuelve solamente >> los formularios, y en los dos casos solamente los que est�n cargados en >> memoria. >> >> Tambi�n he le�do que esto se puede hacer en Delphi 2010 usando RTTI, >> pero utiliza unidades no existentes en Lazarus. >> >> �Tiene esto soluci�n? �Es un bug de Lazarus/FPC? >> >> Un cordial saludo y gracias de antemano. >> >> _______________________________________________ >> Lazarus-es mailing list >> Lazarus-es en lists.lazarus.freepascal.org >> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Si no est� creado form2 nunca te va a aparecer, ademas debes tener en cuenta si al momento de crearlo que parent le diste. Si haces Tform2.Create(nil) no tiene pariente y no va a aparecer. deberias crealo con pariente Application.

El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Linux User #495070 http://domonetic.com/blog ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20120711/738ab775/attachment.html>

Reply by email

Antonio Évora
to Maxi

El 11/07/12 15:52, Maxi escribi�:

Show quoted text 118 lines
El 9 de julio de 2012 14:12, Antonio Evora <aevorar en gmail.com <mailto:aevorar en gmail.com>> escribió: Hola Christian, El problema es que no lista todos los formularios de la aplicación. Me explico: Tengo un proyecto con dos formularios (form1 y form2)y un modulo de datos (dmDatos). Inicialmente cargo dmDatos y form1 (quedando form2 sin cargar pues se hara dinámicamente) En este ejemplo, justamente después de ejecutar, en el objeto Application.Components estaria form1 y dmDatos y en Screen.Forms estaria solamente form1, pero form2 no aparece por ninguna parte. Lo que busco es alguna rutina capaz de devolver justamente después de ejecutar form1, form2 y dmDatos. Un cordial saludo y gracias de antemano. Enviado desde mi iPad El 09/07/2012, a las 14:49, Christian <xortix en gmail.com <mailto:xortix en gmail.com>> escribió: > Que tal si agregas > > if application.component[n] is tform then > > Enviado desde Samsung tablet > > Antonio �0/00vora <aevorar en gmail.com <mailto:aevorar en gmail.com>> escribió: > >> Hola a tod en s, >> Necesito listar todos los formularios de una aplicación (creados y sin >> crear). >> >> He probado con este código: >> >> procedure MuestraForms(); >> var >> � n: integer; >> � Salida1, >> � Salida2: string; >> begin >> � Salida1:=''; >> � Salida2:=''; >> � for n:=0 to Application.ComponentCount-1 do >> � begin >> � � Salida1:=Salida1+Application.Components[n].Name+LineEnding; >> � end; >> � for n:=0 to Screen.FormCount-1 do >> � begin >> � � Salida2:=Salida2+Screen.Forms[n].Name+LineEnding; >> � end; >> >> Application.MessageBox(Salida1+LineEnding+LineEnding+Salida2,'',64); >> end; >> >> Segun la documentación que he leido (de Delphi) con >> Application.Components deberia de listarme todos los formularios de la >> aplicacion, pero esto no es asi. La diferencia entre utilizar el objeto >> Application y Screen, es que el primero (Application) también me >> devuelve el modulo de datos, mientras que Screen me devuelve solamente >> los formularios, y en los dos casos solamente los que están cargados en >> memoria. >> >> También he leído que esto se puede hacer en Delphi 2010 usando RTTI, >> pero utiliza unidades no existentes en Lazarus. >> >> ¿Tiene esto solución? ¿Es un bug de Lazarus/FPC? >> >> Un cordial saludo y gracias de antemano. >> >> _______________________________________________ >> Lazarus-es mailing list >> Lazarus-es en lists.lazarus.freepascal.org <mailto:Lazarus-es en lists.lazarus.freepascal.org> >> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org <mailto:Lazarus-es en lists.lazarus.freepascal.org> > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org <mailto:Lazarus-es en lists.lazarus.freepascal.org> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es Si no está creado form2 nunca te va a aparecer, ademas debes tener en cuenta si al momento de crearlo que parent le diste. Si haces Tform2.Create(nil) no tiene pariente y no va a aparecer. deberias crealo con pariente Application. -- El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Linux User #495070 http://domonetic.com/blog _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Hola Maxi, gracias por contestar.
Entonces no es posible como yo pretend�a/cre�a. �Y mediante RTTI? Ya que los formularios forman parte de la aplicaci�n y en "alg�n sitio" est�n guardados.

�Alguna idea?
Un saludo.
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20120712/20fdf8c1/attachment.html>

Reply by email

Maxi
to Antonio Évora

No se como usar rtti, pero yo hice algo similar con delphi para cargar dinamicamente, nombres de procedimientos guardados en una base de datos y dentro de ese procedimiento creo los formularios que necesito.

//Los metodos deben ser published para que los puedas rastrear.
   published
      Procedure LoadFormCargaPractAmbulatorio;
      Procedure LoadFormCargaPractInternado  ;
      Procedure LoadFormCargaPractIntContextual;
      Procedure LoadFormCargaPractIntContextualGrilla;
//Creas tipos de procedimientos para ejecutar segun los parametros que tengan
Type
  TExecute0 = procedure of object;
  TExecute1 = procedure (aPerms:Integer)of object;
  TExecute2 = procedure (aParams:string;aPerms:Integer)of object;
//buscar el nombre del metodo en el codigo y lo ejecutas por el puntero
Procedure TIWUserSession.ExecByName(aFormName:string);//,aParams:string;aPermisos:Integer);
var
  Routine: TMethod;
begin
  // Acceder al procedimiento
  Routine.Code := MethodAddress(aFormName);
  try
    if Assigned(Routine.Code) then  // Encontrado?
  {$WARNINGS OFF}
     TExecute0(Routine)//(aParams,aPermisos);
  {$WARNINGS ON}
    else
      Application.MessageBox(pchar(format('No se encuentra la funci�n
"%s".',[aFormName])),'Informaci�n',MB_OK+MB_ICONHAND);
      {$ENDIF}
  except
    raise Exception.CreateFmt('Error al cargar la funci�n "%s".',[aFormName]);
  end;
END;
El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html Linux User #495070 http://domonetic.com/blog

Reply by email

Antonio Évora
to Maxi

El 12/07/12 17:52, Maxi escribi�:

Show quoted text 43 lines
No se como usar rtti, pero yo hice algo similar con delphi para cargar dinamicamente, nombres de procedimientos guardados en una base de datos y dentro de ese procedimiento creo los formularios que necesito. //Los metodos deben ser published para que los puedas rastrear. published Procedure LoadFormCargaPractAmbulatorio; Procedure LoadFormCargaPractInternado ; Procedure LoadFormCargaPractIntContextual; Procedure LoadFormCargaPractIntContextualGrilla; //Creas tipos de procedimientos para ejecutar segun los parametros que tengan Type TExecute0 = procedure of object; TExecute1 = procedure (aPerms:Integer)of object; TExecute2 = procedure (aParams:string;aPerms:Integer)of object; //buscar el nombre del metodo en el codigo y lo ejecutas por el puntero Procedure TIWUserSession.ExecByName(aFormName:string);//,aParams:string;aPermisos:Integer); var Routine: TMethod; begin // Acceder al procedimiento Routine.Code := MethodAddress(aFormName); try if Assigned(Routine.Code) then // Encontrado? {$WARNINGS OFF} TExecute0(Routine)//(aParams,aPermisos); {$WARNINGS ON} else Application.MessageBox(pchar(format('No se encuentra la funci�n "%s".',[aFormName])),'Informaci�n',MB_OK+MB_ICONHAND); {$ENDIF} except raise Exception.CreateFmt('Error al cargar la funci�n "%s".',[aFormName]); end; END;

Muchas gracias Maxi.

Ya ver� como me busco la vida metiendo manualmente los formulario e intentando usar/adaptar el codigo que me pasaste.

Un cordial saludo, gracias a todos y buen fin de semana.

Reply by email