String a gauche ou a droite de la souris..

Résolu
Utilisateur anonyme - 16 juin 2011 à 21:52
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

13 réponses

Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
18 juin 2011 à 17:14
ç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]
3
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
14
17 juin 2011 à 06:28
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
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
17 juin 2011 à 14:19
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]
0
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
14
17 juin 2011 à 14:49
Super CIREC !
respect
Dubois77
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
17 juin 2011 à 15:11
[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]
0
Utilisateur anonyme
17 juin 2011 à 15:17
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
0
Utilisateur anonyme
17 juin 2011 à 15:32
j'ai changer la police, mis le caractere 'i' dans mon texte.. et ca marche po!


AlcAt
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
18 juin 2011 à 11:29
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]
0
Utilisateur anonyme
18 juin 2011 à 13:50
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
0
Utilisateur anonyme
18 juin 2011 à 14:34
excuse moi encore mais... as tu essayé de le compiller chez toi?

AlcAt
0
Utilisateur anonyme
18 juin 2011 à 23:57
superbe!
un grand grand MERCI!


AlcAt
0
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
22 juin 2011 à 21:26
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 !
0
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
22 juin 2011 à 21:28
Oups, j'avais lu que la première page...
Désolé pour le décalage
0