PDA

Ver la Versión Completa : Variable en Atributo [Edit(Variable).Text]


martini002
12-06-2012, 01:38:31
Saludos Amigos, donde quiera que se encuentren.

En esta ocasion les traigo una duda que tengo desde hace dias
pero que hasta ahora no he podido dar con una buena conclusion.

Esto es posible? o alguna semejanza, la cuestion
es que quiero almacenar en 1000 Edit's un valor en especial
digamos que el 0, Entonces la pregunta seria,
se puede colocar una variable en un atributo?

Ejemplo:
Llenamos 1000 Objetos Edit, con una secuencia 1,2,3..1000

Saludos,
Best,
Martin


Procedure LlenarEdits();
Var
I:Integer;
begin
for I:=1 to 1000 do
begin
Form1.Edit+IntToStr(I)+.Text:=I;//Aqui mi duda, Obviamente esto no es posible asi tal cual como esta escrito
end;
end;

dec
12-06-2012, 02:21:48
Hola,

Prueba con algo como "FindComponent" (http://docwiki.embarcadero.com/CodeSamples/en/FindComponent_%28Delphi%29), que, te permite buscar y obtener referencias de componentes por su nombre.

martini002
12-06-2012, 02:39:56
Gracias!
A ver dejame revisar

Caral
12-06-2012, 02:41:02
Hola
Hola,
Prueba con algo como "FindComponent" (http://docwiki.embarcadero.com/CodeSamples/en/FindComponent_%28Delphi%29), que, te permite buscar y obtener referencias de componentes por su nombre.


var
i :Integer;
comp: TComponent;
begin
for i := 1 to 3 do begin // aqui se pone la cantidad de edits, en este caso 3
comp := FindComponent('Edit' + IntToStr(i));
TEdit(comp).Text:= IntToStr(i);
end;

Busca los edits y les coloca un numero en su texto.
Saludos

Pedro-Juan
13-06-2012, 00:47:52
Hola,

No puedo resistirme a la curiosidad, ¿1000 Edits?

Un saludo.

martini002
13-06-2012, 01:21:42
Hola,

No puedo resistirme a la curiosidad, ¿1000 Edits?

Un saludo.

iba a poner un millon...
Haha, siempre que quiero automatizar algo pienso
y si tengo 1 millon de (algo) en este caso edits,
acaso debo llenarlos uno por uno? entonces alli viene
el planteamiento del problema, y digo, no creo,
debe haber algo que lo pueda hacer

Pedro-Juan
13-06-2012, 01:31:35
Entendido Martin :)

Pero como dices:


es que quiero almacenar en 1000 Edit's un valor en especial
digamos que el 0, Entonces la pregunta seria,
se puede colocar una variable en un atributo?


No lo entendía.

Un saludo.

martini002
20-06-2012, 22:18:58
Hola Caral,
Tenia dias sin sentarme a programar esto
porque surgieron un par de cosas
pero he vuelto!

sabes que el FindComponent no me funciona correctamente
realmente quiero usar esa funcion para lo siguiente:


procedure ActualizarCartasMesa();
var
I:Integer;
Componente:TComponent;
begin
For I:=1 to 10 do
Begin
Componente:=FindComponent('CartaMesa' + IntToStr(I));
TImage(Componente).Picture.LoadFromFile(Getcurrentdir()+'\Imagenes\Cartas\'+IntToStr(VCartasMesa[I])+'.png');
End
end;


pero me arroja un error:
"undeclared identifier FindComponent..."

agregue

Uses
System

pero sigue sin funcionar, que crees que esta pasando con eso?
gracias

ecfisa
20-06-2012, 22:56:44
Hola martini002.


El método FindComponent no puede ser llamado igual que una función común, como todo método está ligado a un objeto.

Por otro lado, primero tendrías que buscar el componente y luego, si existe, realizar las acciones. Ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
I:Integer;
Componente:TComponent;
begin
for i:= 1 to 10 do
begin
Componente:= FindComponent('CartaMesa' + IntToStr(i)); // Aquí es: Self.FindComponent (Self = Form1)
if Componente <> nil then // ¿ Existe el componente ?
//...
end
...


Saludos.

roman
21-06-2012, 17:08:05
Realmente, debería prohibirse el uso de FindComponent ;).

Este método lo que hace es recorrer todos los componentes del formulario hasta encontrar el que tenga el nombre dado. Si tienes 10 objetos a buscar, entonces recorres 10 veces todos los componentes, y no digamos si tienes mil. Para eso, mejor los recorres una sóla vez:


for I := 0 to ComponentCount - 1 do
begin
if SameText(Components[I].Name, 'CartaMesa' + IntToStr(I)) then
TImage(Componente).Picture.LoadFromFile(...);
end;


Aún así, esto debería usarse sólo para algo ocasional. Si, por ejemplo, estás diseñando un juego de cartas, es de suponer que vas a tener que referirte a los componentes TImage que las representan múltiples veces. Entonces es mejor declarar un arreglo de objetos TImage:


Cartas: array[1..10] of TImage;


e inicializarlos, por ejemplo, en el constructor del formulario:


Cartas[1] := CartaMesa1;
Cartas[2] := CartaMesa2;
...
Cartas[10] := CartaMesa10;


Es una larga asignación, pero en el resto de la aplicación puedes ya usar las cartas directamente:


for I := 1 to 10 do
begin
Carta[I].Picture.LoadFromFile(...);
end;


Incluso, si la asignación inicial es demasiado larga, quizá podrías colocar todas las cartas en un contenedor como un TPanel e inicializar así:


for I := 0 to Panel.ControlCount - 1 do
TImage(Panel.Control[I]).LoadFromFile(...);


// Saludos