TRIchEdit et caractères [Résolu]

Signaler
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
Bonjour !

Je voudrais savoir comment récupérer le caractère juste avant le caret et celui juste après d'un TRichEdit !...


J'ai essayé ainsi :


with richedit1 do
begin
sellength:=0;// pour forcer l'apparition du caret
car_vant:=text[selstart-1];
car_apres:=text[selstart+1];
end;


mais ni car_avnt ni car_apres ne sont bons, ils sont même très loin de la


réalité.


Je pense que le problème est dû aux caractères #13#10...


NB : J'ai essayé aussi avec lines.text mais c'est pareil.


Merci de m'aider ! :)

SISI231

4 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
alors ce fut assé chaud de trouver mais voila a peu prés ce que cela peu donner :

function _InRange(V,AMin,AMax : integer) : integer;
begin
if V < AMin then
result := AMin
else
if V > AMax then
result := AMax
else
result := V;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
S : string;
PS,PL : PChar;
SL,X,Y : integer;

PC,CC,NC : string;
CPos : integer;
begin
SL := 0;
{ on compte le nombre total de caracteres visible }
for X := 0 to RichEdit1.Lines.Count-1 do begin
SL := SL + Length(RichEdit1.Lines[X]);
end;

{ on init S a la longeur totale calculée }
SetLength(S,SL);
{ on Pcharize S }
PS := PChar(S);
{ on place tout le texte dans S, attention cela pourrait etre long si beaucoup de texte }
for X := 0 to RichEdit1.Lines.Count-1 do begin
PL := PChar(RichEdit1.Lines[X]);
while PL[0] <> #0 do begin
PS[0] := PL[0];
inc(PS);
inc(PL);
end;
end;
{ on termine S par le 0 ... chaine AZT oblige }
PS[0] := #0;

{ on reinit SL }
SL := 0;
{ on calcul la position par rapport a Y et X }
if RichEdit1.CaretPos.Y > 0 then
for X := 0 to RichEdit1.CaretPos.Y-1 do
SL := SL + Length(RichEdit1.Lines[X]);
CPos := SL + (RichEdit1.CaretPos.X + 1);

{ si on trouve des caracteres, on affiche ces derniers en hexa }
if _InRange(CPos,1,Length(S)) then
CC := format('$%.2x',[ord(S[CPos])])
else
CC := '(aucun)';

if _InRange(CPos-1,1,Length(S)) then
PC := format('$%.2x',[ord(S[CPos-1])])
else
PC := '(aucun)';

if _InRange(CPos+1,1,Length(S)) then
NC := format('$%.2x',[ord(S[CPos+1])])
else
NC := '(aucun)';

{ on reinit S a 0 }

SetLength(S,0);


{ on affiche le resultat dans label1 }
label1.Caption := format('precedent : %s, courrant : %s, suivant : %s',[PC,CC,NC]);
end;

y'a certainement plus simple ...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
pffff plus simple en fait et moins lourd surtout. car au dela de 50Ko de texte ça rame a fond.

procedure TForm1.Timer1Timer(Sender: TObject);
var
CC,PC,NC : string;
PLine: PChar;
CPos,L : integer;
begin
CPos := RichEdit1.CaretPos.X;
L := Length(RichEdit1.Lines[RichEdit1.CaretPos.Y]);
PLine := PChar(RichEdit1.Lines[RichEdit1.CaretPos.Y]);

if InRange(CPos,0,L-1) then
CC := format('$%.2x',[ord(PLine[CPos])])
else
CC := '(aucun)';

if InRange(CPos-1,0,L-1) then
PC := format('$%.2x',[ord(PLine[CPos-1])])
else
PC := '(aucun)';

if InRange(CPos+1,0,L-1) then
NC := format('$%.2x',[ord(PLine[CPos+1])])
else
NC := '(aucun)';

label1.Caption := format('precedent : %s, courrant : %s, suivant : %s',[PC,CC,NC]);
end;

bien entendus ce n'est valide que pour la ligne en cours ...
il ne prend pas la ligne precedente ni suivante en cours ... mais tu pourras facilement l'adapter pour qu'il le prenne en compte.
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
Je sais pas où vous allez trouvertout cela les gars !

SISI231
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
Excusez-moi, finalement il y a encore plus simple, à savoir :

with richedit1 do
begin
sellength:=0;
car_avant:=text[selstart];
car_apres:=text[selstart+1];
end;

J'avais mal testé... Désolé, mais bon ça vous aura fait un petit exercice cérébral pas méchant ...
SISI231