Newsgroup: it.comp.lang.delphi
Titolo: Apertura di una seconda Form

Ciao a tutti,
     ho la seguente necessita': nel momento in cui si visualizza una form 
(con diversi TEdit al suo interno), si dovrebbe mostrare una seconda form 
modale, fatta una scelta sulla seconda form il controllo passa ad uno dei 
tedit della prima form.
Al momento, visto che non riesco a fare di meglio, la seconda form si 
visualizza alla pressione del tasto enter dei tedit.
Ho provato a chiamare la procedura nel onShow della prima form, ma si 
visualizza la seconda e la prima no.
Ho anche provato a richiamarla nel onchage del tedit, ma visto che il tedit 
viene settato prima della visualizzazione, anche in questo caso si 
visualizza prima la seconda form.
Qualche suggerimento ??
Grazie a tutti.
Ciao, Daniele
PS : Un appunto sulla questione STATO DELLA STAMPANTE.
       Proprio oggi ho fatto delle prove con internet explore e word.
       Ebbene, I.E. non si cura affatto dello stato della stampante, manda 
la stampa e tutto finisce li
      Ia prova stampante spenta : I.E. manda la stampa, Word , nel dialog, 
dice che la stampante e' in attesa (non off line)
     IIa prova stampante accesa ma senza fogli : I.E. manda la stampa, Word 
dice che la stmapante e' in attesa.
   IIIa e ultima prova stmapante accesa e aperta per il cambio inchiostro : 
I.E. manda la stampa, word dice che e' in attesa.
Conclusioni : Se anche chi ha progettato e scritto XP e/o VISTA non e' 
riuscito a risolvere il problema dello stato della stampante PRIMA di 
lanciare la stampa, credo che questo sia un problema che restera' insoluto 
per un bel po. 

 tedit della prima form.
Salve,
Il problema è molto semplice, anche a me è capitato un problema simile.
Basta inserire nella seconda Form una variabile pubblica in cui viene
memorizzata la scelta, per esempio:
[...]
  TForm2 = class(TForm)
  [...]
  public
    { Public declarations }
    Scelta: Integer;
  end;
var
  Form2: TForm2;
[...]
dopodiché nella prima Form andrà un codice del tipo:
[...]
  Form2.ShowModal;
  case Form2.Dcelta of
[...]
Ciao.


Il problema descritto da Daniele mi sembra un altro, la
visualizzazione della seconda finestra subito dopo la show della
prima.
Una soluzione banale potrebbe essere quella di intervenire nel punto
in cui viene chiamata la show della prima finestra.
Immagino che avrai un punto in cui fai questo:
...
Form1.Show;
...
nessuno ti vieta di scrivere così:
...
Form1.Show;
if Form2.ShowModal=mrOk then
  begin
    Form1.Edit1.Text:=Form2.[proprietà da ritornare]
  end;
...
Ovviamente dipende molto da come vuoi organizzare le tue form, forse
l'esempio che ti ho fatto lo avevi già scartato per altri motivi...
Ciao

  end;
C'e' un problema .... anche la prima e' modale ...
In sintesi, apro la prima e nell'evento oncreate setto tutti i controlli.
Poi passo alla visualizzazione onShow della prima e se il primo edit della 
form non e' vuoto allora appare la seconda form (che non e' niente di altro 
che una tabella filtrata in cui visualizzo una serie limitata di dati della 
tabella.
Se si sceglie un record alternaivo setto tutto, altrimenti non succede 
niente.
Quindi la mia difficolta' e' come visualizzare questa finestra in 
automatico, manualmente premendo ENTER va tutto bene.
Nel tuo esempio, dopo l'uscita dalla seconda form esco anche dalla prima , 
pero' ci sei andato molto vicino ....
Grazie ancora
Ciao
Daniele 

Daniele ha scritto:
 > Ho provato a chiamare la procedura nel onShow della prima form, ma si
 > visualizza la seconda e la prima no.
forse ti dico una stupidata ma non puoi usare sleep(1000) e poi inserire 
lo show della seconda form?
Saluti

 tabella.
Non è un po' fuorviante? Lo chiedo perché non mi è mai capitato di 
vedere un'applicazione in cui apparisse una "doppia Form modale in 
successione", o comunque lo riterrei fastidioso.
Non è meglio lasciare la comparsa del Form legata alla pressione del 
tasto specifico?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 visualizza la seconda e la prima no.
Il problema e' dato dal fatto che apri la seconda form nell'evento OnShow:
Windows mostra effettivamente le form solo dopo che e' stato eseguito
tutto il codice dell'evento OnShow, cioe' quando delphi restituisce a 
windows il controllo per gestire mouse, tastiera, eccetera.
Chiaramente se tu dentro a OnShow fai vedere una seconda form, che 
rimane aperta fino a che l'utente non la chiude, questo significa che la 
form1 non veine mostrata che alla chiusura della form2! :)
Per riuscire ad ottenere le due aperture devi fare in modo che la Form2 
venga mostrata in un altro evento di form1, successivo a OnShow.
Prova ad associare un metodo della form ad un messaggio di windows ed 
eseguire un PostMessage per assicurarti che il messaggio venga 
processato dopo che OnShow e' terminato, qualcosa del genere:
// non testato
const
   WM_POSTSHOW = WM_USER + 1;
type
   TForm1 = class(TForm)
     ...
     procedure PostShow( var Msg : TMessage ); message WM_POSTSHOW;
   end;
...
procedure TForm1.FormShow(Sender: TObject);
begin
   PostMessage( Self.Handle, WM_POSTSHOW ,0,0 );
end;
procedure TForm5.PostShow(var Msg: TMessage);
begin
   form2.ShowModal;
end;
Il nome WM_POSTSHOW e' inventato, puoi usare qualunque nome preferisci.
ciao
Giacomo