2011-10-19 12 views

Respuesta

10

Espero que su botón OK tenga ModalResult establecido en mrOK. Si desea agregar la comprobación de errores al botón Aceptar, cámbielo a mrNone. Agregue un controlador OnClick al botón que hace la comprobación o el procesamiento que necesita. Si determina que el formulario puede cerrarse, establezca Self.ModalResult := mrOK en el controlador OnClick.

+3

Felicitaciones por haber alcanzado la cima de [todos los usuarios de Delphi] (http://stackoverflow.com/tags/delphi/topusers). – NGLN

+0

¿Alguien sabe por qué Esta respuesta tiene 2 votos a favor? Parece ser la única respuesta que aborda la parte de la pregunta "retrasar el cierre hasta que digo que puede cerrarse". –

+0

@DavidHeffernan, mi respuesta sí :). ¡Y tienes mi voto popular! –

7

¿Realmente necesita acceder a la información antes de cerrar el formulario? Retrasar el cierre de un formulario afectará la experiencia de los usuarios de la aplicación (a menos que sea lo suficientemente rápido como para que no lo noten, en cuyo caso ¿por qué demorarlo?)

Todavía hay un formulario cerrado en la memoria para el llamador (a menos que la acción de cierre sea caFreeOnClose). Por lo tanto, debería poder agregar propiedades públicas al formulario al que puede acceder dentro de la persona que llama.

por ejemplo

Type Form2 = Class(TForm) 
public 
    //Add a public property here 
end; 

De la persona que llama:

if Form2.ShowModal = mrOk then 
begin 
    InformationIWant = Form2.PublicProperty; 
end; 
+0

Algunos problemas aquí: 1. 'Show' no es una función. Supuestamente significa 'ShowModal'. 2. No aborda la parte de la pregunta que habla sobre "retrasar el cierre hasta que yo diga que puede cerrarse". –

+0

@DavidHeffernan: Gracias David, actualmente no tengo acceso a Delphi, así que no pude verificar. He actualizado la respuesta. He intentado abordar su segundo punto –

+0

Es común querer validar datos y bloquear el cierre del formulario. Eso tiene que suceder dentro del formulario y no después de que 'ShowModal' regrese. –

2

Como Además de JamesB's answer.

Debe llamar a Form2.Free, después de tomar la información que desea.

por lo general añadir una nueva función a la unidad de la segunda forma, algo así como:

type 
    TForm2 = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    InformationIWant : SomeType; 
    end; 

var 
    Form2: TForm2; 

function ReturnValue : SomeType 

implementation 

function ReturnValue : Sometype; 
begin 
    try 
    if Form2 = nil then 
     Form2 := TForm2.Create(nil); 
    Form2.Windowstate := wsNormal; 
    Form2.BringToFront; 
    SetForegroundWindow(Application.Handle);  
    if Form2.ShowModal then 
     Result := InformationIWant 
    finally 
     FreeAndNil(Form2); 
    end; 
end; 
+0

FreeAndNil (Form2) deja en claro que Form2 puede ser una variable local en 'ReturnValue', en lugar de una variable global. – mjn

5

Sólo una combinación de lo que otros dicen.

Es una buena idea formalizar cómo validar y obtener datos de un diálogo modal. Usar la misma técnica una y otra vez hace que todo sea más fácil de mantener y leer.

Un ejemplo:

Type TFormModal = Class(TForm) 
    procedure OnOkClick(Sender : TObject); 
    function ValidateInterface : boolean; 

public 
    procedure SetInterface(input data here); 
    procedure GetInterface(output data here); 

end; 

procedure TFormModal.OnOkClick(Sender : TObject); 
begin 
    if ValidateInterface 
    then modalResult := mrOk 
    else modalResult := mrNone; 
end; 

de su forma principal:

procedure MainForm.OnShowMyModalFormClick(sender : TObject); 
var 
    myModal : TFormModal; 
begin 
    ... 
    myModal := TFormModal.Create(nil); 
    try 
    myModal.SetInterface(...); 
    if (myModal.ShowModal = mrOk) then myModal.GetInterface(...); 

    finally 
    myModal.Free; 
    end; 
    ... 
end; 
2

Una alternativa a la respuesta de David es el uso de cualquiera de OnClose o OnCloseQuery eventos. Con OnCloseQuery puede evitar que se cierre el formulario configurando CanClose := false;

Cuestiones relacionadas