PDA

Ver la Versión Completa : Pasar variables entre formas


dalyla2010
27-12-2010, 21:41:08
Hola a todos,

Lo que quiero hacer es que al presionar un boton me aparesca una consulta para buscar un cliente, y al darle doble clic a un grid me devuelva el id del cliente. En este caso la forma me devuelva un integer y no un mrOk, mrYes, etc.

Quiero que el proceso de la forma que llama se detenga en el show. Pero este continua, no se detiene como puedo cambiarlo a processmessage o algo asi, para que se detenga hasta que yo cierre mi forma.

Estoy usando delphi 2009

dalyla2010
28-12-2010, 01:21:07
Ok resuelto, de hecho la respuesta ya estaba en este foro, solo que por nombre no la encontraba, bien...

La forma padre, la tengo como MDIChild, supongo que no hay problema si es MDIForm, esta manda llamar al hijo con hijo.ShowModal. El hijo debera ser un fsNormal, con la propiedad visible = false;

Enla unidad padre tendra esta parte de codigo o algo similar:
try
hija := TfrmBuscar.Create(self);
hija.ShowModal;
finally
if hija.resultado <> '' then
edcliente.Text := hija.resultado;
end;

Aclarando que resultado es una variable publica en la forma hija.

Supongo que de este modo talvez se puedan pasar mas datos. Esto esta muy concreto, espero a alguien le sirva este resumen.

Casimiro Notevi
28-12-2010, 01:30:16
Gracias por el aporte.

ElKurgan
28-12-2010, 07:40:24
Por cierto, encantador el avatar de Harley Quinn.

Saludos

dalyla2010
28-12-2010, 18:57:38
jajaja gracias >0<

ecfisa
28-12-2010, 20:51:13
Hola dalyla2010.

Otra forma que podés utilizar para enviar y recibir datos entre forms es:

Form1 ( Receptor )

type
TForm1 = class(TForm)
...
private
FResultado: string;
procedure RecibirMsg(var Msg: TMessage); message WM_USER + 300;
public
end;
...
interface

uses Unit2;
...
procedure TForm1.RecibirMsg(var Msg: TMessage);// Capturar mensaje
begin
FResultado:= PChar(Msg.LParam); // FResultado <- cadena enviada desde Form2
end;
...


Form2 ( Remitente )

...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
Value: string;
begin
Value:= 'SALUDOS DESDE FORM2'; // lo que quieras que reciba Form1 en FResultado
SendMessage(FindWindow('TForm1','Form1'), WM_USER + 300, 0, DWORD(Pchar(Value)));
Action:= caFree;
end;


La función FindWindow debe especificar el nombre de clase y de form que correspondan al receptor.
En este caso utilizé un string pero podés pasar otros tipos de datos.

( Totalmente de acuerdo con ElKurgan ;) )

Un saludo.

dalyla2010
29-12-2010, 00:42:10
Gracias, si esta mas complicado, tal vez se pueda simplificar con una funcion y solo llamarla, y asi utilizarla mas veces. Excepto por el FindWindow, lo demas es constante?

ecfisa
29-12-2010, 16:15:42
Hola dalyla2010.

Se puede hacer un procedimiento para enviar el mensaje, lo podrías ubicar en la interface de alguna unidad de uso común.

Algo como:

procedure EnviarMensaje(Cadena, FrmClassName: string);
begin
SendMessage(FindWindow(PChar(FrmClassName), PChar(Copy(FrmClassName, 2, 255))),
WM_USER + 300, 0, DWORD(Pchar(Cadena)));
end;


Un ejemplo de uso sería:

EnviarMensaje('MENSAJE ENVIADO','TFormReceptor');


Pero el procedimiento para recibir el mensaje tendrías que incluirlo en cada form receptor, es decir:

...
private
FResultado: string;
procedure RecibirMsg(var Msg: TMessage); message WM_USER + 300;
...
implementation

procedure TFormReceptor.RecibirMsg(var Msg: TMessage);
begin
FResultado:= PChar(Msg.LParam);
end;


Un saludo.