Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   matriz de controles (https://www.clubdelphi.com/foros/showthread.php?t=41910)

santiago14 28-03-2007 23:35:13

matriz de controles
 
Tengo una duda, estoy haciendo unas ventanas que tienen una cantidad considerable de componentes. ¿Cómo hago una matriz de controles? Sería algo como:
Tengo 100 Edits y quiero ponerles el mismo nombre y diferenciarlos por algún número... a ver..
caja(1)
caja(2)
...
caja(100)

y poder poner los valores correspondientes en sus propiedades text solamente localizandolos por el número en la matriz.
No quiero ser comparativo pero en Visual Basic los componentes tienen una propiedad index la cual me permite armar esa matriz de controles y luego puedo encontrarlos a través de ese índice. Bien, supongo que delphi tiene algo similar pero por desgracia aún no lo encontré. Saludos.

roman 29-03-2007 00:37:26

Hola,

Cita:

Empezado por santiago14
No quiero ser comparativo pero en Visual Basic los componentes tienen una propiedad index la cual me permite armar esa matriz de controles

De cuando alguna vez programé en VB, recuerdo que esa es una de las pocas cosas que se extrañan en Delphi. No obstante, no es difícil ingeniárselas para hacer algo similar.

Declara un arreglo de TEdit en tu formulario:

Código Delphi [-]
type
  TForm1 = class(TForm)
    (* Panel contenedor de los edits *)
    Panel1: TPanel;

    (* Edits insertados en el formulario *)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    ...

    private
      Edits: array of TEdit;
  end;

Coloca todos los Edit dentro de un mismo Panel que no contenga ningún otro control. Esto no es estrictamente necesario pero facilita el llenado del arreglo.

En el constructor del formulario pon:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;

begin
  (* Asignas memoria para el arreglo *)
  SetLength(Edits, Panel1.ControlCount);

  (* Asignas los Edits del formulario al arreglo *)
  for I := 0 to Panel1.ControlCount - 1 do
    Edits[i] := TEdit(Panel1.Controls[i]);
end;

Con esto ya puedes manipular las propiedades de los edits del formulario através del arreglo Edits, por ejemplo:

Código Delphi [-]
var
  I: Integer;

begin
  for I := 0 to Panel1.ControlCount - 1 do
    Edits[i].Text := Format('Cuadro de edición %d', [i]);
end;

// Saludos

anubis 29-04-2007 03:21:53

si, me pasa casi igual, tengo 4 edits que meti en un panel, imagino que los otros edits que estan fuera del panel tambien estan en el array.

la pregunta es, tengo esos 4 edits dentro del panel pero tambien tengo otros edits qu eno me interesa que esten fuera, hasta ahi es correcto la procedure que pusiste, pero a la hora de editar cada uno de esos edit, me usa el edit[i].text o edit1.text, porque en pantalla me sigue usando los edit originales y tampoco se como usar los edit[i] para ir cambiando de uno a otro sin usar un for y que valgan los onexit.

Perdon si no me explique bien.....

roman 29-04-2007 08:54:02

Cita:

Empezado por anubis
Perdon si no me explique bien

Estás perdonado. Ahora por favor explícate bien ;), que al menos yo, no entiendo lo que quieres hacer.

// Saludos

anubis 29-04-2007 12:29:57

si gracias. A ver. Tengo un formulario con varios controles, entre ellos tedit, labels etc.
tal y como sugerias, genere un array con los tedit, y luego agrupe en un panel algunos edit, porque me interesa hacer calculos con ellos. los edit se siguen llamando precio, debe, y haber, y se siguen llamando asi aunque haya creado el array porque en las propiedades del objeto no puedo poner en el nombre edit[1]. Como manipulo entonces los eventos onexit, onkeypressed o simplemente cambio de un edit a otro para que se este usando el edit[i] en vez del edit precio, debe o haber?.

es un poco enrevesada la pregunta...

gracias

roman 30-04-2007 01:01:36

La verdad es que sigo sin entender lo que buscas pero vamos a aclarar algunos puntos, y quizá de ahí puedas partir.

El colocar los edits dentro de un panel es nada más para facilitar la inicialización del arreglo mediante un ciclo for, pero si tienes varios controles mezclados y no todos ellos han de formar parte del arreglo, siempre puedes optar por hacer la asignación directa:

Código Delphi [-]
Edits[0] := UnEdit;
Edits[1] := OtroEdit;
Edits[2] := UnEditMas;

Ahora, para efectos de eventos asociados a estos edits, te conviene, además, asignar a cada edit el índice que ocupa en el arreglo. Esto puedes hacerlo en la propiedad Tag del edit.

Código Delphi [-]
(* Este ciclo se hace después de inicializar el arreglo *)
for J := 0 to Length(Edits) - 1 do
begin
  Edit[J].Tag := J;

  Edit[J].OnExit := EditExit;
  Edit[J].OnKeyPressed := EditKeyPressed;
  ...
end;

EditExit y EditKeyPressed son métodos que declaras manualmente con los mismos parámetros que los eventos normales:

Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    procedure EditExit(Sender: TObject);
    procedure EditKeyPressed(Sender: TObject; var Key: Char);
  end;

Nota que los pones en la sección private, porque no los genera el IDE sino tú mismo.

Entonces, todos los edits del arreglo comparten los mismos manejadores de eventos, así que en éstos, debes distinguir cuál es el que está generando el evento, y para ello usas el Tag que asignaste:

Código Delphi [-]
procedure TForm1.EditExit(Sender: TObject);
var
  Edit: TEdit;

begin
  Edit := Sender as TEdit;
  case Edit.Tag of
    0: ...;
    1: ...;
    2: ...;
    ...
  end;
end;

// Saludos

egostar 30-04-2007 03:03:22

Cita:

Empezado por anubis
si gracias. A ver. Tengo un formulario con varios controles, entre ellos tedit, labels etc.
tal y como sugerias, genere un array con los tedit, y luego agrupe en un panel algunos edit, porque me interesa hacer calculos con ellos. los edit se siguen llamando precio, debe, y haber, y se siguen llamando asi aunque haya creado el array porque en las propiedades del objeto no puedo poner en el nombre edit[1]. Como manipulo entonces los eventos onexit, onkeypressed o simplemente cambio de un edit a otro para que se este usando el edit[i] en vez del edit precio, debe o haber?.

es un poco enrevesada la pregunta...

gracias

Perdón que me entrometa, pero esto no seria mejor hacerlo con un StringGrid, digo, como si fuera una hoja de excel.

Salud OS.

anubis 30-04-2007 08:25:26

se agradece roman por la explicacion, voy aprobar. Gracias de nuevo.

egostar, aqui vale todo tipo de comentarios, asi aprendemos todos, tambien voy aprobar como funciona el stringGrid a ver como funciona.

voy a intentar buscar un manual donde vengan explicados los componentes asi no doy tanto la lata ;).

anubis 30-04-2007 12:50:21

gracias roman, la cosa funciona.
egostar, de momento el tstringgrid no lo uso porque me lia un poco, tengo que investigar mas a ver como funciona.

gracias de nuevo

anubis 30-04-2007 20:44:14

gracias roman, la cosa funciona.
egostar, de momento el tstringgrid no lo uso porque me lia un poco, tengo que investigar mas a ver como funciona.

gracias de nuevo

anubis 30-04-2007 21:54:32

gracias roman, la cosa funciona.
egostar, de momento el tstringgrid no lo uso porque me lia un poco, tengo que investigar mas a ver como funciona.

gracias de nuevo

roman 30-04-2007 21:56:14

:confused:

¿Piensas que no lo hemos visto o tu pc manda mensajes por su cuenta

:D

// Saludos

fjcg02 01-05-2007 00:41:36

Inconscientemente le he dado una ostia al pc, pensando que estaba 'rayao' - es que vamos para mayores -

Saludos

anubis 01-05-2007 05:58:32

gracias roman, la cosa funciona.
egostar, de momento el tstringgrid no lo uso porque me lia un poco, tengo que investigar mas a ver como funciona.

gracias de nuevo

anubis 01-05-2007 06:00:58

mil disculpas, al enviar le di y me dio error, asi que le di a actualizar, normalmente me suelo fijar por si se envio.

Sorry.


La franja horaria es GMT +2. Ahora son las 03:00:50.

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