Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Es posible hacer una nueva clase de componente ?? (https://www.clubdelphi.com/foros/showthread.php?t=55960)

ilichhernandez 02-05-2008 21:41:20

Es posible hacer una nueva clase de componente ??
 
Estimados, muchas gracias por molestarse en leer esta solicitud de ayuda, mi duda es la siguiente, estoy recorriendo componentes con el siguiente codigo.

Código Delphi [-]
For I:=0 to ComponentCount-1 do   
Begin     
if (Components[i] is TCombobox) and (TCombobox(Components[i]).Color = ClRed) then       
Begin          
Showmessage('Faltan completar datos, revise formulario con espacios rojos');
b:= 1;
end;
if (Components[i] is TDBedit) and (TDBedit(Components[i]).Color = ClRed) then       
Begin          
Showmessage('Faltan completar datos, revise formulario con espacios rojos');
b:=1;
end;
if (Components[i] is TEdit) and (TEdit(Components[i]).Color = ClRed) then       
Begin          
Showmessage('Faltan completar datos, revise formulario con espacios rojos');
b:=1;
end;
end;


pero pensando en como mejorar esto , pues me parece poco optimo, se me paso por la cabeza hacer algo asi

TNuevoTipodeComponente : [TCombobox, TEdit, TDbedit] as Component;

y luego cuando recorro los componentes en vez de realizar busqueda sobre cada tipo realizo la busqueda del componente sobre uno solo, que me da la impresion que podria ser mas rapido y mas entendible, bueno gracias a los que pueden cooperar con alguna idea y a los que no tambien. Saludos a todos.

maeyanes 02-05-2008 22:12:28

Hola...

Primero, recuerda que existen las etiquetas [ delphi ] [ /delphi ] (sin los espacios en blanco) para publicar código fuente en Delphi.

Sobre tu inquietud, bueno, existen varias formas de hacerlo...

Por ejemplo, todos los tipos de componente que usas heredan de TWinControl, entonces tu código puede quedar más o menos así:

Código Delphi [-]
for I := 0 to Pred(ComponentCount) do
  if (Components[i] is TWinControl) and (TWinControl(Components[i]).Color = clRed) then
  begin
    ShowMessage('Falta completar datos... ');
    b := 1
  end

Ahora, existe otra posibilidad y es usando RTTI (Runtime Type Information). Puedes buscar mucha información sobre RTTI tanto en la web como en el foro...


Saludos...

santus 02-05-2008 22:44:38

Cita:

Empezado por maeyanes (Mensaje 283949)
Hola...

Primero, recuerda que existen las etiquetas [ delphi ] [ /delphi ] (sin los espacios en blanco) para publicar código fuente en Delphi.

Sobre tu inquietud, bueno, existen varias formas de hacerlo...

Por ejemplo, todos los tipos de componente que usas heredan de TWinControl, entonces tu código puede quedar más o menos así:

Código Delphi [-]for I := 0 to Pred(ComponentCount) do if (Components[i] is TWinControl) and (TWinControl(Components[i]).Color = clRed) then begin ShowMessage('Falta completar datos... ');
b := 1
end


Ahora, existe otra posibilidad y es usando RTTI (Runtime Type Information). Puedes buscar mucha información sobre RTTI tanto en la web como en el foro...


Saludos...

Hola maeyanes ..

perdon que me meta. La verdad que vi interesante tu planteo. El tema es que lo intenté probar en mi delphi 2007 y no funciona!!

a la linea:

Código Delphi [-]
TWinControl(Components[i]).Color


me tira el siguiente error:

[DCC Error] Unit2.pas(31): E2362 Cannot access protected symbol TControl.Color

Se me ocurre que con el delphi 2007 esto no anda??.. alguna idea??.. es curiosidad nomas...

muchas gracias. Saludos.

maeyanes 02-05-2008 22:53:16

Hola...

Eso me pasa por no verificar antes... jejeje

Bueno, resulta que la propiedad Color en TWinControl, al igual que en [/b]TControl[/b] de la cual desciende, es una propiedad protegida y es TEdit quien la declara como published.

Es por eso que obtienes ese error en el código que puse...

En ese caso es mejor usar la opción del RTTI...


Saludos...

ilichhernandez 02-05-2008 23:03:21

Gracias estimados, acabo de probar y me da el mismo error que tiene Santus asi que vere mediante RTTI a ver que averiguo, muchas gracias a todos. Saludos

roman 03-05-2008 00:44:42

Código Delphi [-]
type
  TControl = class(Controls.TControl);

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;

begin
  for I := 0 to ControlCount - 1 do
    TControl(Controls[i]).Color := clRed;
end;

// Saludos

ilichhernandez 05-05-2008 15:05:56

Voy a revisar esta nueva opcion, muchas gracias por lacolaboracion, se agradece..... Saludos, luego les cuento....

Neftali [Germán.Estévez] 05-05-2008 16:01:30

Creo que la opción mejor es la publicada por Román.

Utilizar RTTI será más complicado que eso ya te lo aseguro...:D:D:D
Lo único que te aportaría utilizar RTTI es que podrías asignar el valor a la propiedad color de la misma forma que al resto sin que todos los componentes descencieran de TControl.


La franja horaria es GMT +2. Ahora son las 01:45:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi