PDA

Ver la Versión Completa : reusar un mismo form


enecumene
17-08-2007, 04:01:22
Hola Amigos del foro tengo esta duda, sucede lo siguiente tengo esto:

***FTramite(form)***

SpeedButton1...10
DBEdits1...10

***FBuscarPed(form)***

DBGrid1
BitButton1
Bitbutton2

hasta ahora supongo que van entendiendo, quisiera reusar el form FBuscarPed por cada SpeedButton que hay en FTramite. por ejemplo:

en el SpeedButton1 abre el form FBuscarPed y el codigo del BitButton1 es el siguiente:

procedure TFBuscarPed.BitBtn1Click(Sender: TObject);
begin
FTramite.DBEdit1.Text:=TbPedidono.AsString;
FTramite.dbId1.Text:=TbPedidono_ped.AsString;
FTramite.dbTipo1.Text:=TbPedidotipo_exp.AsString;
FTramite.dbDpto1.Text:=TbPedidodpto.AsString;
Close;
end;

aqui esta el asunto como hago que en cada SpeedButton cuando abre el mismo form FBuscarPed el codigo varie? por ejemplo:

SpeedButton2.FBuscarPed.Show el bitbutton1 del FBuscarPed cambie de codigo asi:

procedure TFBuscarPed.BitBtn1Click(Sender: TObject);
begin
FTramite.DBEdit2.Text:=TbPedidono.AsString;
FTramite.dbId2.Text:=TbPedidono_ped.AsString;
FTramite.dbTipo2.Text:=TbPedidotipo_exp.AsString;
FTramite.dbDpto2.Text:=TbPedidodpto.AsString;
Close;
end;

en vez del primer codigo y asi sucesivamente, no se si me hice entender, solo que quiero evitar tener que hacer el form FBuscarPed 10 veces, supongo que se hace con la sentencia CASE, espero que hayan podido entender lo que trato de hacer.

Saludos.

rcubillos
17-08-2007, 07:20:11
Una forma sencilla de realizar los es utilizando el método FindComponent del formulario para buscar Dinamicamente el que corresponde a cada botón, como necesitas diferenciar cuales son el conjunto de componentes asociados a cada boton utiliza la propiedad tag del boton como indice.

Ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
TEdit(self.FindComponent('Edit'+intToStr( TControl(Sender).Tag) )).Text:='HOLA'
end;
Aqui asigno al edit cuyo nombre es edit + nro de la propiedad tag del boton presionado el texto Hola, en tu caso el resultado de algo mas.

enecumene
17-08-2007, 17:57:18
Gracias rcubillos por tu respuesta pero no me llego a funcionar lo tengo asi:

procedure TFBuscarPed.BitBtn1Click(Sender: TObject);
begin
FTramite.dbId2(self.FindComponent('dbId2'+intToStr( TControl(Sender).5) )).Text:=TbPedidono_ped.AsString;
Close;
end;

y me sale el siguiente error:

[Error] BuscarPed.pas(82): Missing operator or semicolon
[Error] BuscarPed.pas(82): Identifier expected but number found

que estoy haciendo mal?

Saludos...

dec
17-08-2007, 18:02:22
Hola,


TControl(Sender).5


Puede que quisieras decir:


TControl(Sender).Tag

enecumene
17-08-2007, 20:16:52
Hola dec y rcubillos lo he puesto asi:

FTramite.dbId1(self.FindComponent('dbId1'+intToStr( TControl(Sender).Tag) )).Text:=TbPedidono_ped.AsString;

pero sucede que me sale este error aque se debe?:

[Error] BuscarPed.pas(82): Missing operator or semicolon

Saludos...

maeyanes
17-08-2007, 20:39:20
Estás haciendo mal las cosas...

La función FindComponent te devuelve un objeto de tipo TComponent. Este objeto lo tienes que "convertir" en un TEdit para poder asignar bien el valor:


// Este método debe estar asignado al evento OnClick de todos los TBitBtn
procedure TForm1.BitBtnClick(Sender: TObject);
var
Index: string;

begin
Index := IntToStr(TBitBtn(Sender).Tag);
TDBEdit(FindComponent('DBEdit' + Index)).Text := TbPedidono.AsString;
TDBEdit(FindComponent('dbId' + Index)).Text := TbPedidono_ped.AsString;
TDBEdit(FindComponent('dbTipo' + Index)).Text := TbPedidotipo_exp.AsString;
TDBEdit(FindComponent('dbDpto' + Index)).Text := TbPedidodpto.AsString
end;


Con el ejemplo anterior, a cada TBitBtn de tu forma debes asignarle su propiedad Tag de tal forma que el que quieras que llene los TDBEdits con terminación 1 tenga como valor 1...


Saludos...

enecumene
17-08-2007, 22:00:43
Gracias maeyanes por tu respuesta, pero debido a mi ignorancia al no saber nada sobre los Tags y debido tambien a que el codigo que me sugeriste tampoco me funciono, decidi usar las sentencias if...then.else de esta manera:

procedure TFBuscarPed.BitBtn1Click(Sender: TObject);
var
Index1: string;
Primero: string;
Segundo: string;
begin
Index1:= Label3.Caption;
Primero:='Agregar Primer Pedido';
Segundo:='Agregar Segundo Pedido';
if Index1 = Primero then
begin
FTramite.DBEdit1.Text:=TbPedidono.AsString;
FTramite.dbId1.Text:=TbPedidono_ped.AsString;
FTramite.dbTipo1.Text:=TbPedidotipo_exp.AsString;
FTramite.dbDpto1.Text:=TbPedidodpto.AsString;
Close;
end
else
if Index1 = Segundo then
begin
FTramite.DBEdit2.Text:=TbPedidono.AsString;
FTramite.dbId2.Text:=TbPedidono_ped.AsString;
FTramite.dbTipo2.Text:=TbPedidotipo_exp.AsString;
FTramite.dbDpto2.Text:=TbPedidodpto.AsString;
Close;
end;

end;

les agradezco a todos por sus respuestas y tambien recibo criticas y mejoras del actual codigo.. gracias

Saludos

b3nshi
18-08-2007, 01:44:48
Mmm... criticas... si puede ser... creo q la forma q decidiste utilizar no es la mas eficiente, puesto q te podrias ahorrar lineas de codigo utilizando las formas presentadas anteriormente en las respuestas...

Pero bueno... queda a criterio tuyo, te recomendaria seguir intentando hacerlo como te dijeron para de paso darte la oportunidad de aprender...

En cuanto al codigo q elegiste... una recomendacion... no es q este escrito en algun libro, simplemente yo lo considero mejor...

Cuando se trata de comparar cadenas de texto, es conveniente quitar espacios al principio de la cadena y pasar todo el texto a mayúsculas, para de esa forma poder comparar mejor dos cadenas... En este caso no se de q depende el texto del Label3 pero si este depende del usuario, el mismo debera ingresar el texto exactamente como tu se lo asignas a primero y segundo.

Esto te recomiendo q cambies en tu codigo:


Index1:= trim(uppercase(Label3.Caption));
Primero:='AGREGAR PRIMER PEDIDO';
Segundo:='AGREGAR SEGUNDO PEDIDO';


{Saludos}