Newsgroup: it.comp.lang.visual-basic
Titolo: Esempio sul sito comune

C'era un esempio sul sito comune per settare il focus per
una data form a partire dal suo hwnd.
Non lo trovo più. Che sia stato cancellato?
--
Saluti
Andrea Moro

 Non lo trovo più. Che sia stato cancellato?
ma scusa non e' l'effetto che provoca la "SetAlwaysOnTop" ?
Se intendi quello un link utile e' :
http://www.it-lang-vb.net/Archivio/FAQ/FAQ00044.HTM

Non proprio. Mi occorerebbe mettere in primo piano
una form, non un'applicazione intera. E comunque in via
occasionale. Nel senso, faccio doppio click su un item,
se l'item è già caricato non faccio altro che dargli
un setfocus.
Il problema è che questi miei item possono essere esplosi
in n istanze della stessa form. Quindi un formx.setfocus
potrebbe non mostrarmi la form contenente il dettaglio
corretto.
--
Saluti
Andrea Moro

corretto.
temo ci sia qualcosa di sbagliato nell'engineering dell'applicazione
-- 
ciao, hal

temo ci sia qualcosa di sbagliato nell'engineering dell'applicazione
ehm, ho premuto il Send troppo presto :-(
Come apri il form di dettaglio?
-- 
ciao, hal

 temo ci sia qualcosa di sbagliato nell'engineering dell'applicazione
Perchè?? Trovi strano poter lasciare l'utente aprire 100 form
di dettaglio? Cacchi suoi ... io ti do la possibilità, se poi ti confondi
sono
problemi tuoi.
O mi sbaglio. Certo per me sarebbe pure più semplice permetterne
di aprirne una sola per volta, ma mi mare una feature in più consentire
di aprirne due o più per volta, così che se devi fare dei raffronti, ha modo
senza troppe pugnette.
--
Saluti
Andrea Moro

 Come apri il form di dettaglio?
Set formx = new formx
così che posso avere n istanze della stessa form, ognuna
con le sue proprietà ... ma non i suoi eventi. Questo è un
dilemma che devo ancora risolvere.
--
Saluti
Andrea Moro



Questo lo avevi gia' detto ;-)
Non ho capito *cosa* desideri ottenere.
Magari possiamo trovare una soluzione.
-- 
ciao, hal

 Magari possiamo trovare una soluzione.
Sorry. Immaginati allora una flexgrid (non è quello l'oggetto,
ma per intenderci ci siamo). Dentro l'esplosione di un
dettaglio di un preventivo.
Bene doppio click su di un item e vedo la form del preventivo
con il preventivo caricato.
Doppio click su di un altro item, altra form con altro preventivo.
Ora se dopo n doppi click ... o anche solo dopo il primo,
l'utente mi rifà doppio click su di un preventivo già aperto
con form, ma con zorder = n, non posso certo fargli riaprire
nuovamente un'altra form. Cercherò invece con il suo hwnd
o il suo handle la form, dopodichè
..... ehm mi è ritornata in mente ... era l'api setfocus ...
bene avendo immagazzinato prima l'handle della form caricata
per quel preventivo, con la setfocus me la faccio ritornare in
primo piano.
--
Saluti
Andrea Moro

nuovamente un'altra form.
Non puoi semplicemente fare un loop sui form dei dettagli?
-- 
ciao, hal

 primo piano.
non basta! e se l'utente ha chiuso il form?
con l'API setfocus non succede nulla :(
devi, prima verificare con l'API IsWindow
se ti restituisce 0 la maniglia non e' piu' valida
e ne devi creare una nuova, diversamente usi
l'API SetForegroundWindow per portare in
primo piano la finestra che vuoi
HTH
by
r


Volendo. Però perchè sprecare tempo inutile, quando potrei
immagazzinarmi a monte il valore dell'handle dentro la flexgrid
e quando ci faccio doppio click, se il valore c'è allora richiamo
la setfocus, altrimenti carico la nuova finestra.
--
Saluti
Andrea Moro

Nerone wrote:

Potrebbe pure essere che la form sia stata chiusa e che ne sia stata 
aperta un'altra con lo stesso handle di quella chiusa. In tal caso, 
allora, si porterebbe in primo piano una form sbagliata.
Io stabilirei un legale padre-figlio tra la form principale e quelle dei 
preventivi e, nell'evento Unload di queste ultime, metterei il codice 
per la cancellazione dell'handle relativo immagazzinato dalla form 
principale.
Riferendomi alla esemplificazione delle Flexgrid fatta da Andrea Moro e 
con qualche ineleganza per brevità, io concettualmente farei cosi':
Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As 
Long) As Long
''''''''''''''''''
'Form Principale '
''''''''''''''''''
Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As 
Long) As Long
Private Sub MsFlexGrid1_DblClick()
     'In colonna 0 (preventivamente ripulita) memorizzo gli handle
     MsFlexGrid1.Col = 0
     If Not IsNumeric(MsFlexGrid1.Text) Then
         Dim FrmPreventivoScelto As FrmPreventivo
         Set FrmPreventivoScelto = New FrmPreventivo
         MsFlexGrid1.Text = FrmPreventivoScelto.hwnd
         Set FrmPreventivoScelto.owner = Me
         FrmPreventivoScelto.riga = MsFlexGrid1.Row
         FrmPreventivoScelto.Show
     Else
          SetForegroundWindow (CLng(MsFlexGrid1.Text))
     End If
End Sub
''''''''''''''''''
'Form secondaria '
''''''''''''''''''
Option Explicit
Public owner As FrmPrincipale
Public riga As Long
Private Sub Form_Unload(Cancel As Integer)
     owner.MsFlexGrid1.Row = riga
     owner.MsFlexGrid1.Col = 0
     owner.MsFlexGrid1.Text = ""
End Sub