Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con le Api

Ciao a tutti, ho un problema con l'Api SetParent.
Mi piacerebbe infatti aprire Excel e impostarlo come "child" di un form
in vb.
Per fare questo  utilizzo questa chiamata API:
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As
Long,
ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
Dim AppExcel as Excel.Application
Set AppExcel = New Excel.Application
AppExcel.visible = true
pid = FindWindow(0&, "Microsoft Excel")
old_parent = SetParent(pid, me.hwnd)
end sub
Mi sembra che sia tutto corretto, tuttavia riscontro i seguenti
problemi:
1 - Quasi sempre la finestra di Excel mi si apre ma i menu di excel non
sono
visibili.
2 - Se sposto il focus da excel a un'altro controllo del mio form e poi
faccio nuovamente un clic sul foglio di lavoro di xls il focus non
ritorna
ad Excel. Conseguenza, qualsiasi tasto io pigi non succede nulla.
Qualcuno ha già riscontrato questo problema o ha idea di dove io sbagli.
Grazie a tutti
Maurizio

 ad Excel. Conseguenza, qualsiasi tasto io pigi non succede nulla.
il focus  windows lo da alla tua finestra e non a quella di excel perciò
deiv usare le api...
sicuramente ti arriverà il messaggio di gotfocus al tuo form (se avevi il
focus su altri controlli) da li gestisci il focus di excel con le api .Se
non ricordo male l'api per dare il focus è SetForegroundWindow (però vado a
memoria e sicuramente potrei sbagliarmi) cmq è molto semplice da trovare....
ciao
--
-------
sito: 
www.dadev.it
ultime: Ocx per irc testi freeware
-------

Grazie mille per la disponibilità, ho provato con il codice che mi hai
cosigliato ma ho incontrato alcuni problemi.
Infatti il focus non mi pare si sposti alla mia finestra. Per verificare su che
finestra si sposta il focus ho utilizzato la funzione GetActiveWindow con una
macro sul foglio Excel che si attiva ad ogni camiamento di selezione nelle
celle.
Il risultato è 0. Ossia se sposto il focus da Excel su un altro controllo e poi
rifaccio clic sul foglio excel, la macro con la funzione GetActiveWindow
restituisce il valore 0.
La cosa mi sembra inconcepibile, per cui se ha qualche idea ti ringrazio
anticipatamente.
Ciao
Maurizio
Antonio ha scritto:


 > ciao
chiaramente i miei son solo consigli visto che non l'ho provato (cmq mi hai
incuriosito e ci proverò sicuramente)
le possibilità sono molteplici:
1) modo rozzo potresti controllare il lostfogus dei tuoi controlli...
2) ci sarebbe la possibilità di gestire i messaggi del tuo form ,ossia
l'activewindows e il deactive tramite subclassing... ci sono esempi sul sito
comune
3) potresti controllare il click del mouse tramite _eventmouse o qualcosa
del genere (non ricordo bene l'api)
se vuoi un consiglio dai un occhiata al subclassing del tuo form ci sono
vari messaggi che puoi gestire che fanno al caso tuo..
(cmq una di queste sere provo se aspetti qualche giorno ti saprò dire :))


guarda ho provato e questo codice funziona benissimo ...
poi non mettere l'inizialiazzazione nell'evento load del form meglio in
altre parti dopo che il form č stato creato :)
Option Explicit
Dim AppExcel As Excel.Application
Private Sub Command1_Click()
 Dim pid As Long, old_parent  As Long
 Set AppExcel = Nothing
 Set AppExcel = New Excel.Application
 AppExcel.Visible = True
 DoEvents
 pid = FindWindow(vbNullString, "Microsoft Excel")
 old_parent = SetParent(pid, Me.hWnd)
End Sub
Private Sub Form_Unload(Cancel As Integer)
AppExcel.Quit
Set AppExcel = Nothing
DoEvents
End Sub


 guarda ho provato e questo codice funziona benissimo ...


 altre parti dopo che il form è stato creato :)


 ogni modo ti ringrazio infinitamente.
ho notato che solo una volta è successo quello che dici tu perciò credo sia
dovuto alla velocità di caricamento di excel (almeno credo) .Dovresti
provare a mettere la setparent in un altro ciclo (io non posso provare
perchè certi scherzi me li fa molto di rado ) inquesto modo:
Dim pid  As Long
Private Sub Command1_Click()
 Set AppExcel = Nothing
 Set AppExcel = New Excel.Application
 AppExcel.Visible = True
 DoEvents
 pid = FindWindow(vbNullString, "Microsoft Excel")
End Sub
Private Sub Command2_Click()
 Dim old_parent  As Long
 old_parent = SetParent(pid, Me.hWnd)
End Sub
questo è l'ultimo consiglio non saprei più che dirti anche perchè sul mio
computer funziona benissimo .
(uso office 97)


 ha scritto nel messaggio
