Utilisateur anonyme
-
16 juin 2011 à 21:52
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDerniè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!
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 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
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
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
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..
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917 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 !