Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Consula sobre Findcomponent (https://www.clubdelphi.com/foros/showthread.php?t=27703)

Carmelo Cash 28-11-2005 21:35:41

Consula sobre Findcomponent
 
Hola Foro:
Estoy usando Delphi 5.0 y necesito hacer referencia a más de una consulta.
Para esto pensaba utilizar la opción Findcomponent y en una variable string pasar el dato de la consulta que necesito.
En el ejemplo que muestro no estoy utilizando una variable, estoy escribiendo el nombre del componente como 'texto', esto es solamente más que para probar.
El problema en que aparece un error inentendible.

Esto funciona OK :)
Edit2.text:= ABM_Rubros.Form_ABM_Rubros.Query11.fields[1].value;

Esto No :mad:
Edit2.text:= TQuery(FindComponent('ABM_Rubros.Form_ABM_Rubros.Query11')).fields[1].value;

Tal vez me sepan decir en donde le estoy pifiando.
Desde ya muchas gracias

Neftali [Germán.Estévez] 29-11-2005 10:14:07

Cita:

Empezado por Carmelo Cash
El problema en que aparece un error inentendible.

Aunque para tí sea "inentendible" dinos cual es, tal nos de pistas de lo que está pasando.
¿No será un Access Violation?

Sin el error, todo lo que te podamos decir son suposiciones.

Carmelo Cash 29-11-2005 16:33:49

Hola
 
Gracias por atender mi consulta.

Efectivamente el mesnaje es 'Access violation at adress 00494A3C in module nnn'

delphi.com.ar 29-11-2005 16:47:38

Cita:

Empezado por Carmelo Cash
Edit2.text:= TQuery(FindComponent('ABM_Rubros.Form_ABM_Rubros.Query11')).fields[1].value;

Seguramente no va a encontrar ningún componente que se llame "ABM_Rubros.Form_ABM_Rubros.Query11", ya que el nombre del supuesto componente solamente es "Query11".
Tendrías que tener algunas consideraciones, como verificar si FindComponent retornó algo como lo que estas esperando:
Código Delphi [-]
var
  AComponent: TComponent;
begin
  AComponent := FindComponent('Query11');
  if AComponent is TQuery then
    Edit1.Text := TQuery(AComponent).Fields[1].Value
end;

Vale aclarar que si estas ejecutando FindComponent en un evento o dentro del código de un TComponent (Posiblemente de un TForm), FindComponent lo ejecutará Self y me parece que vos queres buscarlo en Form_ABM_Rubros, por lo que tendrás que hacer algo como:
Código Delphi [-]
  ...
  AComponent := Form_ABM_Rubros.FindComponent('Query11');
Saludos!

Lepe 29-11-2005 16:52:22

- FindComponent busca en el Form o en el Contenedor donde está, si pretendes buscar en Form_ABM_RUBROS, deberás usar Form_ABM_RUBROS.FindComponent(.....);

- FindComponent devuelve nil (puntero nulo) si no encuentra el componente. Por tanto, siempre debes verificar que se ha encontrado, de lo contrario, en TQuery(nil).Fields <<<<<< Aquí estas traspasando un puntero nulo, Access Violation.
Código Delphi [-]
var T:Tcomponent;
begin
  T := Findcomponent(....);
 if t  <> nil  then
    t.Loquesea

- FindComponent busca por el nombre del componente, por tanto tu instrucción sería más o menos:
Código Delphi [-]
  var t:Tcomponent;
begin 
  t := Form_ABM_Rubros.FindComponent('Query11');
  if Assigned(t) then // lo mismo que en el ejemplo anterior.
     t.loquesea.

// saludos

Carmelo Cash 29-11-2005 18:42:42

Salió!!!
 
Quedó como me sugirió Delphi.com.ar

Edit2.Text:=TQuery(Form_ABM_Rubros.FindComponent('Query11')).Fields[1].Value;

Con la sugerencia de Lepe no entiende la propiedad Fields[1] (Undeclared identifier)

Gracias por su ayuda.

delphi.com.ar 29-11-2005 18:52:07

Cita:

Empezado por Carmelo Cash
Con la sugerencia de Lepe no entiende la propiedad Fields[1] (Undeclared identifier)

Seguramente porque no estas haciendo un cast a TQuery... ¿Entiendes lo que acabas de hacer?

jzginez 26-09-2006 23:48:49

Hola, estoy intentando hacer lo mismo que Carmelo pero no ne sale a la pregunta directa de Delphi.com.ar:

Cita:

Seguramente porque no estas haciendo un cast a TQuery... ¿Entiendes lo que acabas de hacer?
la verdad NO, les pongo lo diferente de mi caso:

Tengo un DataModule (DtmDatos) con n IBDataSet (algunos son IBVentas, IBClientes, IBProveedores, etc)


En mi forma2 (FrmCambiaSQL) donde tengo un TDataSource y una combinación de Tcomboxbox, Tedit y otros componentes para que el usuario pueda crear un filtro (where algo = algo) que se añade a la sentencia select del IBDataSet corespondiente.

en el boton que aplica los cambios para crear el filtro tengo bastantes lineas con algo como esto:
Código Delphi [-]
 if dataSource1.datset.name = 'IBClientes'
 Then Begin
   NuevaConsulta:= AgregaFiltro(DtmDatos.IBClientes.SelectSQL.text);
   DtmDatos.IBClientes.Close;
   DtmDatos.IBClientes.SelectSQL.Clear;
   DtmDatos.IBClientes.SelectSQL.add(NuevaConsulta);
   DtmDatos.IBClientes.Open;
  End;
y haci para cada IBDataSet que uso

mi primera intención era poner algo así:
Código Delphi [-]
 NuevaConsulta:= DataSource1.DataSet.SelectSQL;
pero desde el componente tDataSource no puedo accesar a la propiedad SelectSQL, esto seria lo ideal que nesecito.

con este hilo intente lo que aconsega Delphi.com.ar
Cita:

Tendrías que tener algunas consideraciones, como verificar si FindComponent retornó algo como lo que estas esperando:

Código Delphi [-]

var
  AComponent: TComponent;
begin
  AComponent := FindComponent('Query11');
  if AComponent is TQuery then
    Edit1.Text := TQuery(AComponent).Fields[1].Value
end;

Vale aclarar que si estas ejecutando FindComponent en un evento o dentro del código de un TComponent (Posiblemente de un TForm), FindComponent lo ejecutará Self y me parece que vos queres buscarlo en Form_ABM_Rubros, por lo que tendrás que hacer algo como:

Código Delphi [-]
 ...
  AComponent := Form_ABM_Rubros.FindComponent('Query11');
Saludos!
y pasa lo mismo no puedo accesar a la propiedad SelectSQL, ¿que hay que hacer?

Gracias


La franja horaria es GMT +2. Ahora son las 14:22:47.

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