Delphi - Acceso masivo a elementos

 
Vista:

Acceso masivo a elementos

Publicado por Jose Mariano (5 intervenciones) el 26/04/2003 10:49:11
Hola a todos. Quisiera exponer una pregunta que ya formulé hace un tiempo pero que las soluciones que me ofrecieron alguno de ustedes (lo cual agradezco enormemente) no me resultaron. Estoy desarrollando un programa en el que empleo una cantidad importante de ventanas con elementos de tipo TEdit, dispuestos en forma de tabla. Estos TEdit deben contener una serie de datos numericos de tipo Real que se corresponden con los valores almacenados en una estructura de tipo ARRAY. Lo que deseo hacer es crear un procedimiento para que al cargar una ventana automaticamente se visualice la información de cada elemento TEDIT, tal que lo que quisiera hacer sería algo como esto:
Edit [i,j]:= Tabla[i,j]
No he encontrado una forma eficiente de realizar esta asignacion y me está ocasionando unos problemas tales que estoy empezando a pensar que me he equivocado de lenguaje.
En este momento me estoy viendo obligado a escribir las asignaciones una por una, es decir:
Edit[1,1]:= Tabla[1,1]; Edit; Edit[2,2]:= Tabla[2,2]; ...etc

En otras ocasiones, cuando creo un procedimiento tal que

Procedure MIO;Begin
Form2.Edit1.Text:='2'; end;
... no realiza lo mismo que si hago...

Procedure MIO;Begin
Edit1.Text:='2'; end;

... es decir, el compilador lo acepta pero de una manera ejecuta lo que se le dice y de la otra manera no lo realiza.
Si alguien pudiera ayudarme le estaría muy agradecido. He dedicado muchas horas en la implementacion y no se si voy a tener que dejarlo.
Muchisimas gracias a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Acceso masivo a elementos

Publicado por Ernesto De Spirito (706 intervenciones) el 26/04/2003 15:23:37
¿Y en qué otro lenguaje podrás hacer lo que quieres con menor nivel de dificultad? No te has equivocado de lenguaje, pues en Delphi se puede hacer lo que pretendes sin ningún problema.

La solución más simple que se me ocurre es poner un Tag a los controles que identifique su posición en la matriz (por ejemplo 101 significaría fila 1, columna 1, mientras que 102 significaría fila 1columna 2, los de la fila dos empiezan con 200, etc.), y luego recorrer los componentes (propiedad Components) del formulario y por cada TEdit encontrado descomponer el valor de su Tag para obtener la fila y la columna correspondiente en la matriz y realizar la asignación respectiva.

procedure TForm1.FormCreate(Sender: TObject);
var
Tabla: array[1..2, 1..3] of real;
i, n: integer;
Component: TComponent;
begin
for i := 0 to ComponentCount - 1 do
begin
Component := Components[i];
n := Component.Tag;
if (Component is TEdit) and (n <> 0) then
TEdit(Component).Text := FloatToStr(Tabla[n div 100, n mod 100]);
end;
end;

Pan comido.

Ernesto De Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Segunda pregunta

Publicado por Ernesto De Spirito (706 intervenciones) el 26/04/2003 16:44:47
El programa realiza ciegamente lo que uno le instruye. El problema normalmente es el que da las órdenes, no el que las compila o el que las ejecuta.

> Procedure MIO;Begin
> Form2.Edit1.Text:='2'; end;
>
> ... no realiza lo mismo que si hago...
>
> Procedure MIO;Begin
> Edit1.Text:='2'; end;

En el primer caso, está bien explícito que te refieres al Edit1 de Form2, y asumiendo que el identificador Form2 es único, entonces está todo bien explícito, mientras que en el segundo caso, ¿a qué Edit1 te refieres? Asumiendo que el procedimiento MIO es un método de un formulario (no lo parece por la declaración, pero por si acaso no te hayas molestado en copiarla bien), entonces lo más probable es que se refiera al miembro Edit1 del objeto con el que se invoca al método, que no necesariamente es Form2, y si MIO fuera un procedimiento común (no un método), entonces tal vez se refiera a una variable llamada Edit1 que tengas por allí. Realmente es difícil de determinar sin ver el código fuente completo.

Te sugiero dedicar bastante tiempo al aprendizaje de Object Pascal (tal es el nombre del lenguaje de programación de Delphi) antes de pretender ponerte a desarrollar aplicaciones, pues sin una buena base te será muy difícil (yo diría que casi imposible) alcanzar una mínima eficiencia en el trabajo, y entonces la programación muy posiblemente te resultará una experiencia continuamente frustrante.

Para comenzar te sugiero bajarte la versión digital del libro "La Cara Oculta de Delphi 4" de Ian Marteens, publicado en mi sitio web con permiso del autor, que si bien es obsoleto, te servirá para tratar de aprender los rudimentos básicos de programación en Object Pascal:

http://www.latiumsoftware.com/descarga/lcod4.php

Si con eso no te alcanza, para reforzar te sugiero el libro "Programación con Delphi 5" de Francisco Charte:

http://www.fcharte.com/Libro.asp?84-415-0967-0

Ojo, no compres el de Delphi 6 del mismo autor, pues requiere más conocimiento.

El libro "Mastering Delphi 6" de Marco Cantù es otro libro muy recomendable.

Como complemento, también te sugiero considerar otros mecanismos de educación formal como asistir a cursos o recibir instrucción personalizada. Eso normalmente acelera el aprendizaje.

Ernesto De Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar