String a gauche ou a droite de la souris.. [Résolu]

Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
- - Dernière réponse : korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
- 22 juin 2011 à 21:28
salut a tous!
bon je cherche et je patauge..alors je demande conseil..
j'ai un memo, et je voudrais qu' au passage de la souris apparaisse dans l'infobulle ce qui est a droite du pointeur..
ex:
string = 'maman mange des frittes'
si je met la souris juste apres le mot:'mange'
l'infobulle me marque: 'des frittes'...

bon j'vais p'têt passer pour un debile mais c'est pas grave!

merci a tous pour vos contributions..


AlcAt
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34
3
Merci
ça y est, j'ai compris où se situe le problème:

il fallait avoir la propriété ScrollBars du Memo à ssBoth pour que ça fonctionne avec la première version.

Mais voici une correction qui fonctionne dans tous les cas (avec ou sans ScrollBars).
{ Affiche le texte à droite du curseur de la souri dans un Memo}

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var SCROLLINFO : TSCROLLINFO;
    nPos: Integer;
[b]begin
  /b// initialisation du Record
  ScrollInfo.cbSize :=  SizeOf(TScrollInfo);
  ScrollInfo.fMask := SIF_POS;
   // Calcule la position du curseur dans le texte
    // récupère les informations de position (nombres de caractères déjà scrollées)
   if  GETSCROLLINFO(Memo1.Handle, SB_HORZ, SCROLLINFO)  [b]then
    /bnPos : = SCROLLINFO.nPos
  [b]else
    /bnPos :=  0;
     // X = la colone
  X : = (X + nPos)  div  TxtSize.Right + 1;
  // récupère les informations de position (nombres de lignes déjà scrollées)
  if GETSCROLLINFO(Memo1.Handle, SB_VERT, SCROLLINFO) [b]then
    /b// Y  =  la ligne
    nPos :=  SCROLLINFO.nPos
  [b]else
    /bnPos := 0;
  Y := Y  div  TxtSize.Bottom + nPos;
   // Affichage du résultat dans un Label
  Label1.Caption : = Copy(Memo1.Lines[Y], X, High(Integer));
end;
[hr]

[quote=alcat2002]excuse moi encore mais... as tu essayé de le compiller chez toi? /quote
pour information je ne poste que des bouts de codes que j'ai testés ... sinon je le précise dans le message

[hr]@+Cirec
[hr]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
0
Merci
Salut
Dans un mémo, à part cliquer pour obtenir la position du curseur, je ne sais pas si c'est possible juste en passant dessus, ça m'étonnerais !
à approfondir
cordialement
Dubois77
Commenter la réponse de dubois77
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34
0
Merci
Salut,

à afficher dans un label c'est assez facile.

sur une fiche tu déposes
- 1 TMemo
- 1 TLabel
et tu implémentes le OnCreate de la fiche et le OnMouseMove du TMemo comme suit:
[b]var

  /bTxtSize: TRect;

procedure GetTextSize(aFont : TFont; Text : string; var aRect : TRect);
var Canv : TCanvas;
    Dc : HDC;
[b]begin
  /bCanv :=  TCanvas.Create;
  Dc := CreateCompatibleDc(0);
  Canv.Handle := Dc;
  [b]try
    /bCanv.Font := aFont;
    DrawText(Canv.Handle, PChar(Text), Length(Text), aRect, DT_CALCRECT);
  [b]finally
    /bCanv.Free;
    DeleteDc(Dc);
   end ;
end;

procedure TForm1.FormCreate(Sender: TObject);
[b]begin
  /b // la fonte doit être à pas fixe  comme 'Fixedsys'ou 'Courier''Courier new'
  // 'Lucida Sans Typewriter''Lucida consol''Consolas''MS Mincho''Terminal'
  // sinon ça ne fonctionne pas
  Memo1.Font.Name : = 'Courier new';
  // Charge un fichier
  Memo1.Lines.LoadFromFile('MonFichier.txt');
  // Récupère la taille, en pixel, d'un caractère
  GetTextSize(Memo1.Font, 'i', TxtSize);
end;

{ Affiche le texte à droite du curseur de la souri dans un Memo}
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var SCROLLINFO : TSCROLLINFO;
[b]begin
  /b  // initialisation du Record
  ScrollInfo.cbSize :=  SizeOf(TScrollInfo);
  ScrollInfo.fMask := SIF_POS;
   // Calcule la position du curseur dans le texte
    // récupère les informations de position (nombres de caractères déjà scrollées)
  GETSCROLLINFO(Memo1.Handle, SB_HORZ, SCROLLINFO);
    // X  = la colone
  X :=  (X + SCROLLINFO.nPos)  div  TxtSize.Right + 1;
   // récupère les informations de position (nombres de lignes déjà scrollées)
  GETSCROLLINFO(Memo1.Handle, SB_VERT, SCROLLINFO);
    // Y  = la ligne
  Y :=  Y  div  TxtSize.Bottom + SCROLLINFO.nPos;
   // Affichage du résultat dans un Label
  Label1.Caption : = Copy(Memo1.Lines[Y], X, High(Integer));
end;[hr]

pour l'infobulle c'est certainement possible mais ça demande un peu plus de travail et j'ai pas le temps en ce moment.

Mais le gros du travail est fait
à toi de faire le reste



[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
0
Merci
Super CIREC !
respect
Dubois77
Commenter la réponse de dubois77
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34
0
Merci
[quote=Dubois77]Super CIREC !
respect /quote

Merci,
je suis content que ça plaise mais j'ai pas grand mérite, j'ai juste la chance de connaitre la procédure: "GETSCROLLINFO"
le reste du code est assez simple et coule de source


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
0
Merci
avant toute chose, un grand merci pour votre aide!
j'ai teste le code, et malheureusement ici ca ne marche pas, au passage de la souris, le label disparait..

j'ai fouiné mais pas trouvé..

AlcAt
Commenter la réponse de alcat2002
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
0
Merci
j'ai changer la police, mis le caractere 'i' dans mon texte.. et ca marche po!


AlcAt
Commenter la réponse de alcat2002
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34
0
Merci
si ça ne fonctionne pas chez toi c'est que t'as fait quelque chose de travers.

la seule et unique chose à changer dans le code c'est le nom du fichier texte à charger dans le mémo:
Memo1.Lines.LoadFromFile('MonFichier.txt');

tu remplaces MonFichier.txt par le fichier de ton choix.

et bien sur quand je dis implémenter le OnCreate et le OnMouseMove ça veut dire ... passer par l'inspecteur d'objets onglet évènements et double click à droite de l'évènement OnCreate de Form1 et OnMouseMove de Memo1 ce qui a pour effet de créer le squelette de la procédure et de la lier à l'objet approprié.

ce qui te donne ceci:
procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin

end;


une fois ceci fait tu peux copier coller le code que je donne plus haut soit directement par dessus ou completer tout simplement


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
0
Merci
re..
ben oui c'este xactement ce que je fais...
...Bizarre..le label disparait!
si ca marche chez toi, c'est que j'ai du zapper quelquechose..
AlcAt
Commenter la réponse de alcat2002
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
0
Merci
excuse moi encore mais... as tu essayé de le compiller chez toi?

AlcAt
Commenter la réponse de alcat2002
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
0
Merci
superbe!
un grand grand MERCI!


AlcAt
Commenter la réponse de alcat2002
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
0
Merci
Pour que ça fonctionne, il faut qu'une valeur autre que ssNone soit attribuée à la propriété ScrollBars du Memo.
Là, ça marche nickel...
Bien joué, Cirec !
Commenter la réponse de korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
0
Merci
Oups, j'avais lu que la première page...
Désolé pour le décalage
Commenter la réponse de korgis