Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Form modale

32 views
Skip to first unread message

iaio

unread,
Mar 5, 2012, 7:13:51 AM3/5/12
to
Buongiorno a tutti,

sto avendo un'anomalia che non riesco a spiegarmi e soprattutto a
risolvere.
Sul mio form principale (chiamato FrmMain e settato come sMDIForm) ho
inserito un tasto col quale avvio una form modale:

procedure TFrmMain.VenditaClick(Sender: TObject);
begin
FrmVendita := TFrmVendita.Create(nil);
FrmVendita.ShowModal;
FrmVendita.Free;
end;

Ho impostato al FrmVendita i seguenti parametri
FormStyle = bsToolWindow
Position = poScreenCenter
perchè voglio che questo sia l'unico form attivo fino a quando non ne
esco di mia volontà.
Dato che questa procedura potrebbe richiedere diverso tempo, per
impedire l'avvio di altre procedure che potrebbero compromettere il
funzionamento del tutto, ho disabilitato la form riattivandola al
termine della procedura stessa.

procedure TFrmVendita.StampaClick(Sender: TObject);
begin
Enabled := False;

... seguono righe codice procedura ...

Enabled:= True;
end;

Ora non capisco perchè al termine del tutto il FrmMain si "riattiva".
Talvolta addirittura mi ritrovo il FrmMain sopra il FrmVendita. Altre
volte invece no, rimane sotto ma tutti i controlli sono nuovamente
attivi (ma chi gliel'ha detto?!? FrmVendita è modale, non dovrebbe
avere lui la priorità su tutto il resto? quindi il FrmMain non
dovrebbe avere tutti i controlli disabilitati finchè non chiudo il mio
FrmVendita?).

E' ovvio che durante la procedura che avvio in FrmVendita non c'è
alcun passaggio che riabilita il FrmMain, ho già controllato decine di
volte.

Dunque... avete un'idea di cosa accada e, soprattutto, mi potete dare
un consiglio per eliminare questo inconveniente?

Grazie mille,
Dario

amlo

unread,
Mar 5, 2012, 7:30:11 AM3/5/12
to
Il 05/03/2012 13:13, iaio ha scritto:


intanto sarebbe meglio

procedure TFrmMain.VenditaClick(Sender: TObject);
begin
try
FrmVendita := TFrmVendita.Create(nil);
FrmVendita.ShowModal;
finally
FreeAndNil(FrmVendita);
end;
end;



la form è modale per cui rimane attiva solo quella form fino alla sua
chiusura di conseguenza la Mainform non dovrebbe essere accessibile...o no?

iaio

unread,
Mar 5, 2012, 8:18:35 AM3/5/12
to
Teoricamente si, in pratica non è così. Non capisco perchè invece è
attiva. Prima di avviare la procedura in FrmVendita, la FrmMain è
disattivo.
Se sposto la finestra modale di lato col mouse non posso cliccare
nulla sulla form sottostante, così com'è giusto che sia. Poi, una
volta avviata la procedura, FrmMain si riattiva da sola. Non vorrei
che l'anomalia dipendesse da quel cambio della proprietà enabled che
ho inserito in FrmVendita, ma mi pare assurdo!!!

Giacomo Degli Esposti

unread,
Mar 5, 2012, 8:33:32 AM3/5/12
to
Il giorno lunedì 5 marzo 2012 13:13:51 UTC+1, iaio ha scritto:
> Buongiorno a tutti,
>
> sto avendo un'anomalia che non riesco a spiegarmi e soprattutto a
> risolvere.
> Sul mio form principale (chiamato FrmMain e settato come sMDIForm) ho
> inserito un tasto col quale avvio una form modale:
>
> procedure TFrmMain.VenditaClick(Sender: TObject);
> begin
> FrmVendita := TFrmVendita.Create(nil);
> FrmVendita.ShowModal;
> FrmVendita.Free;
> end;
[...]
> Ora non capisco perchè al termine del tutto il FrmMain si "riattiva".
> Talvolta addirittura mi ritrovo il FrmMain sopra il FrmVendita. Altre
> volte invece no, rimane sotto ma tutti i controlli sono nuovamente
> attivi (ma chi gliel'ha detto?!? FrmVendita è modale, non dovrebbe

ciao.

Secoli fa ricordo di aver avuto un problema simile. Il problema era
provocato da una modifica introdotta da windows XP che creava problemi
usando delphi 5 (tanto per dire quanto tempo fa era!!! :) non so se
nelle versioni successive di delphi il problema e' stato risolto...

Per dirla in modo breve e impreciso, il problema era legato al fatto che
se ci mette troppo a eseguire il codice prima del ShowModal(), windows considera la tua finestra principale come bloccata e quindi quando crea
la form modale in realta' non la crea come modale: ecco perche finisce
dietro e la form principale resta attiva.

Nel nostro caso il problema era nell'OnCreate della form modale che
era troppo lento. Spostando il codice da OnCreate a OnActivate abbiamo
ridotto il tempo tra il click e il ShowModal eliminando il problema.

ciao
Giacomo



News

unread,
Mar 5, 2012, 10:37:37 AM3/5/12
to
Se vogliamo far le pulci...

With TFrmVendita.Create(nil) do
try
showmodal;
finally
free;
end;

ma questo non credo risolva il problema di iaio, però evita di sporcare
la memoria se ci si dimentica di pulire la variabile FrmVendita


0 new messages