Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-09-2017
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Busqueda de Componente y propiedades

Hola gente, buen día...
Tengo en el formulario un panel con varios checkbox, y para no escribir mucho código, pensaba en localizarlos a traves del nombre de los mismos y ahi cambiar algunas propiedades, principalmente la propiedad Checked...
Buscando he encontrado varios ejemplos y he implementado el que presento a continuación..
Código Delphi [-]
var
  Butaca: TComponent;
  nombre: string;
  i: integer;
begin
  for i:=0 to 10 do
    begin
      nombre:='F1_' ;
      butaca:=FindComponent(nombre);
      if Assigned(butaca)then
        begin
          if (butaca is TCheckBox) then
            TCheckBox(butaca).Checked:=true;
        end;
    end;
El problema que tengo es que cuando verifica si esta asignado, la condición da falso, por lo que no puedo cambiar el estado del Checked...si por el contrario saco la condición donde verifica si está asignado, al cambiar la propiedad de Checked da error y no lo hace, error como si el comprobante no estuviese referenciado.. a mi entender es como si el FindComponent no encuentra el componente...
Desde ya agradezco cualquier comentario y/o sugerencia.
Saludos!!!
Responder Con Cita
  #2  
Antiguo 28-09-2017
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
No lo entiendo

Hola, tengo dudas.

¿cuando se ejecuta ese código?
¿para que sirve el for?

Por lo que veo le asignas directamente el nombre del componente que quieres buscar, por lo que entiendo que ya sabes que ese nombre que pasas corresponde a un checkbox, no te haría falta comprobarlo después.

También puedes probar con:

Código Delphi [-]
 TCheckbox(FindComponent('F1_')).Checked:=true;

Así te evitarías tener que crear el TComponent y asignarlo.

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #3  
Antiguo 28-09-2017
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Fe de erratas....

Bueno, quizas el sueño me juega mala pasada....
Código Delphi [-]
Butaca:TComponent.Crate(self);

la solución al problema..... ahora tengo en una tabla los nombres a buscar y ahi si no me los encuentra
Código Delphi [-]
nombre:=Tabla.FieldValues['nombre'];

Ahi si ya no entiendo por que no lo encuentra....
Responder Con Cita
  #4  
Antiguo 28-09-2017
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Respuesta

Gracias ElDioni por la respuesta, en realidad el nombre lo compongo de la siguiente manera:
Código Delphi [-]
  for i:=0 to 10 do
    begin
      nombre:='F1_' ;
      butaca:=FindComponent(nombre + InttoStr(i));
  ... 
  ...

para que me genere y busque los 10 nombres
Responder Con Cita
  #5  
Antiguo 28-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Sólo un detalle, en ese caso la comprobación:
Código Delphi [-]
  if Assigned(butaca)then  // <-
        begin
          if (butaca is TCheckBox) then
es innecesaria.

Dado que el operador is devuelve True si el objeto evaluado pertenece a la clase o es descendiente de ella y False de otro modo (incluyendo también a nil), podes escribir:
Código Delphi [-]
...
 var
  i: Integer;
  Butaca: TComponent;
begin
  for i := 0 to ComponentCount-1 do
  begin
    Butaca := FindComponent('F1_'+IntToStr(i+1));  // +1 si los nombres fuesen: F1_1, ..., F1_10
    if Butaca is TCheckBox then
      TCheckBox(Butaca).Checked := True;
  end;
end;

Lo que no alcanzo a comprender bién es la mecánica de la obtención del nombre desde la tabla, pero en principio podrías hacer uso del método Locate.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 28-09-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Otra manera podría ser.

Cita:
Empezado por Neftali Ver Mensaje
Tal vez esta entrada pueda ayudar: "Modificar propiedades de controles en ejecución utilizando RTTI".

La ventaja de hacerlo con RTTI es que podría llamar a esta función:

Código Delphi [-]

// Otros ejemplos 
SetPropAsString(Components[i], 'Left', '10'); 
SetPropAsString(Components[i], 'Color', 'clRed');

Sin preocuparte del Tipo de control (TEdit, TCheckbox,...). Si tiene la propiedad y se llama así la cambiará.
Responder Con Cita
  #7  
Antiguo 28-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Como menciona Soa Pelaez, también se puede usar RTTI. Con la salvedad que debe verificarse si la propiedad sobre la que se va a aplicar el valor existe en el componente actual para evitar excepciones.
Código Delphi [-]
...
implementation

uses TypInfo;

procedure TForm1.CheckOnOff(const aChecked: Boolean);
var
  i: Integer;
begin
  for i := 0 to ComponentCount-1 do
    if Assigned(GetPropInfo(Components[i].ClassInfo, 'Checked')) then
      SetOrdProp(Components[i], 'Checked', Integer(aChecked) );
end;

// Ejemplo de uso:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckOnOff(not CheckBox1.Checked);
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
speedbutton propiedades componente anubis Varios 5 26-08-2007 01:12:35
Propiedades Componente Punzo OOP 2 20-12-2006 21:50:58
Propiedades de un Componente diegofhernando OOP 3 13-09-2004 17:38:22
Quitar propiedades a un componente soul6301 Varios 1 30-08-2004 10:31:37
Propiedades en Componente ingacg Conexión con bases de datos 3 09-05-2003 23:52:56


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


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