IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Récupérer le Handle d'un bouton d'une application extérieur.


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut Récupérer le Handle d'un bouton d'une application extérieur.
    Bonjour,

    En lisant les posts qui font actuellement débat, j'ai eu envie d'essayer de cliquer sur un bouton d'une application extérieure.

    J'arrive à récupérer le Handle de l'application que je souhaite contrôler.
    Maintenant, ce que je cherche à faire, c'est trouver le Handle d'un bouton situé sur l'application extérieure et là, je ne sais pas comment m'y prendre...

    Une fois que j'aurai le Handle, il me suffira d'envoyer un Message ...

    Merci d'avance
    Cordialement

  2. #2
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut
    Bonjour à toi,


    Je n'ai pas de code sous la main mais de mémoire comme ça tu peux utiliser les fonctions suivantes :
    FindWindow pour récupérer le Handle de ta fenêtre (mais apparemment ça c'est OK )
    GetWindow(handle_de_ta_fenetre,GW_CHILD) qui te permettra, si je ne m'abuse, de "naviguer dans ta fenetre". Ainsi en fait tu considère un peu chaque composant comme une fenêtre telle celle de ton application.

    Combiné avec la fonction GetClassName() pour savoir si tu as un TButton ou pas

    Bref ce n'est qu'une petite piste ayant déjà fait ceci récemment ... Je vais voir si je peux d'ailleurs retrouver le sujet

    Il y a certainement une autre façon

    Bonne chance


    [EDIT] voila le post que j'avais laissé :
    http://www.developpez.net/forums/sho...d.php?t=288287
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  3. #3
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Salut, comme tu naviguais aussi dans le forum cousin C++Builder, je te redonne un lien que j'estime 'précieux' : un bout de code du très vénérable mais trop rare Djob

    Avec ca, ca devrait le faire ... tu devrais trouver de quoi faire ton bonheur.

    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci SunChaser

    Oui oui, je navigue sur les 2 plans, BCB and Delphi.

    Sacré tartine le code que tu m'as filé, je sans que je vais le désossé petit à petit et j'espère arrivé à tout saisir

    Bon, je commence ce soir? Humm peut être

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Sinon, j'ai très agréablement 'triché' un peu pour des affaires similaires, c'est a dire qu'afin de repérer plus facilement les object 'parent' et leurs classes j'ai joué avec WindowSpy.
    Pratique et efficace ...
    Trouvé sur ce forum d'ailleurs (pour ma part ... de mémoire).
    (et d'ailleurs, je vais peut être dire une bêtise mais bon ... c'est pas codé ne Delphi ce truc ?)

    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Oua, ca fait 3/4h que je cherche et j'avance pas du tout !

    Je cherche comment on utilise la fonction EnumChildWindows() mais je comprends pas ...

    Car logiquement, on peut éviter de passer par la position de la souris et faire une batteries de tests en regardant le Handle et sa classe ....

    J'aimerai bien avoir juste un petit exemple afin que vous m'expliquiez comment ça fonctionne car niveau doc, y a pas grand chose en français.

    Merci

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    recherche du cote des defis et de la triche au demineur tu aura tout les exemple que tu veut

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Anapurna,

    J'ai regardé dans le code source du démineur, (code du défieur) et je trouve nulle part le EnumChildWindows ...

    Je vais encore chercher!

    Merci

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par ero-sennin
    J'ai regardé dans le code source du démineur, (code du défieur) et je trouve nulle part le EnumChildWindows ...
    Regarde les codes sources d'Anapurna (unit UInteractor.pas) tu trouveras un exemple d'utilisation.

    @+ Claudius

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci Cl@udius

    J'ai trouvé, je regarde attentivement le code

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Rebonjour,

    J'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    procedure RechercheEnfants(HParent : HWND);
    // Handle : Handle de l'enfant
    var
      Handle : THandle;
      Titre:PChar;
      HandleEtTitre:string;
    begin
      Handle := GetWindow(HParent,GW_CHILD);  // Recherche de la première fenêtre enfant direct
      while Handle<>0 do  // Tant qu'on en trouve ....
        begin
          Titre:=StrAlloc(256);
          RechercheEnfants(Handle) ; // Recherche de ses propres enfants
          GetWindowText(Handle,Titre,256);
          HandleEtTitre:=IntToStr(Handle)+' - '+Titre;
          ShowMessage(HandleEtTitre);
          Handle := GetNextWindow(Handle,GW_HWNDNEXT); // recherche du Handle suivant
        end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    HandleParent:HWND;
    NomClasseParent:PChar;
    begin
      NomClasseParent:=StrAlloc(256);
      HandleParent:=FindWindow(nil,'WebRadioPlayer');
      GetClassName(HandleParent,NomClasseParent,256);
      ShowMessage(NomClasseParent);
      RechercheEnfants(HandleParent);
    end;
    Et je voudrai avoir quelques détails pour bien comprendre ...

    Mon Application se nomme WebRadioPlayer.
    J'arrive donc à abtenir sa classe et via la procédure RechercheEnfants, je recherche les Handles qui sont sur cette fiche.
    Question bête: On fait un StrAlloc(256) car la chaine ne peut contenir que 256 caractères maxi ?
    Ensuite, cette procédure est récursive mais je ne sais pas comment voir si elle fonctionne car dans mon cas, que je la mette où non, j'ai toujours le même nombre de Handle.
    Enfin, si je crée une Form à partir de ma Form principale mais dont le titre est différent, comment je peux savoir que la form appartient à mon application ?
    Pour ce qui est des envoies de messages, je cherche avant.

    Bon, c'est tout pour le moment (déjà pas mal ).
    Merci d'avance
    Cordialement

    EDIT:


    En ayant le Handle d'un objet, peut on récupérer le Hint de celui-ci ou encore d'autres infos comme sa position etc etc ...

    Je cherche à apprendre un minimum sur les API mais là, j'avoue que c'est pas simple !
    Merci

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    a partir de son handle tu doit etre capable de connaitre toutes les propriete de l'objet
    windows ne gerant ses objet que comme cela

    quand a ta question du nombre c'est normal
    vu que tu n'as pas creer de condition de sorti dans ton appel recurcif

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par anapurna
    quand a ta question du nombre c'est normal
    vu que tu n'as pas creer de condition de sorti dans ton appel recurcif
    Non, je n'est pas de condition de sortie, je veux lister tous les "Handles" que contient un Parent...

    Ainsi, je pensais que lorsque je fais appelle à la récursivité, celle-ci entrait en jeu lorsqu'une nouvelle form était créée à partir du parent ...

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    j'ai pas compris ce que tu vient de dire

    la recurcivite ici lit tout les element fenétré de form "WebRadioPlayer"
    C'est a dire :
    button ,staticlabel et autre element graphique que ton appli contient

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  15. #15
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Je vais essayer d'être plus clair :

    La Form Principale de mon Application se nomme "WebRadioPlayer".
    J'arrive bien à lister les Handles des objets présents sur cette Form.

    Maintenant, dans mon application, je crée de façon dynamique une autre Form qui se nomme ce coup ci "WebRadioPlayer - Ajout Stations".

    Comment puis-je faire pour que lorsque je parcours les Handles de la Form "WebRadioPayer" je récupère le Handle de la Form créée dynamique ainsi que les Handles des objets qu'elle contient.

    Pour la récursivité, je pense que je viens de comprendre... C'est par exemple lorsque l'on a un Panel qui contient un bouton ... non ?

    Ainsi, j'aurai une liste tel qu'elle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Handle du parent (la Form)
      |
      |->Handle du Panel sur la Form
      |        |
      |        |-> Handle du Bouton dans le Panel
      |
      |-> Handle d un groupBox sur la form
    etc etc

    Voilà, sinon, pour avoir plus d'infos à partir d'un Handle, je vais essayer de voir du coté de la MSDN mais si tu as déjà une piste, je suis prenant!

    Merci encore

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Bon, je suis en php, aujourd'hui, je passe en vitesse, un peu de code, cela génère l'arbre de enfant, parent et voisin à partir d'un handle, d'ailleurs, existe-t-il un noeud racine ???

    Voici du code que j'ai ajouté il y a quelques temps à un vieille exemple que mon tuteur de stage avais mis sur Phidels et qui fut corrigé mainte fois par d'autres ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    procedure TFrm_Tueur_de_processus.GenererArbre(HandleArbre: THandle);
     
      function GetClassAndCaption(aHandle: THandle): string;
      var
        lpRes : array[0..256] of Char;
        StrClass: string;
        StrCaption: string;
      begin
          GetClassName(aHandle, lpRes, SizeOf(lpRes));
          StrClass := lpRes;
          GetWindowText(aHandle, lpRes, SizeOf(lpRes));
          StrCaption := lpRes;
          Result := Format('%s : "%s" (%d)', [StrClass, StrCaption, aHandle])
      end;
     
      function GetWindowList(HandleStart: THandle; RelationStart: Cardinal; RelationDirection: Cardinal = GW_HWNDNEXT): TStringList;
      var
        HandleFound: THandle;
      begin
         Result := TStringList.Create();
     
         HandleFound := GetWindow(HandleStart, RelationStart);
         repeat
             if (HandleFound <> 0) and (HandleFound <> HandleStart) then
             begin
                Result.AddObject(GetClassAndCaption(HandleFound), Pointer(HandleFound));
             end;
             HandleFound := GetWindow(HandleFound, RelationDirection);
          until (HandleFound = 0);
      end;
     
      function GetFreres(HandleFrere: THandle): TStringList;
      begin
         Result := GetWindowList(HandleFrere, GW_HWNDFIRST);
      end;
     
      function GetEnfants(HandleParent: THandle): TStringList;
      begin
         Result := GetWindowList(HandleParent, GW_CHILD);
      end;
     
      function GetParents(HandleEnfant: THandle): TStringList;
      begin
         Result := GetWindowList(HandleEnfant, GW_OWNER, GW_OWNER);
      end;
     
      procedure ArbreEnfant(Tree: TTreeNodes; Node: TTreeNode; HandleParent: THandle);
      var
         EnfantsList: TStringList;
         IndexEnfant: Integer;
         NewNode: TTreeNode;
      begin
         EnfantsList := GetEnfants(HandleParent);
         try
            EnfantsList.Sort();
            for IndexEnfant := 0 to EnfantsList.Count-1 do
            begin
               NewNode := Tree.AddChildObject(Node, EnfantsList.Strings[IndexEnfant], EnfantsList.Objects[IndexEnfant]);
               ArbreEnfant(Tree, NewNode, THandle(EnfantsList.Objects[IndexEnfant]));
            end;
         finally
           EnfantsList.Free();
         end;
      end;
     
      function SameParent(ParentHandle, HandleFrere: THandle): Boolean;
      var
         ParentList: TStringList;
      begin
         Result := False;
     
         ParentList := GetParents(HandleFrere);
         try
            if ParentList.Count > 0 then
               Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
         finally
           ParentList.Free();
         end;
     
      end;
     
    var
      ParentList, FreresList: TStringList;
      IndexParent, IndexFrere: Integer;
      ItemSelectNode, ParentNode, FrereNode, VoisinNode, Node: TTreeNode;
      HandleTopParent: THandle;
    begin
      HandleTopParent := 0;
     
      TreeView3.Items.BeginUpdate();
      try
         TreeView3.Items.Clear();
     
         ItemSelectNode := TreeView3.Items.Add(nil, 'Element Sélectionné');
         Node := TreeView3.Items.AddChildObject(ItemSelectNode, GetClassAndCaption(HandleArbre), Pointer(HandleArbre));
         ArbreEnfant(TreeView3.Items, Node, HandleArbre);
     
         ParentNode := TreeView3.Items.Add(ItemSelectNode, 'Parent');
         ParentList := GetParents(HandleArbre);
         Node := ParentNode;
         try
            if ParentList.Count > 0 then
               HandleTopParent := THandle(ParentList.Objects[ParentList.Count-1]);
     
            for IndexParent := ParentList.Count-1 downto 0 do
            begin
                Node := TreeView3.Items.AddChildObject(Node, ParentList.Strings[IndexParent], ParentList.Objects[IndexParent]);
            end;
         finally
           ParentList.Free();
         end;
     
         FrereNode := TreeView3.Items.Add(ItemSelectNode, 'Frères');
         VoisinNode := TreeView3.Items.Add(FrereNode, 'Voisins');
         FreresList := GetFreres(HandleArbre);
         FreresList.Sort();
         try
            for IndexFrere := 0 to FreresList.Count-1 do
            begin
                if SameParent(HandleTopParent, Integer(FreresList.Objects[IndexFrere])) then
                   Node := FrereNode
                else
                   Node := VoisinNode;
     
                Node := TreeView3.Items.AddChildObject(Node, FreresList.Strings[IndexFrere], FreresList.Objects[IndexFrere]);
     
                ArbreEnfant(TreeView3.Items, Node, THandle(FreresList.Objects[IndexFrere]));
            end;
         finally
           FreresList.Free();
         end;
      finally
         TreeView3.Items.EndUpdate();
      end;
     
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  17. #17
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci ShaiLeTroll!

    Je sens que cela va m'être utile. Je regarde ce code en détail et si j'ai des questions, je les posterai sur le forum

    Bonne soirée

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonjour,

    J'ai décortiqué le code de ShaiLeTroll et j'ai juste une question concernant le passage du code ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      function SameParent(ParentHandle, HandleFrere: THandle): Boolean;
      var
         ParentList: TStringList;
      begin
         Result := False;
         ParentList := GetParents(HandleFrere);
         try
            if ParentList.Count > 0 then
               Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
         finally
           ParentList.Free();
         end;
      end;
    Si j'ai bien compris, ce code permet de savoir si un Handle a pour parent celui qu'on a passé en paramètre pour générer l'arbre.
    Mais voilà, je ne sais pas comment interpréter cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ParentList.Count > 0 then
               Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
    Un résult avec 2 égal ...

    Et comment savoir si le HandleB a pour parent le HandleA ...
    Merci

  19. #19
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est l'Affectation de la valeur du test, ces deux codes sont équivalents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if THandle(ParentList.Objects[ParentList.Count-1]) = ParentHandle then
      Result := True
    else
      Result := False;
    Alors GetParents renvoie la liste des Parents de HandleFrere, il remonte tous les parents, donc le dernier parent de la liste est le parent final, qui peut-être un noeud déjà existant ... en fait la fonction aurait du s'appeler SameTopParent, il indique si le dernier parent non nil est le même ... comme pour deux boutons présent dans deux panels différents, le dernier parent non nil est généralement une TForm ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  20. #20
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ah, en effet, je comprends mieux maintenant!

    Je ne savait pas que l'on pouvait faire comme cela... Ca change quelque chose au niveau de l'optimisation du programme peut être ?

    En tout cas, merci pour ce code qui vraiment m'aide bien.

    J'en demande peut être un peu trop, mais bon, qui ne tente rien n'a rien. As-tu déjà essayer d'obtenir plus d'information à partir d'un Handle ? Genre sa position ou encore, le Hint ...

    En faite, je me demande si c'est possible de transtyper un Handle dans sa classe et de faire en sorte que l'on teste ensuite ses propriétés comme lors d'un programme banal.

    Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Désactiver un bouton d'une application extérieure
    Par NABIL74 dans le forum Débuter
    Réponses: 20
    Dernier message: 11/02/2010, 16h31
  2. récupérer la valeur d'un bouton dans une pop up
    Par dragon93 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/07/2009, 17h21
  3. Réponses: 7
    Dernier message: 14/01/2008, 18h48
  4. Récupérer l'appuis d'1 bouton d'une boite de dialogue
    Par electrosat03 dans le forum Access
    Réponses: 7
    Dernier message: 20/02/2007, 21h19
  5. cliquer sur un bouton d'une application extérieure
    Par looc 6699 dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 12/12/2005, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo