Newsgroup: it.comp.lang.visual-basic
Titolo: Passare un oggetto privato ad un Ax EXE

Ciao,
avrei la necessità di passare una picture box ad un EXE Ax... ma la
cosa non è fattibile?
EXE Ax
Dim mPB As PictureBox
Public Sub SetPB(Value As Object)
  If TypeOf Value Is PictureBox Then
    Set mPB = Value
  End If
End Sub
------------------------------
Nel Client..
MyObj.SetPB Picture1
Quando eseguo l'istruzione del Client Picture1 vale 0 !?!
Ora, potrei capire che passare un riferimento ad un oggetto privato ad
un out-of-process possa nonn essere immediato...
..avete suggerimenti?
Io ho trovato solo questo:
http://support.microsoft.com/?scid=kb%3Ben-us%3B180714&x=10&y=14
Ma qui passa un'immagine serializzata in un file...
Tnx.
Daniele.

 ..avete suggerimenti?
In effetti la cosa sembra strana (non l'ho provata) anche se passare oggetti 
definiti da VB e non di sistema è un problema.
Però non è molto chiaro perchè devi passare una Picturebox.
Prova a passare una StdPicture o una IPictureDisp:
Public Sub SetPB(Value As StdPicture)
    If TypeOf Value Is StdPicture Then
        Set mPB.Picture = Value
    End If
 End Sub
MyObj.SetPB Picture1.Picture
Ciao

 Prova a passare una StdPicture o una IPictureDisp:
"Devo" (avevo pensato di) passare una Picturebox perchè ci devo
disegnare sopra
(per intenderci la devo usare per visualizzare la forma d'onda
aquisita dal waveIn).
Ora, o trovo un modo per farlo, o trovo un'altro 'oggetto' che mi
funga da "lavagna" oppure un altro metodo (sempre che non sia troppo
laborioso).
Tnx.
Daniele.

 laborioso).
In effetti ho fatto due prove ed è un casino.
Ti consiglio di passare semplicemente la PB.hDC anzichè la picture e 
disegnarci sopra con l'API GDI.
Ciao

 disegnarci sopra con l'API GDI.
Immaginavo....grazie!
Daniele.

 disegnarci sopra con l'API GDI.
Non mi ci raccapezzo...
Dato questo codice:
Nell'Ax
-------------------------------------------------------------
Dim PichDC As Long
Public Sub SetPichDC(Value As Long)
   PichDC = Value
End Sub
Public Sub DrawRect()
  Dim udtRect As RECT
  Dim hBrush  As Long
  Dim RetVal  As Long
  With udtRect
      .Left = 20
      .Right = 20
      .Top = 20
      .Bottom = 20
  End With
  hBrush = CreateSolidBrush(vbRed)
  RetVal = FillRect(PichDC, udtRect, hBrush)
  DeleteObject hBrush
End Sub
-------------------------------------------------------------
Nel Client:
Private Sub Form_Load()
  Set p = New AxProva
  p.SetPichDC Picture1.hDC
  p.DrawRect
End Sub
Mi aspetterei un quadrato rosso disegnato nella Picture...ma nada...
Dove sbaglio?
Tnx.
Daniele.

 Dove sbaglio?
Non so, con le fill ho sempre avuto grossi problemi e le ho tutte 
trascurate.
La FillRect poi non risulta nemmeno essere una GDI.
Tutte le altre però funzionano, ti conviene un loop di MoveTo()/LineTo() per 
farti un rettangolo pieno :)
Ciao 

 farti un rettangolo pieno :)
Bè, quello che ho postato è un semplice esempio..
(Cavolo, ho fatto l'esempio proprio con l'unica che un una delle
user32!!)
Io devo disegnare ben altro che rettangoli!! :-)
Per la precisione utilizzo proprio le MoveTo e LineTo, ma non appare
nulla! :-(
La butto lì...non è che c'entra qualcosa il fatto che le picture
"vivono" in un altro processo?
Tnx.
Daniele.

 "vivono" in un altro processo?
Alla fine ho provato con un AxExe e in effetti ha un comportamento del tutto 
strano... un hdc è di sistema e non ho capito come mai non va.
Però ho trovato una soluzione: tornando all'inizio quando passi la 
PictureBox, sembra che gli venga passato un numero, in realtà dev'essere un 
casino del debugger che mostra l'handle della picture, se guardi quanto 
passato come Object nella finestra delle espressioni di controllo in realtà 
passa la PictureBox, che non si sa perchè non riesce ad assegnare a una PB 
dando l'errore 13.
Però così risolvi la cosa:
Public Sub SetPic(Set Value As Object)
    ' il Value.hDC non funziona
   PichDC = GetDC(Value.hWnd)
End Sub
e lavori su quello.
Probabilmente funziona anche lavorando sull'object tipo
Dim pb As object
Public Sub SetPic(Set Value As Object)
    Set pb = Value
End Sub
...
pb.Line (20, 20) - (40, 40)
ma questa soluzione a me non piace: i metodi grafici funzionano male, danno 
problemi e sono pochi sull'oggetto originale, qui non hai nemmeno 
l'intellisense...
Ciao 

 l'intellisense...
Sono d'accordo, inoltre lavorando il late-binding ci sarebbe anche
tutto l'overhead delle varie chiamate a QueryInterface ecc.. del
runtime!
Grazie Fabio,
utile come al solito!
Bye,
Daniele.