Newsgroup: it.comp.lang.delphi
Titolo: Form modale

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
 

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?


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!!!

 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 
 
 
 


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