GetParent : convertir long en handle [Résolu]

Signaler
Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
-
Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
-
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

Messages postés
2187
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 août 2020
111
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

Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
2
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 ?
Messages postés
2187
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 août 2020
111
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
Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
2
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 ?
Messages postés
2187
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 août 2020
111
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



Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
2
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
Messages postés
2187
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 août 2020
111
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



Messages postés
791
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 août 2020
2
Merci pour tout mais j'ai laissé tomber, j'ai trouvé un moyen de ne pas avoir besoin du parent :-)