Ver la Versión Completa : Abrir mismo formulario con diferentes parametros
lbidi
22-02-2022, 14:39:39
Muy buenas a todos.
Tengo la siguiente consulta.
Necesito abrir un formulario MDI , poder pasarle un parametro y asignarlo a un campo edit del mismo.
Dicho form puede llegar a abrirse hasta 4 veces y con diferentes parametro.
La idea es tener un parametro donde le pase un numero de telefono ( tomado del un caller id ) y abrir este formulario pasandole ya ese numero de telefono capturado y abra un nuevo formulario ya con
ese telefono capturado y asignado a un edit.
La primera vez que es abierto el formulario dicho parametro esta vacio, tengo un timer esperando la captura telefonica y cuando entra una llamada, la idea es abrir el mismo formulario en otra ventana
pero con el telefono capturado, se entiende ?
Muchas gracias por las sugerencias y opiniones.
Saludos
ecfisa
22-02-2022, 15:57:37
Hola.
Si entendí bien, un modo sería:
MDIChild:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
const
WM_AFTER_SHOW = WM_USER + 301;
type
TMDIChild = class(TForm)
Edit1: TEdit;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FParametro: string;
procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
public
{ Public declarations }
property Parametro: string read FParametro write FParametro;
end;
var
MDIChild: TMDIChild;
implementation {$R *.dfm}
procedure TMDIChild.FormShow(Sender: TObject);
begin
PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;
procedure TMDIChild.WmAfterShow(var Msg: TMessage);
begin
Edit1.Text := Parametro;
end;
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
MDIForm:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TMDIForm = class(TForm)
Panel1: TPanel;
Button4: TButton;
Button3: TButton;
Button2: TButton;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure CallMDIChild(const nro: Integer);
public
{ Public declarations }
end;
var
MDIForm: TMDIForm;
implementation {$R *.dfm}
uses Unit2;
procedure TMDIForm.CallMDIChild(const nro: Integer);
begin
MDIChild := TMDIChild.Create(Self);
MDIChild.Parametro := IntToStr(nro)
end;
procedure TMDIForm.Button1Click(Sender: TObject);
begin
CallMDIChild(111);
end;
procedure TMDIForm.Button2Click(Sender: TObject);
begin
CallMDIChild(222);
end;
procedure TMDIForm.Button3Click(Sender: TObject);
begin
CallMDIChild(333);
end;
procedure TMDIForm.Button4Click(Sender: TObject);
begin
CallMDIChild(444);
end;
end.
Salida del ejemplo:
https://i.postimg.cc/bv1GQ4Xn/ibidi.gif
Saludos :)
lbidi
22-02-2022, 17:35:22
Excelente ecfisa !!!
Justamente eso es lo que necesitaba, tenia idea de que habia que redeclararlo pero no sabia como.
Muchas gracias !!
Saludos
cloayza
22-02-2022, 19:57:15
Si me lo permite, expongo una variación.
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TMDIChild = class(TForm)
Edit1: TEdit;
Label1: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent; AParametro:String);
end;
var
MDIChild: TMDIChild;
implementation
{$R *.dfm}
constructor TMDIChild.Create(AOwner: TComponent; AParametro:String);
begin
inherited Create(AOwner);
Edit1.Text := AParametro;
end;
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TMDIForm = class(TForm)
Panel1: TPanel;
Button4: TButton;
Button3: TButton;
Button2: TButton;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure CallMDIChild(const nro: Integer);
public
{ Public declarations }
end;
var
MDIForm: TMDIForm;
implementation {$R *.dfm}
uses Unit2;
procedure TMDIForm.CallMDIChild(const nro: Integer);
begin
MDIChild := TMDIChild.Create(Self, IntToStr(nro));
end;
procedure TMDIForm.Button1Click(Sender: TObject);
begin
CallMDIChild(111);
end;
procedure TMDIForm.Button2Click(Sender: TObject);
begin
CallMDIChild(222);
end;
procedure TMDIForm.Button3Click(Sender: TObject);
begin
CallMDIChild(333);
end;
procedure TMDIForm.Button4Click(Sender: TObject);
begin
CallMDIChild(444);
end;
end.
Saludos cordiales
lbidi
22-02-2022, 20:26:45
Otra duda , es posible que el mismo mdichild se llame a si mismo con los parametros como uds indican ??
ecfisa
23-02-2022, 00:20:38
Hola.
Si por llamarse te refieres a crearse, podrías hacerlo de este modo:
MDIForm:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TMDIForm = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MDIForm: TMDIForm;
implementation {$R *.dfm}
uses Unit2;
procedure TMDIForm.Button1Click(Sender: TObject);
begin
TMDIChild.ShowChild(IntToStr(111));
end;
procedure TMDIForm.Button2Click(Sender: TObject);
begin
TMDIChild.ShowChild(IntToStr(222));
end;
procedure TMDIForm.Button3Click(Sender: TObject);
begin
TMDIChild.ShowChild(IntToStr(333));
end;
procedure TMDIForm.Button4Click(Sender: TObject);
begin
TMDIChild.ShowChild(IntToStr(444));
end;
end.
MDIChild:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TMDIChild = class(TForm)
Edit1: TEdit;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
class procedure ShowChild(const Value: string);
end;
var
MDIChild: TMDIChild;
implementation {$R *.dfm}
class procedure TMDIChild.ShowChild(const Value: string);
begin
MDIChild := TMDIChild.Create(nil);
MDIChild.Edit1.Text := Value;
end;
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
Saludos :)
lbidi
23-02-2022, 13:49:09
Barbaro ecfisa, me funciono perfectamente.
Saludos y muchas gracias nuevamente !
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.