GetParent : convertir long en handle

Résolu
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - Modifié le 19 janv. 2020 à 18:42
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - 24 janv. 2020 à 18:48
Bonjour,
Une form en appelle une autre dans laquelle je voudrais connaître son parent.
J'utilise donc
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
...
GetParent(Me)

Le problème est que GetParent retourne un long alors que j'aurais besoin du Handle du parent.
Existe-t-il un moyen de convertir ce long en hwnd ou un autre moyen d'obtenir le hwnd du parent ?
Merci

7 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 19 janv. 2020 à 18:48
Bonjour !
Ne prendrais tu pas le problème à l'envers ?
GetParent te renvoie un long qui est le Hwnd de la fenêtre parent
Tu ne chercherais pas plutôt à avoir le nom de la Form parente ?
Peut-être une piste ici : https://codes-sources.commentcamarche.net/forum/affich-838809-retrouver-le-nom-d-une-feuille-form-parent-d-un-objet

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
Modifié le 20 janv. 2020 à 10:32
Non je ne cherche pas le nom de la Form parente mais bien son handle.
Le problème est que je reçois un Long et que si j'utilise ce Long dans une fonction qui a besoin d'un hwnd j'ai une erreur "Type mismatch" ce qui est logique.
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Function IsFormModal(frm As Form) As Boolean
...
If IsFormModal(GetParent(Me)) Then ... <== Type mismatch

D'où ma question : comment passer du Long à Hwnd ?
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 janv. 2020 à 18:30
Bonsoir
voici la solution je crois : http://allapi.mentalis.org/apilist/GetClassName.shtml

en passant ta fonction
Private Function IsFormModal(frm As Form) As Boolean
a bien comme paramètre le nom de la Form
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
21 janv. 2020 à 11:28
Bonjour,
Je ne comprends toujours pas (le lien concerne GetClassName).
Je cherche à savoir si la Form parente de la mienne est modale.
Pour savoir qui est mon parent j'utilise GetParent qui retourne un Long.
Pour savoir si une forme est modale j'utilise une fonction qui a besoin d'une Form.
Comment faire pour obtenir la Form à partir du Long ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 21 janv. 2020 à 13:30
Bonjour !
Teste ceci à tout hasard
il faut que la Form parente soit chargée

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long

Private Function GetForm() as Form
   Dim Buffer as String * 256 ' le buffer
   Dim Hwnd as Long = GetParent(Me) ' handle parent
   Dim Ret as Long = GetClassName(Hwnd, Buffer, 256) ' retourne la classe du parent dans Buffer
   If Ret > 0 Then
       For Each Frm In Forms
          ' on recherche dans la collection Forms la Form parente 
          If Frm.Name = lpClassName Then
             GetForm = Frm
             Exit For
         End If
      Next 
  Else
      GetFrm = Nothing
  End If
End Function

Private Function IsFormModal(GetFrm As Form) As Boolean
     If GetForm  <> Nothing then
        ' code de ta fonction
     End If
End Function



0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
22 janv. 2020 à 10:23
If GetForm <> Nothing Then ==> Invalid use of object !
Dim Hwnd as Long = GetParent(Me) ==> Expected end of statement
Dim Ret as Long = GetClassName(Hwnd, Buffer, 256) ==> Expected end of statement
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 22 janv. 2020 à 11:38
Bonjour
La première erreur je peux comprendre
Essaie ceci
Si ce n'est pas bon je ne peux plus rien ( je n'ai plus VB 6 depuis longtemps )

L'erreur "Expected end of statement" signifie que l'on ne peut pas déclarer et initialiser une variable sur la même ligne ( ce que l'on peut faire en VB Net et C# )

Dim i as integer = 1 ' c'est faux


Dim i as integer ' là c'est bon
i= 1


Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String,
ByVal lpWindowName As String) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long

' retourne la Form parente de la Form courante
Private Function GetForm() as Form
   Dim Buffer as String * 256 ' le buffer
   Dim Hwnd as Long, Ret as Long
   Hwnd = FindWindow(Me.Name, "") ' handle de la fenêtre courante
   Hwnd = GetParent(Hwnd) ' handle de la fenêtre parente
   Ret = GetClassName(Hwnd, Buffer, 256) ' retourne la classe du parent dans Buffer
   For Each Frm In Forms
          ' on recherche dans la collection Forms la Form parente 
          If Frm.Name = lpClassName Then
               GetForm = Frm
               Exit For
         End If
      Next 
   End Function

   Private Function IsFormModal(GetFrm As Form) As Boolean
             ' code de ta fonction
   End Function



0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
24 janv. 2020 à 18:48
Merci pour tout mais j'ai laissé tomber, j'ai trouvé un moyen de ne pas avoir besoin du parent :-)
0
Rejoignez-nous