Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir mismo formulario con diferentes parametros (https://www.clubdelphi.com/foros/showthread.php?t=95581)

lbidi 22-02-2022 14:39:39

Abrir mismo formulario con diferentes parametros
 
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:
Código Delphi [-]
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:
Código Delphi [-]
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:


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.

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

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


La franja horaria es GMT +2. Ahora son las 05:58:59.

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