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

Signaler
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014
-
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
-
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

13 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
ç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]
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
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
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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]
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
Super CIREC !
respect
Dubois77
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
[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]
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014

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
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014

j'ai changer la police, mis le caractere 'i' dans mon texte.. et ca marche po!


AlcAt
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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]
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014

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
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014

excuse moi encore mais... as tu essayé de le compiller chez toi?

AlcAt
Messages postés
41
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
18 janvier 2014

superbe!
un grand grand MERCI!


AlcAt
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
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 !
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Oups, j'avais lu que la première page...
Désolé pour le décalage