PDA

Ver la Versión Completa : Objetos clonados


felipe_jfx
12-02-2013, 21:05:09
Saludos.
En una forma tengo 12 objetos Shape a los que les debo asignar una altura (height) dependiendo de un resultado obtenido en un ciclo For. Mi inexperiencia me hizo programarlo de la siguiente forma:

FIBConsultaMes.First;
for ciclo:=1 to 12 do
begin
if ciclo=1 then Shape1.height:=FIBConsultaMes.fields[0].value;
if ciclo=2 then Shape2.height:=FIBConsultaMes.fields[0].value;
if ciclo=3 then Shape3.height:=FIBConsultaMes.fields[0].value;
if ciclo=4 then Shape4.height:=FIBConsultaMes.fields[0].value;
if ciclo=5 then Shape5.height:=FIBConsultaMes.fields[0].value;
if ciclo=6 then Shape6.height:=FIBConsultaMes.fields[0].value;
if ciclo=7 then Shape7.height:=FIBConsultaMes.fields[0].value;
if ciclo=8 then Shape8.height:=FIBConsultaMes.fields[0].value;
if ciclo=9 then Shape9.height:=FIBConsultaMes.fields[0].value;
if ciclo=10 then Shape10.height:=FIBConsultaMes.fields[0].value;
if ciclo=11 then Shape11.height:=FIBConsultaMes.fields[0].value;
if ciclo=12 then Shape12.height:=FIBConsultaMes.fields[0].value;
FIBConsultaMes.Next;
end;

Sin embargo sé que puedo hacer algo para reducir el código para no tener 12 IF, algo así como un apuntador al objeto shape 1..12. De antemano agradezco las aportaciones a mi duda.

Casimiro Notevi
12-02-2013, 21:27:44
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

movorack
12-02-2013, 21:33:13
Hola felipe_jfx.

Con respecto a tu pregunta; Aparentemente no reduje las líneas de código, pero puedes echarle un vistazo al siguiente código:

procedure TForm1.SetWidthsClick(Sender: TObject);
var
i : Integer;
lStName : string;
lComponent : TComponent;
begin
lComponent := nil;
for i := 1 to 12 do
begin
try
lStName := Format('Shape%d', [i]);
lComponent := FindComponent(lStName);
if Assigned(lComponent)
and (lComponent is TShape)
then
begin
TShape(lComponent).Width := SpinEdit1.Value;
end;
finally
lComponent := nil;
lStName := '';
end;
end;
end;


Esto te permitirá buscar todos los objetos de la clase TShape que se llamen Shape[1..12] y modificarles el tamaño.

Un Saludo y Bienvenido al Club!

champy
12-02-2013, 21:39:51
Supongo que habrán distintas formas de hacerlo pero yo utilizaría la función FindComponent('NombreDelComponente'), algo así.


Procedure CambiarHeight;
var
Shap : Tshape;
N : Integer;
begin
For N := 1 to 5 do
begin
(FindComponent('Shape'+IntTosTr(N)) as Tshape).Height := 100;
end;
End;

felipe_jfx
12-02-2013, 22:29:35
Casimiro, acertada y útil tu sugerencia de los Tags.

Champy, gracias en efecto la función FindComponent() fue parte de la solucuión.

Movorack, tu aportación resolvió de forma excelente lo que quería lograr, mi código era más abultado de lo que mostré en el ejemplo así que creeme que si reduje muchísimo el código final. Cuando esté terminado publicaré como quedó.

El tiempo de respuesta me sorprendió, estoy agradecido.

Casimiro Notevi
12-02-2013, 22:34:55
Gracias por visitarnos :)