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

Langage Delphi Discussion :

Problème avec TMenuItem.Hint


Sujet :

Langage Delphi

  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut Problème avec TMenuItem.Hint
    Bonjour,

    Conformément à l'aide en ligne je déclare d'entrée de jeu les ShowHint:=True comme suit dans ma Form principale :

    procedure TfrmGen.FormCreate(Sender: TObject);
    begin ...
    ...
    Application.ShowHint:=true;
    ShowHint:=true;
    ...
    end;
    ... mais les Hint déclarés dans les MenuItem's n'apparaissent jamais au survol de la souris!!!??? (Par contre ceux des boutons par exemple apparaissent).

    Comment, S.V.P, faire afin qu'ils apparaissent dans les MenuItem's ??? (Delphi 5).

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 529
    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 529
    Points : 25 062
    Points
    25 062
    Par défaut
    J'ai dans un programme de test en D6, je laisse la valeur par défaut de ShowHint d'application (cela devrait déjà être à true), mais j'utilise OnHint pour afficher le conseil dans une StatusBar

    J'avais bidouillé mon propre système de Hint en HTML fonctionnait même sur Menu ou Bouton disabled.
    En fait, il me semble, que je n'ai jamais réussi à avoir mes Hint de Menu autrement que via OnHint\StatusBar malgré le ShowHint à true

    Sur une appli en C++2007, j'ignore si cela te rassure, mais ShowHint de la Form, ShowHint de Application, et Hint des mes Actions de mes Menus !
    Rien ! Pas de Hint !
    J'ai testé pour des TMenuItem dans TMainMenu et TPopupMenu
    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

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    ShaiLeTroll En fait, il me semble, que je n'ai jamais réussi à avoir mes Hint de Menu autrement que via OnHint\StatusBar malgré le ShowHint à true ... j'ignore si cela te rassure, mais ShowHint de la Form, ShowHint de Application, et Hint des mes Actions de mes Menus !
    Rien ! Pas de Hint !
    ... Merci beaucoup pour cette réponse.
    ... En fait cela me rassure quand-même un peu vu que je pensais que cela n'arrivait qu'à cause d'une erreur faite par moi-même.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    [...]mais j'utilise OnHint pour afficher le conseil dans une StatusBar [...]
    Pour cela il suffit d'activer la propriété AutoHint des TStatusBar.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 529
    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 529
    Points : 25 062
    Points
    25 062
    Par défaut

    AutoHint, c'est vrai que c'est le standard Windows, suffit de regarder l'Explorateur, c'est ce qu'il fait !
    J'ai toujours pensé qu'il manquait AutoHintPanelIndex et AutoHintType quand l'on veut l'avoir dans le second Panel et non dans le Premier, ainsi que choisir hint court ou long !

    Va savoir pourquoi mas je n'utilise jamais de StatusBar ailleurs que dans mes appli d'expérimentation et de debug, et en général, le 1er panel est déjà utilisé pour autre chose que les Hint !

    Par curiosité, je vais de regarder dans l'application dont je m'occupe depuis quelques mois, le Panels[0] contient le login de l'utilisateur en cours et des icones d'actions utilisateurs
    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

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Zatoobux : ... Pour cela il suffit d'activer la propriété AutoHint des TStatusBar.
    ... merci beaucoup : j'aime les choses simples.
    ... mais je vais attendre un peu avant de mettre le tag "Résolu" pour le cas où quelqu'un saurait faire apparaître les Hint à proximité des MenuItem's correspondants.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 529
    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 529
    Points : 25 062
    Points
    25 062
    Par défaut
    Je me demande si c'est possible !
    Sinon pourquoi l'explorateur lui même utilise le StatusBar ?

    Tu as déjà vu cela ailleurs ?
    Perso, je l'ai bidouillé dans une appli (un effet de bord en réalité)
    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

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Points : 291
    Points
    291
    Par défaut
    oui on trouve des solutions sur le web,
    Par exemple : http://embarcadero.newsgroups.archiv...911053391.html

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Pour l'instant le plus simple que j'ai trouvé c'est ce qui suit car j'ai des Hint étalés sur deux lignes (séparées par un #13#10) et même en doublant la hauteur de la StatusBar il m'aligne le texte sur une seule ligne alors qu'avec le label1 le texte est correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmGen.AfficherMsgAide(Sender: TObject);
    begin     If Application.ShowHint then label1.caption:=Application.hint;
    end;
     
    procedure TfrmGen.FormCreate(Sender: TObject);
    begin     ...
              ...
              Application.onHint:=AfficherMsgAide;
              Application.ShowHint:=true;
              ...
    end;
    ... le seul inconvénient est que le Sender de AfficherMsgAide est l'Application et non le MenuItem à côté duquel je souhaite placer mon Label1.

    Et manque de chance je n'arrive pas à capter les coordonnées du AREct d'un MenuItem avec ceci :

    procedure TfrmGen.Item1DrawItem(Sender: TObject; ACanvas: TCanvas;
    ARect: TRect; Selected: Boolean);
    begin Showmessage('Item1DrawItem');

    end;
    ... car le ShowMessage n'est pas activé ... et c'est la même chose avec les autres événements associés aux MenuItem's (excepté le onClick) comme si ces événements étaient neutralisés.

    Zatoobux : oui on trouve des solutions sur le web
    Par exemple ...
    .
    ... vu, sauf que ce lien ne donne pas le code car d'une part je n'ai jamais créé de gestionnaire d'événement et d'autre part faudrait que je sache comment placer mon Label1 évoqué ci-dessus à côté du MenuItem qui déclenche le onHint ???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Points : 291
    Points
    291
    Par défaut
    Je ne sais pas pourquoi tu veux utiliser l'evenement onDrawItem, mais ce que je sais c'est que l'application ne passe dedans que si TMainMenu.OwnerDraw = true.
    Et dans ce cas tu devras dessiner tout les éléments de menu toi même.


    Par ailleurs, tu as déjà créé un gestionnaire d’événement, dans ton exemple Item1DrawItem est un gestionnaire d’événement.

    Par ailleur II : un hint ne se place pas au niveau du bouton, menu ... autre mais au niveau de la Souris. Donc il suffit de récupérer les coordonnées de la souris : via l'objet global mouse: Tmouse de l'unité controls.

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Zatoobux :Je ne sais pas pourquoi tu veux utiliser l'evenement onDrawItem, mais ce que je sais c'est que l'application ne passe dedans que si TMainMenu.OwnerDraw = true.
    Et dans ce cas tu devras dessiner tout les éléments de menu toi même.
    ... ok, je ne voulais l'utiliser que pour récupérer les coordonnées du MenuItem.

    Par ailleurs II : un hint ne se place pas au niveau du bouton, menu ... autre mais au niveau de la Souris. Donc il suffit de récupérer les coordonnées de la souris : via l'objet global mouse ...
    ... bingo : merci : j'avais complètement oublié la souris.
    ... pourtant j'avais un instant pensé à la souris en me disant que la StatusBar c'est vraiment pas ergonomique du tout puisque on a l'oeil rivé sur le curseur de la souris alors que la StatusBar est située ailleurs, mais avec les coordonnées de la souris on est sauvé : je peux faire valser le Label au bon endroit.

    Par ailleurs, tu as déjà créé un gestionnaire d’événement, dans ton exemple Item1DrawItem est un gestionnaire d’événement.
    ... merci pour l'info : j'ai trouvé cet exemple dans un vieux bouquin de Dick Lantim sur Delphi 3.

    En tous cas merci beaucoup.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Avec Mouse.CursorPos ça marche sauf que dans le cas de menus comportant des sous-menus le panneau d'un sous-menu vient parfois se placer par-dessus le label d'affichage du Hint.
    Je vais donc placer le label en position fixe à la place de la StatusBar : dommage pour la mauvaise ergonomie.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Points : 291
    Points
    291
    Par défaut
    plutot qu'un label, utilise les THintWindow pour afficher un vrai hint. Je n'ai jamais manipulé ça... je te laisse chercher.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 529
    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 529
    Points : 25 062
    Points
    25 062
    Par défaut
    Je t'ai résumé dans un OnHint d'un TApplicationEvents, une méthode pour afficher un Hint d'un Menu !
    Tu peux utiliser Application.OnHint directement aussi !

    Mon code original est dans un thread et affiche du HMTL, je te l'aurais bien passé mais il est trop complexe (et en plus j'ai plusieurs versions, et je ne sais bien laquelle est la plus stable )

    Code c++ : 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
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::ApplicationEventsHint(TObject *Sender)
    {
      StatusBarVCLManip->Panels->Items[0]->Text = Application->Hint; // ApplicationEvents OnHint annule ce comportement par défaut
     
      for (int i = this->ComponentCount - 1; i >= 0; i--)
      {
        if (this->Components[i]->InheritsFrom(__classid(THintWindow)))
        {
          ((THintWindow*)this->Components[i])->ReleaseHandle();
          delete this->Components[i];
        }
      }
     
      if ( ! Application->Hint.IsEmpty())
      {
        TPoint PM;
        if (GetCursorPos(&PM))
        {
          HWND HandleControl = WindowFromPoint(PM);
          if (HandleControl)
          {
            char lpRes[255];
            if (GetClassName(HandleControl, lpRes, sizeof(lpRes)))
            {
              if (SameText(StrPas(lpRes), "#32768"))
              {
                TRect MenuRect;
                if (GetWindowRect(HandleControl, &MenuRect))
                {
                  MenuRect.Left = MenuRect.Left + MenuRect.Width();
     
                  THintWindow * HintForm = new THintWindow(this); // ne pas oublier de faire un ReleaseHandle et Free dans un Timer par exemple
                  HintForm->Color = clInfoBk;
     
                  TRect HintRect = HintForm->CalcHintRect(Screen->WorkAreaWidth / 2, Application->Hint, NULL);
                  HintForm->ActivateHint(Rect(MenuRect.Left + 4, PM.y, MenuRect.Left + 4 + HintRect.Width(), PM.y + HintRect.Height()), Application->Hint);
                }
              }
            }
          }
        }
      }
    }

    J'ai tenté de jouer avec WindowFromPoint pour utiliser GetMenuItemRect, mais le Handle que WindowFromPoint renvoie n'est pas un Menu car IsMenu(HWND) renvoie false, ce handle change à chaque apparition du Menu donc mais pas possible de faire une recherche sur le Handle, item la méthode Find(Caption) n'est pas applicable car il n'a pas de texte !
    Pour info, le handle a comme classe (via GetClassName) le nom obscure "#32768", sachant que "#32770" c'est pour les MessageBox

    En fait WindowFromPoint renvoie TOUT le Menu comme un seul ensemble (en fait les MenuItem sont affichés au sein d'une fenêtre créée à la volée par windows) mais cela suffit pour déterminer la bonne position du Hint !

    le THintWindow est une classe peu intrusive au contraire d'un menu et donc apparait 99% sous le Menu, mais je pense que mon petit calcul est pas mal, faudrait l'adapter si trop près de la bordure de l'écran !

    Dans mon code réel, j'utilisais une vrai TForm (contenant HTML + BitBtn) et je jouais avec GetForegroundWindow, SetForegroundWindow, ActiveForm et fsStayOnTop pour afficher ma Form par dessus tout mais sans garder le Focus, mais avec un TMenuItem cela ne fonctionne pas et dans ce cas retour à THintWindow

    Essaye de voir si tu peux utiliser un TBallonHint (ou les API windows directement), peut-être lui s'affiche par dessus les Menu sans les fermer !
    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

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    ShaiLeTroll : Je t'ai résumé dans un OnHint ...
    ... merci beaucoup, mais c'est codé en C et pour traduire en Delphi je bute sur presque chaque ligne.

    Zatoobux : plutot qu'un label, utilise les THintWindow pour afficher un vrai hint. Je n'ai jamais manipulé ça... je te laisse chercher.
    ... ok je verrai demain ce que peux faire avec un THintWindow que je vais découvrir.

    Si je n'y arrive pas je me contenterai de mon Label placé en position fixe.

    En tous cas merci à tous les deux pour vos apports à mon problème.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 529
    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 529
    Points : 25 062
    Points
    25 062
    Par défaut
    Je ne teste pas, je traduis sauvagement, cela reste du C++Builder, juste -> {} qui passe en . begin end, plus quelques petits trucs implicites en Delphi

    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
    //---------------------------------------------------------------------------
    procedure TVCLManipForm.ApplicationEventsHint(Sender: TObject)
    var
      i: Integer;
      PM: TPoint;
      HandleControl: HWND;
      lpRes: array[0..255] of Char;
      MenuRect: TRect;
      HintForm: THintWindow;
      HintRect: TRect;
    begin
      StatusBarVCLManip.Panels.Items[0].Text := Application.Hint; // ApplicationEvents OnHint annule ce comportement par défaut
     
      for i := ComponentCount - 1 downto 0 do
      begin
        if Components[i] is THintWindow then
        begin
          THintWindow(Components[i]).ReleaseHandle();
          Components[i].Free();
        end;
      end;
     
      if Application.Hint <> "" then
      begin
     
        if GetCursorPos(PM) then
        begin
          HandleControl := WindowFromPoint(PM);
          if HandleControl > 0 then
          begin
     
            if GetClassName(HandleControl, lpRes, SizeOf(lpRes))  then
            begin
              if SameText(StrPas(lpRes), '#32768') then
              begin
                if GetWindowRect(HandleControl, MenuRect) then
                begin
                  MenuRect.Left := MenuRect.Rigth;
     
                  HintForm := THintWindow.Create(Self); // ne pas oublier de faire un ReleaseHandle et Free dans un Timer par exemple
                  HintForm.Color := clInfoBk;
     
                  HintRect := HintForm.CalcHintRect(Screen.WorkAreaWidth div 2, Application.Hint, nil);
                  HintForm.ActivateHint(Rect(MenuRect.Left + 4, PM.y, MenuRect.Left + 4 + HintRect.Rigth - HintRect.Left, PM.y + HintRect.Bottom - HintRect.Top), Application.Hint);
                end;
              end;
            end;
          end;
        end;
      end;
    end;
    le code fonctionne en C++, voir image (toutes mes expérimentations en quelques mois de C++), une erreur de positionnement serait lié à la traduction en Delphi,
    Images attachées Images attachées  
    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
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    ShaiLeTroll : Je ne teste pas, je traduis sauvagement,...
    ... super! et mille fois merci pour la traduction je vais tester pour voir si ça marche sous Delphi 5.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  18. #18
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    J'ai testé la procédure ApplicationEventsHint() mais elle ne marche pas sous Delphi 5.

    J'ai pu rectifier quelques erreur mineures de traduction ou de frappe :
    - ligne 32 if GetClassName(HandleControl, lpRes, SizeOf(lpRes)) then : Sous Delphi GetClassName renvoie un nombre et pas un boolean donc j'ai essayé avec =0 puis avec <>0 mais cela n'a rien changé.
    - lignes 38 et 44 : rectifié une inversion de frappe : remplacé Rigth par Right
    - ligne 43 : j'ai remplacé Screen.WorkAreaWidth par Screen.Width.

    Je me demande si le non fonctionnement ne provient pas de la ligne if SameText(StrPas(lpRes), '#32768') then : sous Delphi le paramètre '#32768' a peut-être une valeur différente ???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Entre-temps j'ai trouvé ce code qui fonctionne bien sous Delphi 5 :
    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
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, Menus,
      AppEvnts, StdCtrls, ExtCtrls, ComCtrls;
     
    type
       TMenuItemHint = class(THintWindow)
       private
         activeMenuItem : TMenuItem;
         showTimer : TTimer;
         hideTimer : TTimer;
         procedure HideTime(Sender : TObject) ;
         procedure ShowTime(Sender : TObject) ;
       public
         constructor Create(AOwner : TComponent) ; override;
         procedure DoActivateHint(menuItem : TMenuItem) ;
         destructor Destroy; override;
       end;
     
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        StatusBar1: TStatusBar;
        MainMenu1: TMainMenu;
        Fichier1: TMenuItem;
        Ouvrir1: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure ApplicationEvents1Hint(Sender: TObject) ;
      private
        { Déclarations privées }
        miHint : TMenuItemHint;
        procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message WM_MENUSELECT;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin     miHint := TMenuItemHint.Create(self);
    end;
     
    procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
    begin     //StatusBar1.SimpleText := 'App.OnHint : ' + Application.Hint;
              // Remarque : le code fonctionne aussi en neutralisant la StatusBar comme ci-dessus
              // et même en conservant cette StatusBar avec AutoHint=True celle-ci n'affiche pas un duplicata du Hint
              // qui apparaît à côté du menuItem
    end;
     
    procedure TForm1.WMMenuSelect(var Msg: TWMMenuSelect);
    var       menuItem : TMenuItem;
              hSubMenu : HMENU;
    begin
              inherited; // from TCustomForm (ensures that Application.Hint is assigned)
     
              menuItem := nil;
              if (Msg.MenuFlag <> $FFFF) or (Msg.IDItem <> 0) then begin
                 if Msg.MenuFlag and MF_POPUP = MF_POPUP then begin
                   hSubMenu := GetSubMenu(Msg.Menu, Msg.IDItem) ;
                   menuItem := Self.Menu.FindItem(hSubMenu, fkHandle) ;
                 end else begin
                     menuItem := Self.Menu.FindItem(Msg.IDItem, fkCommand) ;
                 end;
              end;
     
               miHint.DoActivateHint(menuItem) ;
    end; //WMMenuSelect
     
    // TMenuItemHint ---------------------------------------------------------------
    constructor TMenuItemHint.Create(AOwner: TComponent) ;
    begin       inherited;
                showTimer := TTimer.Create(self) ;
                showTimer.Interval := Application.HintPause;
     
                hideTimer := TTimer.Create(self) ;
                hideTimer.Interval := Application.HintHidePause;
    end; //Create
     
    destructor TMenuItemHint.Destroy;
    begin      hideTimer.OnTimer := nil;
               showTimer.OnTimer := nil;
               self.ReleaseHandle;
               inherited;
    end; //Destroy
     
    procedure TMenuItemHint.DoActivateHint(menuItem: TMenuItem) ;
    begin     //force remove of the "old" hint window
              hideTime(self) ;
              if (menuItem = nil) or (menuItem.Hint = '') then begin
                 activeMenuItem := nil;
                 Exit;
              end;
              activeMenuItem := menuItem;
              showTimer.OnTimer := ShowTime;
              hideTimer.OnTimer := HideTime;
    end; //DoActivateHint
     
    procedure TMenuItemHint.ShowTime(Sender: TObject) ;
    var       r : TRect;
              wdth : integer;
              hght : integer;
    begin     if activeMenuItem <> nil then begin
                 //position and resize
                 wdth := Canvas.TextWidth(activeMenuItem.Hint) ;
                 hght := Canvas.TextHeight(activeMenuItem.Hint) ;
     
                 r.Left := Mouse.CursorPos.X + 16;
                 r.Top := Mouse.CursorPos.Y + 16;
                 r.Right := r.Left + wdth + 6;
                 r.Bottom := r.Top + hght + 4;
     
                 ActivateHint(r,activeMenuItem.Hint) ;
               end;
     
               showTimer.OnTimer := nil;
    end; //ShowTime
     
    procedure TMenuItemHint.HideTime(Sender: TObject) ;
    begin     //hide (destroy) hint window
              self.ReleaseHandle;
              hideTimer.OnTimer := nil;
    end; // HideTime
     
    END.
    ... ça peu dépanner.
    ... mais j'aurais bien préféré réussir à faire fonctionner le code de ShaiLeTroll car il est nettement plus concis et plus simple.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  20. #20
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    A ShaiLeTroll : Je me demande si ta procédure TVCLManipForm.ApplicationEventsHint(Sender: TObject) est auto-suffisante par elle-même ?
    Pour la faire fonctionner n'y aurait-il pas un truc à initialiser par exemple lors du FormCreate ???


    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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