FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Duda con los Forms
Hola, tengo una duda sobre los forms; yo tengo dos forms que pinchando en un boton enlazan con otro form, luego en este último form hago doble click en un dbgrid pero quería saber si hay alguna manera de saber de que form vengo para que le devuelva los datos al que lo llamó, gracias.
|
#2
|
|||
|
|||
prueba con la propiedad tag del formulario 3, es una propiedad que admite numeros, por ejemplo.
si lo abres desde el formulario 1 Código:
procedure TForm1.BitBtn1Click(Sender: TObject); begin Form3.Tag:=1; end; end. Código:
procedure TForm2.BitBtn1Click(Sender: TObject); begin Form3.Tag:=2; end; end. Código:
procedure TForm3.BitBtn1Click(Sender: TObject); begin if form3.tag=1 then // viene del formulario 1 if form3.tag=2 then // viene del formulario 2 end; end. saludos. |
#3
|
||||
|
||||
Otra opción, podría ser que el form padre sea el Owner del hijo.. y solo tendrías que preguntar por el Owner para saber quien es el padre..
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#4
|
||||
|
||||
Yo para estos casos o similares suelo utilizar una variable bien pública o global según los casos.
Por ejemplo si en una lista de precios existen 3 tarifas para un mismo producto, le paso en la variable pública por ejemplor nTarifa:=1; en este caso sé que cuando el usuario seleccione el producto tengo que devoler la tarifa 1, aplicado al caso sería lo mismo, una estructura case y devolver el valor al formulario que corresponda. Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#5
|
||||
|
||||
Otra posible solución es mediante interfaces. Aunque reconozco que para un problema tan secnillo quizá sea excesivo, creo que puede servir para entender la idea.
En primer lugar definimos una interfaz que será la que deberán cumplir los forms "llamadores": Código:
unit ConRespuesta; interface type IConRespuesta = interface ['{64E8D975-447E-4B48-9BA0-21E503E19258}'] procedure Responde(Value: Integer); end; implementation end. Código:
unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ConRespuesta, StdCtrls; type TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public FormResponde: IConRespuesta; end; var Form3: TForm3; implementation {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); begin if FormResponde <> Nil then FormResponde.Responde(2); Close; end; end. Ahora pasamos a definir los dos forms que llamarán al tercero, ambos implementarán la interfaz creada y reaccionarán de manera diferente: Código:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ConRespuesta, StdCtrls; type TForm1 = class(TForm, IConRespuesta) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public procedure Responde(Value: Integer); end; var Form1: TForm1; implementation uses Unit3, Unit2; {$R *.dfm} { TForm1 } procedure TForm1.Responde(Value: Integer); begin ShowMessage('Form1'); end; procedure TForm1.Button1Click(Sender: TObject); var TepInterf: IConRespuesta; begin with TForm3.Create(Self) do begin //asignamos al puntero nuestra interfaz if Succeeded(QueryInterface(IConRespuesta, TepInterf)) then FormResponde := TepInterf; ShowModal; Free; end; end; //este método solo es para poder acceder al segundo form en el ejemplo procedure TForm1.Button2Click(Sender: TObject); begin with TForm2.Create(Self) do begin ShowModal; Free; end; end; end. unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ConRespuesta, StdCtrls; type TForm2 = class(TForm, IConRespuesta) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public procedure Responde(Value: Integer); end; implementation uses Unit3; {$R *.dfm} { TForm2 } procedure TForm2.Responde(Value: Integer); begin ShowMessage('Form2'); end; procedure TForm2.Button1Click(Sender: TObject); var TepInterf: IConRespuesta; begin with TForm3.Create(Self) do begin if Succeeded(QueryInterface(IConRespuesta, TepInterf)) then FormResponde := TepInterf; ShowModal; Free; end; end; end. Creo que este tipo de mecanismo puede ser muy potente en casos más complejos.
__________________
E pur si muove |
#6
|
|||
|
|||
Hombre a mi la solución mas sencilla me parece que es declarar un campo público de tipo TForm en el formulario que muestras al pulsar el botón en uno de los dos formularios anteriores, y en el momento de pulsar el botón le asignas el formulario de origen (Self)
En el formulario a mostrar: TForm2 = class(TObject) ... public FormOrigen: TForm; end; ... procedure TForm2.DBGridDblClick(Sender: TObject); begin // por ejemplo, mostrar el formulario de origen FormOrigen.Show; end; En el formulario de origen: procedure Form1.Button1Click(Sender: TObject); begin Form2.FormOrigen := Self; Form2.Show; end; |
|
|
|