2010-08-23 9 views
1

D6 ProfDelphi: Comment faire ma propre fenêtre Hint?

Nous avons une application spéciale avec une grille spéciale. Il a un HintWindow ce qui peut montrer d'autres informations qui ne peuvent pas placer dans les cellules. Par exemple de longs mémos. Lorsque vous déplacez la souris sur une cellule, elle attend 2 secondes et affiche les informations.

Le problème de ce thème que HintWindow ne fonctionne pas correctement, ou de la même manière que les "astuces" normales.

notes normales apparaissent, et ils sont en train de disparaître dans ces cas: - l'indice montrant le temps ellapsed - la forme active est désactivée - une nouvelle forme montrée - l'application remplacée par une autre tâche (ALT + TAB)

Mais notre HintWindow est ne peut pas détecter ce nouveau formulaire, ou l'application a changé - il reste en haut, jusqu'à ce que disparaisse. temps ... :-(

Un autre problème que nous avons utilisé « MouseMove » pour détecter le changement de la souris -.. pour démarrer le Conseil

Cet événement est produit également si la disparition HintWindow Je dois protéger contre show cyclique avec ce code:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    Caption := INtTOStr(X) + ' ' + IntToStr(Y) + ' ' + IntToStr(GetTickCount); 
    // If same coordinate I don't show it again 
    if (LX <> X) or (LY <> Y) then begin 
     miHint.DoActivateHint(Self, 'Anytext', 2000, 2000); 
     LX := X; LY := Y; 
    end; 
end; 

Sans cette LX, LY le HintWindow apparaît de manière cyclique et dissappears

donc:. nous devons savoir comment nous faisons une HintWindow qui travaille dans la même méthode comme l'application « Hint ", mais limité dans cette grille.Il doit fermer sur "changement de tâche", "changement de forme". Comment faire?

Merci pour votre aide: dd

Répondre

2

Vous feriez mieux d'utiliser le mécanisme prévu qui montrent des notes tout au long de l'application, en remplaçant le HintWindowClass du paramètre HintInfo passé à l'événement OnShowHint de l'application chaque fois que vous devez montrer un conseil personnalisé. Peut-être que vous pourriez trouver quelques détails utiles de mise en œuvre ci-dessous.

Old Réponse:
Dans une application plus j'avais une autre classe d'indices pour les boîtes de liste et des grilles. Le comportement est un peu dispersé mais fondamentalement il se résume à;

Tous les DBGrids de l'Application reçoivent un indice d'identification, comme: 'MyDBGridHint'. Les tests d'événements OnShowHint de l'application sont acceptés si 'HintControl' de HintInfo est un 'TCustomDBGrid', et si c'est le cas, appelle une procédure qui transmet le 'HintInfo'.

Cette procédure trouve la cellule sur laquelle l'indicateur doit être allumé en utilisant la méthode MouseCoord de Grid avec HintInfo.CursorPos, obtient le texte d'affichage de la cellule en changeant temporairement DataLink de Grid. La procédure crée ensuite un TCanvas et assigne à son Handle un DC récupéré pour la Grid, assigne la police de la grille au Canvas et teste si la limite de la cellule de la grille est suffisante pour afficher le texte. S'il décide que l'indice sera affiché, assigne le texte de la cellule à HintInfo.HintStr et une classe de fenêtre de conseil dérivé à HintInfo.HintWindowClass, calcule la position, limite, définit la police etc. et renvoie.

Puis OnShowHint tests d'événement pour voir si HintStr est toujours l'identificateur d'indication de grille (j'ai un commentaire dans le code avec "Contrôles possédés par les grilles produire ceci."), Et si oui, annule l'indice.

Je ne suis pas sûr d'essayer de le décrire comme cela peut être d'une aide quelconque, mais ici tente ...

+0

Ahhh ... J'oublie de dire que ce contrôle est une grille virtuelle, et non sur la base sur la grille VCL - il est basé sur customcontrol. Donc des indices viennent de cette classe. Mais : Je veux pas utiliser un indice « normal » que visible lorsque vous allez à tout contrôle. Je veux que cela donne des informations à partir des cellules. J'ai donc besoin d'attraper le curseur en mouvement. – durumdara

+0

@durumdara -> « besoin d'attraper le curseur en mouvement » - Le 'HintInfo' est passé à l'événement « OnShowHint » a déjà la position du curseur, la mise en oeuvre je l'ai décrit les utilise pour trouver quelle cellule le « soupçon » serait sur. J'ai également fourni quelques liens vers la documentation maintenant. Lisez-les un peu ... –

Questions connexes