Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion cambiar propiedades componente(variable) (https://www.clubdelphi.com/foros/showthread.php?t=74400)

Dclase 16-06-2011 21:55:41

Funcion cambiar propiedades componente(variable)
 
Saludos,

A ver si alguien me puede dar una mano con una funcion que estoy intentando hacer que consiste en lo siguiente:

Quiero a varios componentes de varios tipos Ej:
Edit1 : TEdit;
Edit2 : TEdit;
Edit...X : TEdit;
Image1 : TImage;
Image2 : T Image;
Image...X : TImage;

cambiar sus propiedades pero sin tener que llamar cada componente uno por uno, sino desde una variable, por ejemplo:

Código Delphi [-]
Function SeletItem(vVal: Integer): Variant;
Var
vEdit : TEdit;
vImage : TImage;
vNomEdit, vNomImg : String;
begin

For I:=1 To 10 Do
Begin

  vNomEdit := 'Edit'+IntToStr(I);
  vNomImg := 'Image'+IntToStr(I);
  xxxx // Aqui no se como pasar la variable al componente TEdit y TImage
  vEdit.Color := clWindow;
  vImage.Visible := False;

End;

  vNomEdit := 'Edit'+IntToStr(vVal);
  vNomImg := 'Image'+IntToStr(vVal);
  xxxx //  .....
  vEdit.Color := clRed;
  vImage.Visible := True;
....

o algo asi.

Nota: Lei por ahi algo parecido con una funcion "FindComponet" para asignar el nombre del componente pero no me funciona dentro de la funcion.

oscarac 16-06-2011 22:00:36

quiza esto te pueda servir como una ayuda
lo utilizo para deshabilitar todos los edits y combobox que tenga en el form

Código Delphi [-]
 
      for i := 0 to (Self.ComponentCount - 1) do  begin
        if (Self.Components[i] is TDBEdit) or (Self.Components[i] is TComboBox) then begin
          TEdit(Self.Components[i]).Enabled := False;
        end;

Caral 16-06-2011 22:02:22

Hola

Código Delphi [-]
Procedure Cambio;
var
     i : Integer;
  comp : TComponent;
begin
  for i := 1 to 10 do begin
  comp := FindComponent('Edit' + IntToStr(i)); 
  TEdit(comp).Color:= clRed;
end;

Saludos

Dclase 16-06-2011 22:03:51

umm... las propiedades "Self.ComponentCount" no me funcionan dentro de una funcion..

Dclase 16-06-2011 22:07:49

Gracias Caral, con un Procedure ya la habia probado y me funciona la parte de cambiarlo todo, pero necesito que sea con una funcion para pasar el numero del que quiero dejar una propiedad diferente a los demas.

Caral 16-06-2011 22:13:37

Hola

Código Delphi [-]
Procedure Cambio;
var
   dif,  i : Integer;
  comp : TComponent;
begin
  Dif:= 5; // por ejemplo
  for i := 1 to 10 do begin
  comp := FindComponent('Edit' + IntToStr(i));
  If TEdit(comp).text <> IntToStr(Dif) then
  begin 
  TEdit(comp).Color:= clRed;
  end;
end;

Saludos

Edito: Corregido.:p

defcon1_es 17-06-2011 09:14:52

Hola. Puedes hacer un procedimiento con los parámetros que necesites tener en cuenta y/o cambiar
Código Delphi [-]
procedure CambiarPropiedad(Contenedor: TForm; NumeroElemento: Integer; NuevoColor: TColor, Activar:Boolean);
var i:Integer;
begin
  for i := 0 to (Contenedor.ComponentCount - 1) do  
  begin         
    if (Contenedor.Components[i] is TEdit)
    then begin
      if TEdit(Contenedor.Components[i]).Name = 'Edit+IntToStr(NumeroElemento)
      then begin       
        TEdit(Contenedor.Components[i]).Color := NuevoColor;         
        TEdit(Contenedor.Components[i]).Enabled := Activar;         
      end;
    end;
  end;
end;

Esto está bien para 2 o 3 clases de componentes, pero si son 6 o mas clases de componentes que quieres cambiar sus propiedades,
es mejor aprovecharse de la RTTI (esa gran desconocida)

Código Delphi [-]
procedure CambiarPropiedad(Contenedor: TForm; Clase: String; NuevoColor: TColor; Activar:Boolean);
var i:Integer;
PropInfo: PPropInfo;
begin
  for i := 0 to (Contenedor.ComponentCount - 1) do  
  begin         
      if Contenedor.Components[i].ClassNameIs(Clase)
      then begin
// 2.-Buscamos si el componente tiene la propiedad 'Color'
       PropInfo := TypInfo.GetPropInfo(Contenedor.Components[i].ClassInfo, 'Color') ;
       if Assigned(PropInfo)
       then begin
// 3.-Damos el valor que queremos a la propiedad 'Color'
         TypInfo.SetOrdProp(Contenedor.Components[i], PropInfo, LongInt(NuevoColor));
// 4.-Buscamos si el componente tiene la propiedad 'Enabled'
         PropInfo := TypInfo.GetPropInfo(Contenedor.Components[i].ClassInfo, 'Enabled') ;
         if Assigned(PropInfo) then
// 5.-Damos el valor que queremos a la propiedad 'Enabled'
           TypInfo.SetOrdProp(Contenedor.Components[i], PropInfo, LongInt(Activar));
       end;
    end;
  end;
end;

Neftali [Germán.Estévez] 17-06-2011 13:37:48

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á.


La franja horaria es GMT +2. Ahora son las 23:29:17.

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