Ver Mensaje Individual
  #1  
Antiguo 07-12-2007
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Reputación: 21
salvica Va por buen camino
Localizar controles creados en runtime

Hola a tod@s
Recurro al foro por aquello de que 2000 ojos ven más que dos (miopes por cierto)

Tengo un form con la siguiente estructura:
Código Delphi [-]
Form
  |
  | ( controles creados en tiempo de diseño )
  |
  + Panel_DATOS_00
  |      |
  |      + Panel_HORA_00
  |      + ESBFloatEdit_T_SECO_00
  |      + ESBFloatEdit_T_HUMEDO_00
  |      + ESBPosEdit_HUMEDAD_00
  |
  | ( controles creados en tiempo de ejecución, del 01 al 24 )
  |
  + Panel_DATOS_01
  |      |
  |      + Panel_HORA_01
  |      + ESBFloatEdit_T_SECO_01
  |      + ESBFloatEdit_T_HUMEDO_01
  |      + ESBPosEdit_HUMEDAD_01
  |
  + Panel_DATOS_02
  |      |
  |      + Panel_HORA_02
  |      + ESBFloatEdit_T_SECO_02
  |      + ESBFloatEdit_T_HUMEDO_02
  |      + ESBPosEdit_HUMEDAD_02
 ...
  |
  + Panel_DATOS_24
         |
         + Panel_HORA_24
         + ESBFloatEdit_T_SECO_24
         + ESBFloatEdit_T_HUMEDO_24
         + ESBPosEdit_HUMEDAD_24
Los controles "cero-cero" los creo en diseño, y los controles "cero-uno" a "dos-cuatro" en tiempo de ejecución, exactamente en el evento OnCreate del form.

Bien, hasta aquí no hay problema.
El problema se presenta cuando quiero rellenar los controles desde los datos almacenados en una tabla, para ello tengo la siguiente función:
Código Delphi [-]

procedure TForm_Garita.MYSQL_PasarDatosAControles;
const
  strTabla = 'partes_garita';
var
  Panel_DATOS           : TPanel;
  ESBFloatEdit_T_SECO   : TESBFloatEdit;
  ESBFloatEdit_T_HUMEDO : TESBFloatEdit;
  ESBPosEdit_HUMEDAD    : TESBPosEdit;
  numHora  : integer;
  strHora  : string;
  strClave : string;
begin
{ preparar la clave del registro buscado }
  strClave := FormatDateTime('yyyymmdd', FECHA_GARITA);
  with ZQuery do begin
     { viene preparada de Form_Main }
       SQL.Clear;
       SQL.Add( 'SELECT * ' );
       SQL.Add( '  FROM ' + strTabla );
       SQL.Add( ' WHERE clave="' + strClave + '"' );
     { abrir la tabla activa }
       Open;
       if not IsEmpty then begin
        { el registro existe }
          for numHora:=0 to 24 do begin
            { para cada hora, buscar los controles }
              strHora               := IntToCadena( numHora, 2 );
              Panel_DATOS           := FindComponent('Panel_DATOS_'          +strHora) as TPanel;
              ESBFloatEdit_T_SECO   := FindComponent('ESBFloatEdit_T_SECO_'  +strHora) as TESBFloatEdit;
              ESBFloatEdit_T_HUMEDO := FindComponent('ESBFloatEdit_T_HUMEDO_'+strHora) as TESBFloatEdit;
              ESBPosEdit_HUMEDAD    := FindComponent('ESBPosEdit_HUMEDAD_'   +strHora) as TESBPosEdit;
              if( Panel_DATOS<>nil ) then begin
                { el contenedor existe y se encuentra }
                  if( ESBFloatEdit_T_SECO<>nil ) then begin
                    { el control existe y se encuentra, rellenarlo }
                      ESBFloatEdit_T_SECO.AsFloat         := FieldByName( 'TS_'+strHora ).AsFloat;
                      ESBFloatEdit_T_SECO.BlankWhenZero   := FieldByName( 'TS_'+strHora ).IsNull;
                      ESBFloatEdit_T_HUMEDO.AsFloat       := FieldByName( 'TH_'+strHora ).AsFloat;
                      ESBFloatEdit_T_HUMEDO.BlankWhenZero := FieldByName( 'TH_'+strHora ).IsNull;
                      ESBPosEdit_HUMEDAD.AsInteger        := FieldByName( 'HU_'+strHora ).AsInteger;
                      ESBPosEdit_HUMEDAD.BlankWhenZero    := FieldByName( 'HU_'+strHora ).IsNull;
                  end;
              end;
          end;
       end;
     { cerrar la tabla activa }
       Close;
  end; { del with Query do }
{}
end;
no se porqué no me localiza los controles creados y aparecen en blanco.

He probado a anteponer a FindComponent el nombre del form, self, o el contenedor (Panel_DATOS) y lo máximo que he conseguido ha sido que me cargue los controles creados en diseño, el resto siguen en "el limbo"

Para verificar los nombres, he añadido el evento OnMouseMove para que muestre los nombres de los controles y lo hace perfectamente
Código Delphi [-]
procedure TForm_Garita.TODOS_OnMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if( Sender is TPanel )
      then Form_Comun.Panel_SUPERIOR.Caption := TPanel(Sender).Name
      else if( Sender is TESBFloatEdit )
               then Form_Comun.Panel_SUPERIOR.Caption := TESBFloatEdit(Sender).Name
               else if( Sender is TESBPosEdit )
                        then Form_Comun.Panel_SUPERIOR.Caption := TESBPosEdit(Sender).Name
                        else Form_Comun.Panel_SUPERIOR.Caption := '*** DESCONOCIDO***';
end;
¿alguna idea?

Gracias de antemano
salvica
Responder Con Cita