Newsgroup: it.comp.lang.delphi
Titolo: MDIChild e focus, semplice no?

Un saluto a tutti.
Sto cercando di passare il focus ad una MDIchild, nel caso questa esista 
gia', quando l'utente clicca sul medesimo menuitem che l'ha creata.
Accade che:
- se non esiste ok. ;-)
- se la form esiste ed e' minimizzata tutto ok.
- se la form esiste ed e', anche parzialmente, coperta da un'altra 
allora niente da fare! Non rieso a passarli il focus e farla diventatare 
la finestra attiva.
Questo il pezzetto di codice:
-----8<-----------------------------------------------------
procedure TMainForm.mHotelConsClick(Sender: TObject);
var fCreated: boolean;
     i: integer;
begin
   //[...]
   for i:= 0 to MainForm.MDIChildCount-1 do
   begin
     if MainForm.MDIChildren[i] is TfrmCounters then
     begin
       if (MDIChildren[I].WindowState = wsMinimized) then
       begin
         MDIChildren[I].WindowState:=wsNormal;
       end;
       //MDIChildren[I].WindowState:=wsNormal
       MDIChildren[I].SetFocus;
       //MDIChildren[I].BringToFront;
       fCreated:=True;
       Break;
     end;
   end;
   if not fCreated then
   begin
     TfrmCounters.Create(Application);
   end;
end;
-----8<-----------------------------------------------------
Dove si possono trovare commentati anche alcuni dei disperati 
tentativi... :-(
Any help??

 ha scritto nel messaggio
news:bra23u$15sk$1...@newsreader1.mclink.it...
...[CUT]

potresti provare a fare semplicemente
MDIChildren[i].show;
Salvo

 MDIChildren[i].show;
Grazie ma e' stato il primo brillante tentativo... nun funziona.

 ha scritto nel messaggio
news:bra54k$17sr$1...@newsreader1.mclink.it...

strano a me funziona...
ti posto il codice....
allora ho una funzione che mi dice se una determinata form dato il nome,
esiste...
function Esiste (nome:string):boolean;
var i:integer;
    trovato:boolean;
begin
    result:=false;
    for i:=0 to screen.FormCount-1 do
    begin
        if (uppercase(screen.Forms[i].name)=uppercase(nome)) then
        begin
            result:=true;
            exit;
        end;
    end;
end;
poi faccio semplicemente sull'onclick del tuo pulsante:
begin
    if not Esiste('NomeMiaForm') then
        NomeMiaForm:= TMiaForm.Create(application);
    NomeMiaForm.show;
end;
questo dovrebbe funzionare...

     for i:=0 to screen.FormCount-1 do
Non credo che screen contenga riferimenti alle child forms di 
un'applicazione. Vedremo...


Io faccio cosě:
  if not Assigned(Form1) then
    begin
      Cursor := crHourGlass;
      Form1 := TForm1.Create(Application);
      Form1.Show;
      Cursor := crDefault;
    end
  else Form1.BringToFront;
nell'else comunque dovrai gestire il caso in cui la form sia minimizzata, ma
mi pare che lě non hai problemi.
E' essenziale perň che le MDIChild siano escluse dalla creazione automatica
all'avvio dell'applicazione, e che in ogni MDIChild, nell'evento OnClose tu
metta l'istruzione del tipo:
   Form1 := nil
altrimenti se la chiudi e provi a riaprirla avrai un errore.

Mi autorispondo, per la seria condividiamo le soluzioni oltre che i 
problemi...
Ad un certo punto qualcuno ha sussurrato di invertire le chiamate 
BringToFront e SetFocus e poi...Ci siamo quasi...
invertendo le due chiamate funziona, ma solo se la form non e' nello 
stato wsMinimized (che prima funzionava).
Pare che la soluzione sia non chiamare BringToFront dopo il cambio di 
stato a wsNormal se la window era wsMinimized.
In sostanza, dato WindowState = wsMinimized, la sequenza 
WindowState:=wsNormal -> .BringToFront -> .SetFocus gli fa perdere il focus!
A volte si diventa scemi per delle immani stronzate, il che fa venir 
voglia di usare le api win32 anziche' le funzioni di libreria.
Insomma ho dovuto rimuovere a parte del codice comune ai due stati, quindi:
-----8<-----------------------------------------------------
   for i:= 0 to MainForm.MDIChildCount-1 do
   begin
     if MainForm.MDIChildren[i] is TfrmCounters then
     begin
       if (MDIChildren[i].WindowState = wsMinimized) then
       begin
         MDIChildren[i].WindowState:=wsNormal;
       end
       else
       begin
         MDIChildren[i].BringToFront;
       end;
       MDIChildren[i].SetFocus;
       fCreated:=True;
       Break;
     end;
   end;
-----8<-----------------------------------------------------
Ciao e grazie.