Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   reusar un mismo form (https://www.clubdelphi.com/foros/showthread.php?t=47074)

enecumene 17-08-2007 04:01:22

reusar un mismo form
 
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:

Código Delphi [-]
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:

Código Delphi [-]
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

Busqueda de Componentes por nombre
 
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:
Código:

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:

Código Delphi [-]
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:

Cita:

[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,

Código Delphi [-]
TControl(Sender).5

Puede que quisieras decir:

Código Delphi [-]
TControl(Sender).Tag

enecumene 17-08-2007 20:16:52

Hola dec y rcubillos lo he puesto asi:

Código Delphi [-]
FTramite.dbId1(self.FindComponent('dbId1'+intToStr( TControl(Sender).Tag) )).Text:=TbPedidono_ped.AsString;

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

[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:

Código Delphi [-]
// 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:

Código Delphi [-]
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:

Código Delphi [-]
Index1:= trim(uppercase(Label3.Caption));
Primero:='AGREGAR PRIMER PEDIDO';
Segundo:='AGREGAR SEGUNDO PEDIDO';

{Saludos}


La franja horaria es GMT +2. Ahora son las 05:51:39.

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