PDA

Ver la Versión Completa : Asignar variable a formulario


oscarac
21-03-2022, 21:30:37
buenas tardes
tengo un formulario el cual puede ser llamado desde otro formularios
la idea es identificar a traves de una letra el origen

algo asi como
form1
frmGramaje._origen = 'P';
form2
frmGramaje._origen = 'E';
form3
frmGramaje._origen = 'X';
form4
frmGramaje._origen = 'L';

en el evento oncreate de frmGramajes tengo un if, pero el valor de _origen viene en blanco

como puedo capturar ese dato ('P','E', etc) ???

oscarac
21-03-2022, 22:21:03
tuve que hacer la pregunta en el activate y no en el create

Neftali [Germán.Estévez]
22-03-2022, 09:16:48
tengo un formulario el cual puede ser llamado desde otro formularios
la idea es identificar a traves de una letra el origen

El problema es que no vemos el resto de código que estás utilizando para crear y asignar ese valor. Así que no podemos sugerirte otra opción.

tuve que hacer la pregunta en el activate y no en el create
El problema del evento OnActivate, es que se lanza continuamente (y seguramente más veces de las que necesitas).
A priori yo te sugeriría que utilizaras el OnShow o que utilices alguna otra forma de hacerlo (sobreescribiendo el OnCreate, por ejemplo).

oscarac
28-03-2022, 21:54:04
frmCatalogoPlato := TfrmCatalogoPlato.Create(self);
frmCatalogoPlato._Origen := 'I';
frmCatalogoPlato.ShowModal;


cuando hago esto, la variable "_Origen" no toma el valor de 'I' antes del form.create

en el create tengo un case

case _origen = 'I'... haz esto
case _origen = 'P'... haz esto
case _origen = 'M'... haz esto



la pregunta es...
como puedo hacer para que el formulario CatalogoPlato inicie con el valor 'I' en la variable _Origen

movorack
28-03-2022, 22:43:51
Hola, oscarac.

Según tu última respuesta entiendo que estás tratando de manejar el valor de la variable en el evento OnCreate, pero cuando pasas de la creación y tratas de asignar el valor a la variable, ya el evento OnCreate fue llamado y no puedes manipular la variable allí.

Como te dice Neftalí, puedes hacer la asignación y manejarla en el evento OnShow, puedes sobrescribir el evento de construcción del form (Create) o puedes manejar un evento al asignar el valor de la propiedad,

Ej: acá tengo el Form2, al cual le he añadido las propiedades _Origen y _Origen2 que apuntan a la misma variable F_Origen; También he sobrecargado la creación del TForm añadiendo el manejo de la variable Origen.


type
TForm2 = class(TForm)
Edit1: TEdit;
procedure FormShow(Sender: TObject);
private
F_Origen: string;
procedure set_Origen2(const Value: string);
{ Private declarations }
public
constructor Create(AOwner: TComponent; Origen:string); overload;
property _Origen: string read F_Origen write F_Origen;
property _Origen2: string read F_Origen write set_Origen2;
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

constructor TForm2.Create(AOwner: TComponent; Origen:string);
begin
inherited Create(AOwner);

F_Origen := Origen;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
Edit1.Text := Format('Origen: %s', [F_Origen]);
end;

procedure TForm2.set_Origen2(const Value: string);
begin
F_Origen := Value;
ShowMessage(Format('Origen: %s', [F_Origen]));
end;

end.


Desde otro formulario solo debo crear el formulario con el nuevo constructor


procedure TForm1.btnUseCreateClick(Sender: TObject);
var
lForm: TForm2;
begin
lForm := TForm2.Create(Self, obtOrigen);
try
lForm.ShowModal;
finally
lForm.Free;
end;
end;


Crear el formulario y asignar el valor de la propiedad _Origen


procedure TForm1.btnAssignPropClick(Sender: TObject);
var
lForm: TForm2;
begin
lForm := TForm2.Create(Self);
try
lForm._Origen := obtOrigen;
lForm.ShowModal;
finally
lForm.Free;
end;
end;


o crear el formulario y asignar el valor de la propiedad _Origen2


procedure TForm1.btnAssignProp2Click(Sender: TObject);
var
lForm: TForm2;
begin
lForm := TForm2.Create(Self);
try
lForm._Origen2 := obtOrigen;
lForm.ShowModal;
finally
lForm.Free;
end;
end;


En todos los llamados, el resultado es el mismo. En el evento OnShow alimenta un edit con el origen que haya seleccionado. Con la diferencia que en el caso de asignar el valor a _Origen2 presentará un mensaje antes de presentar el formulario.

oscarac
28-03-2022, 22:45:36
ya esta....
investigue en como modificar el constructor del create y me funciona.



cuando lo invoco

frmCatalogoPlato := TfrmCatalogoPlato.Create(Owner, 'I', qryInsumosKOd.Asstring);
frmCatalogoPlato.Show;


en el formulario....
constructor Create(AOwner: TComponent; Origen, Codigo: String); virtual;


constructor TfrmCatalogoPlato.Create(AOwner: TComponent; Origen, Codigo: String);
//procedure TfrmCatalogoPlato.FormCreate(Sender: TObject);
var strSql : string;
begin
inherited create(Owner);
dmGlobal.vResultVar := '';
dmGlobal.vResultTexto := '';
if Origen = 'M' then
StrSql := 'Select * from TblPlato where Empresa = :Empresa order by Kod'
else
StrSql := 'Select * from TblPlato C ' +
'Left Join tblPlatoD D on c.Empresa = d.empresa and c.KOD = d.kod ' +
'where C.Empresa = :Empresa and d.codigo = ' + QuotedStr(Codigo);



funciona como quiero...