PDA

Ver la Versión Completa : Creando componentes en ejecucion


JULIPO
05-09-2006, 14:10:03
Saludos cordiales.

estoy desarrollando una matriz de componentes en ejecucion de 3 columnas x n filas segun un listado de eventos, las columnas estan compuestas por un edit, un label y un button la pregunta es ya creados los componentes y las rutinas de onclick para los botones cuando presiono un boton debo mostrar el contenido del edit y el caption del label pertenecientes a la misma fila del boton como lo hago ?.

espero sea clara la pregunta .

cordialmente

julipo

jachguate
05-09-2006, 15:37:59
Hola.

Si no nos decis cómo estas estructurando internamente tus componentes, no hay forma de ayudarte!

Supondré que creaste un registro, un vector de registros y que en la propiedad TAG de cada componente has almacenado su propio índice en el vector, así, quedaría algo como:


Type
TFila = record
Boton: TButton;
Etiqueta: TLabel;
Editor: TEdit;
end;

TForm1 = class(TForm)
//codigo aqui
private
FArreglo : Array[0..n-1] of TFila;
//mas codigo aqui

procedure TForm1BotonCualquieraClick(Sender: TObject);
var
UnaFila: TFila;
begin
UnaFila := FArreglo[(Sender as TObject).Tag];
ShowMessage(Format('El editor contiene: %s'#13'Y la etiqueta dice: %s',
[Fila.Editor.Text, Fila.Etiqueta.Caption]);
end;


Hasta luego.

;)

JULIPO
05-09-2006, 22:15:31
gracias de antemano por tu respuesta pero no me funciona la rutina de onclick de los botones.

el codigo que realizamos es el siguiente quisiera lo revisaras y me indicaras que falta para que funcione correctamente

type
TFila = record
p: TButton;
b: TLabel;
a: TEdit;
end;
var
Vertel: TVertel;
FILAS:ARRAY OF TFILA;

procedure TVertel.FormShow(Sender: TObject);
VARCONTADOR,I:INTEGER;
CSID2,LISTALLAMA:STRING;
begin
inherited;
LISTALLAMA:=USUARIOS.Caption;
SETLENGTH(FILAS,LENGTH(LISTALLAMA));
CSID2:=CSID.Caption;
I:=0;
FOR CONTADOR :=1 TO LENGTH(LISTALLAMA) DO
BEGIN ZQUERY3.Close;
ZQUERY3.SQL.Clear;
ZQUERY3.SQL.TEXT:=FORMAT('SELECT * FROM CLIENTES.listel%S
WHERE (INDICE =:INDICE1)',[CSID2]);
ZQUERY3.ParamByName('INDICE1').AsString:=LISTALLAMA[CONTADOR];
ZQUERY3.Open;
IF NOT ZQUERY3.IsEmpty THEN
BEGIN
FILAS[I].a:=TEDIT.Create(SELF);
FILAS[I].A.Parent := Self;
FILAS[I].A.Left := (50);
FILAS[I].A.Top := 120+(I*30);
FILAS[I].A.Width:= 250;
FILAS[I].A.Height :=25 ;
FILAS[I].A.Name:='Edit'+inttostr(i);
FILAS[I].a.Text:=ZQUERY3.Fields[1].AsString;
FILAS[I].A.ReadOnly:=TRUE;
FILAS[I].a.Tag:=I;
FILAS[I].B:=TLABEL.Create(SELF);
FILAS[I].B.Parent := Self;
FILAS[I].B.AutoSize:=FALSE;
FILAS[I].B.Left := (330);
FILAS[I].B.Top := 120+(I*30);
FILAS[I].B.Width:= 150;
FILAS[I].B.Height :=25 ;
FILAS[I].B.Name:='LABEL'+inttostr(i);
FILAS[I].B.Alignment:=taCenter;
FILAS[I].B.Color:=CLRED;
FILAS[I].B.Caption:=ZQUERY3.Fields[7].AsString;
FILAS[I].B.Tag:=I;
IF ZQUERY3.Fields[4].AsString <> '' THEN
BEGIN
FILAS[I].p:=TButton.Create(SELF);
FILAS[I].P.Parent := Self;
FILAS[I].p.Left := (530);
FILAS[I].p.Top := 120+(I*30);
FILAS[I].p.Width:= 50;
FILAS[I].p.Height :=25 ;
FILAS[I].p.Name := 'Button'+ IntToStr(i);
FILAS[I].P.Caption:=ZQUERY3.Fields[4].AsString;;
FILAS[I].p.OnClick:=BotonCualquieraClick;
FILAS[I].P.Tag:=I;
END; i:=i+1;
END;
END;
end;

procedure TVertel.BotonCualquieraClick(Sender: TObject);
var
UnaFila: TFila;
begin
{ UnaFila := Filas[(Sender as TObject).tag];} esta es la parte que no me funciona quisiera me explicaras mejor como hacerlo.

ShowMessage(Format('El editor contiene: %s'#13'Y la etiqueta dice: %s',
[UNAFila.A.Text, UNAFila.B.Caption]);
end;



de antemano gracias por tu respuesta.

JULIPO
05-09-2006, 22:29:47
procedure TVertel.BotonCualquieraClick(Sender: TObject);
var
UnaFila: TFila;
boton:tbutton;
begin
boton:=tbutton(sender);
UnaFila := Filas[boton.tag];
ShowMessage(Format('El editor contiene: %s'#13'Y la etiqueta dice: %s',
[UNAFila.A.Text, UNAFila.B.Caption]));
end;


Gracias nuevamente

jachguate
06-09-2006, 00:05:16
Es cierto... cometí el error de castear a TObject, cuando en realidad debí castear a TComponent... un pequeño desliz..

Funcionaría sin mayores cambios si sustituyes

Sender as Tobject

por

Sender as TComponent.

Hasta luego.

;)