PDA

Visualizza la versione completa : [delphi] chiudere form creata a runtime


123delphi321
12-04-2014, 17:39
Ciao a tutti, ho questa situazione:

ho un frame (FrameDiRicerca) e dentro di esso ho vari pannelli (TPanel)
in un panel di questi ho inserito un secondo TFrame nel quale c'e' un TButton.

in un certo punto della mia applicazione creo a runtime un TForm e, sempre a runtime, ci inserisco il mio FrameDiRicerca. poi effettuo lo showmodal del form creato.

io dovrei chiudere il form creato premendo il Tbutton presente nel pannello del FramediRicerca.



var
myForm: TForm;
myFrame: TFrameQueryBiglietti;
begin
PostMessageAbilitato:=False;
PostMessageId:=0;
myForm := TForm.Create(nil);
myFrame:= TFrameQueryBiglietti.Create(self);
try
myForm.WindowState:=wsNormal;
myForm.Position:=poDesktopCenter;
myForm.Caption:='Query Biglietti';
myFrame.Parent:= myForm;

if myForm.Showmodal = mrOk then
begin
ShowMessage(inttostr(PostMessageId));
end;

finally
PostMessageAbilitato:=True;
myFrame.Free;
myForm.Free;
end;



come devo fare per chiudere myForm?

grazie

denis76
13-04-2014, 19:48
Prova con myForm.ModalResult:= mrCancel;

123delphi321
13-04-2014, 22:16
Prova con myForm.ModalResult:= mrCancel;

ciao,

il tbutton è dentro il TFrameQueryBiglietti.
Tale frame lo utilizzo anche in altre form...e in tale TFrameQueryBiglietti (myFrame) non è presente la variabile myForm.

io ho provato anche cosi:

TForm(FindComponent(NomeForm)).ModalResult:=mrOk;

dove nomeform e' preventivamente assegnata a nomeform:=myForm.name (la form che devo chiudere).

con questo codice il programma viene compilato, ma in esecuzione va in errore.

qualche altro suggerimento?

grazie

Samuele_70
14-04-2014, 21:09
Ciao, io non uso delphi ma il c++, ma le vcl sono le stesse.
Non puoi creare una variabile TForm al programma principale a cui assegnerai l'indirizzo della finestra che crei ? e poi usare Close per chiuderla ?

123delphi321
15-04-2014, 11:24
Ciao, io non uso delphi ma il c++, ma le vcl sono le stesse.
Non puoi creare una variabile TForm al programma principale a cui assegnerai l'indirizzo della finestra che crei ? e poi usare Close per chiuderla ?

ciao,

grazie Samuele!!! ho fatto le prove e sembra proprio che funziona bene.
riesco a chiudere la form...

grazie!

alka
15-04-2014, 12:59
Una soluzione "pulita" potrebbe essere quella di creare un evento nel Frame che usi per la ricerca, che consenta a elementi esterni (controlli grafici o altro) di venire informati quando si effettua l'azione che dovrebbe comportare nel caso in esame la chiusura del Form che ospita l'interfaccia (ma un altro controllo potrebbe "reagire" diversamente).

In questo modo, non si va a creare una dipendenza tra il controllo che contiene il pezzo di interfaccia e il Form in cui viene inserito, né si obbliga il Frame a conoscere l'entità dell'oggetto che si iscrive all'evento per essere notificato e comportarsi di conseguenza, in questo caso con una chiusura da parte del Form "ospite".

Ciao! :ciauz:

123delphi321
16-04-2014, 11:14
Una soluzione "pulita" potrebbe essere quella di creare un evento nel Frame che usi per la ricerca, che consenta a elementi esterni (controlli grafici o altro) di venire informati quando si effettua l'azione che dovrebbe comportare nel caso in esame la chiusura del Form che ospita l'interfaccia (ma un altro controllo potrebbe "reagire" diversamente).

In questo modo, non si va a creare una dipendenza tra il controllo che contiene il pezzo di interfaccia e il Form in cui viene inserito, né si obbliga il Frame a conoscere l'entità dell'oggetto che si iscrive all'evento per essere notificato e comportarsi di conseguenza, in questo caso con una chiusura da parte del Form "ospite".

Ciao! :ciauz:

Ciao Marco,

scusami, non mi è molto chiara questa soluzione che suggerisci.

io uso quest tecnica:
1) prima della creazione del form che visualizzero' ShowModal setto una variabile globale: FinestraModal:=True
2) creo il MyForm e dentro ci metto il mio FrameDiRicerca
3) visualuzzo MyForm.Showmodal
...
nel FrameDiRicerca c'e' un pulsante che che a secondo del valore di FinestraModal si comporta diversamente:
FinestraModal= True....chiusura finestra (MyForm.ModalResoult:=MrOk) e conseguente assegnazione FinestraModal:=False
FinestraModal= False....passaggio ad altro frame del menu principale

La soluzione che suggerisci è ancora più "pulita" ?

grazie

alka
16-04-2014, 12:27
Diciamo che qualsiasi soluzione che preveda l'uso di una variabile globale tende a essere sempre "meno pulita", perché chiunque può modificarne il valore.

Detto questo, per poter precisare, cosa non ti è chiaro nello specifico della soluzione che ho proposto?

123delphi321
16-04-2014, 12:58
dici di creare un evento nel FramediRicerca...

ho questa situazione:



MyForm
|
|__FramediRicerca
|
|__FrameGrigliaRisultatiRicerca
|
|__Pulsante selezione


l'evento per la chiusura del MyForm è nel FrameGrigliaRisultatiRicerca, premendo questo pulsante ho scritto questo codece:


procedure TFrameGrigliaQueryBiglietti.cxGrid1DBBandedTableVi ewQueryBigliettiIDPropertiesButtonClick(
Sender: TObject; AButtonIndex: Integer);
begin
WM_Id:=DM.IBQueryBigliettiID.AsString;
if FinestraModal then myForm.ModalResult:=mrOk;
if FinestraModal then Abort;
PostMessage(Application.MainForm.Handle, WM_PAGECALL, Integer( TFrameBiglietteria ), 0);
end;


come devo fare per rendere tale soluzione 'pulita'?

grazie

Loading