PDA

Ver la Versión Completa : ¿Cómo recorrer los Server Modules de una aplicación?


Jere_84
14-07-2012, 01:15:49
Hola!, necesito recorrer los server modules de una aplicación. Básicamente lo que tengo es el nombre del ServerModule en una variable de tipo string, a partir de esto, la mision es recorrer todos los server modules una vez que consiga el que se llame igual a mi variable, comenzaría a recorrer sus componentes uno a uno. Esta función va a estar en una unit y se podría llamar desde toda la aplicación. El problema que me surgió es: como obtener el objeto a partir de un string. :eek:
Este código que hice anda pero en el mismo SM, el FindComponent me ayuda ya que encuentra los componentes que están ubicados en ese ServerModule, pero desde otra unit esto no funciona porque no estan, por lo tanto necesitaria localizar ese SM y poder trabajar con el mismo. se me ocurrio que quizas pueda existir alguna func. de mas bajo nivel que sirvan en esta labor o algunas del desconocido (para mi) API de windows.
Espero haberme explicado bien :rolleyes:

Gracias de antemano.


unction TPLDBVarios.ObtenerSQL(vServerModule, vProvider: string): string;
var
i, j: integer;
vServerMod, vDataSetPro, vDataSet: TComponentName;
DS: TComponent;
begin
try
vServerMod := TDSServerModule(FindComponent(vServerModule)).Name;
vDataSetPro := TDataSetProvider(FindComponent(vProvider)).Name;
DS := TDatasetProvider(FindComponent(vProvider)).Owner;

if DS is TDSServerModule then
begin
for i := 0 to DS.ComponentCount - 1 do
begin
if DS.Components[i].name = vDataSetPro then
begin
vDataSet:= TDataSetProvider(DS.Components[i]).DataSet.Name;
for j := 0 to DS.ComponentCount - 1 do
begin
if DS.Components[j].Name = vDataSet then
begin
Result:= TSQLdataSet(DS.Components[j]).CommandText;
Exit;
end;
end;
end;
end;
end;
finally
//...
end;
end;

Al González
14-07-2012, 02:02:55
Si esos objetos mayores fueron creados dándole el objeto Application como dueño, puedes usar este último y su método FindComponent para localizarlos.

Supón que has hecho esto: Application.CreateForm (TdmServidor, dmServidor); Entonces luego puedes emplear esta expresión: Application.FindComponent ('dmServidor')

Agrego: Esto es válido ya que Application también es un "componente" (la clase TApplication desciende de TComponent).

Espero te sirva, saludos.

Jere_84
14-07-2012, 14:50:31
Hola Al González!, para este caso no funciona ya que no fueron creados con el objeto Application, como es un servidor datasnap las clases son instanciadas de forma automática internamente por el delphi (no se de que manera). Hice la prubea en el servidor y FindComponent me devuelve NIL :mad:
Pero me sirvio conocerlo, es util para muchas ocasiones. Lo que me serviria para este caso es poder localizar un componente visual dentro de mi App que no necesariamente halla sido creado aun :rolleyes: ¿Que otro método alternativo a este puede haber para localizar un componente visual dentro de una aplicación?

Saludos.

Al González
14-07-2012, 17:02:53
Me parece que usas alguna versión desde la 2009 en adelante. Hace varios años tuve la fortuna de estudiar algo de eso y ayudar a un grupo de desarrollo, pero ha pasado el tiempo y como ya no tengo acceso a lo más reciente de DataSnap, se me dificulta.

Agradecería si alguien tuviera la gentileza de dejarme entrar a su Delphi 2009 o superior mediante un acceso remoto. Me serviría para intentar ayudar a Jere_84, como para refrescar en mi memoria aquellos interesantes temas.

Saludos. :)