Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

RichEdit и позиционирование курсора   Найти похожие ветки 

 
тихий вовочка   (2004-02-10 23:14) [0]

У меня задача найти все теги, перед которыми нет пробелов и добавить пробелы. Находить - нахожу, добавляю тоже замечательно, но не омгу пользователю показать где меняю - не работает выделение нужного куска. Где я ошибся?
procedure TForm1.FormDblClick(Sender: TObject);
var
i,pos:integer;
Sum : integer;
S : string;
begin
Sum:=0;
with Form1.RxRichEdit1 do
begin
SetFocus;
HideSelection:=false;

for i:=0 to Lines.Count-1 do
begin
s:=Lines[i];
pos:=AnsiPos("<",s);
if(pos>1)then
begin
if((s[pos-1]<>" ")and(s[pos+1]<>"/")) then
begin
SelStart:=Sum;
SelLength:=Length(s)-1;
Insert(" ",s,pos);
ListBox1.Items.Add(s);
end;
end;

Sum:=Sum+Length(s)+1;
end;
end;

end;


 
Maxud ©   (2004-02-10 23:39) [1]

После этого:

> SelStart:=Sum;
> SelLength:=Length(s)-1

Добавь:
SelAttributes.Style := [fsBold];


 
тихий вовочка   (2004-02-11 06:58) [2]

И как это повлияет на выделение? У меня проблема в том, что SelStart оказывается вовсе не там, где надо, то есть выделяется вовсе не та строка, в которой найден "<". Где-то при подсчете общего кол-ва символов я вру. Попробовал еще такой кусок
RxRichEdit1.SetFocus;
rxrichedit1.HideSelection:=false;
for i:=1 to Length(RxRichEdit1.Text)
do
begin
if(RxRichEdit1.Text[i]="<") then
begin
RxRichEdit1.SelStart:=i-1;
RxRichEdit1.SelLength:=1;
ShowMessage("test");
end;
end;
Тоже выделяет все, что угодно, но только не текст с тегом


 
TUser ©   (2004-02-11 08:04) [3]

Вместо
Sum:=Sum+Length(s)+1;
надо
Sum:=Sum+Length(s)+3;

Кроме того, перед этой строчкой надо снова получить s:=Lines[i], т.к. длина этой строки могла поменяться.


 
Defunct   (2004-02-11 21:27) [4]

Вот функция позиционирования на нужный символ:


// На входе ACol, ARow - координаты X,Y символа в RichEdit
// возвращает позицию для SelStart
Function TForm1.LocateCharPos(ACol,ARow:Integer):Cardinal;;
Var I:Integer;
Begin
If (ARow<=RichEdit.Lines.Count) Then
If (ACol<Length(RichEdit.Lines.Strings[ ARow ])) Then
Begin
CharPos := ACol;
For I:=0 To ARow-1 Do
Begin
CharPos := CharPos + Length(RichEdit.Lines.Strings[i])+2
End;
Located := True;
End Else
Begin
CharPos := 0;
Located := False;
End;
Result := CharPos;
End;


Переменные CharPos и Located объвлены в TForm1 как

CharPos : Cardinal; // Позиция для SelStart в RichEdit
Located : Boolean; // Указывает на то, что символ в этих
координатах есть


А вот процедура выделения требуемого места в RichEdit

Procedure TForm1.SetSel(SelStart, SelEnd:Integer);
Var CharRange: TCharRange;
Begin
CharRange.cpMin := SelStart;
CharRange.cpMax := SelEnd;
SendMessage(RichEdit.Handle, EM_EXSETSEL, 0, Longint(@CharRange));
End;


Тип и константа:


WM_USER = $0400;
EM_EXSETSEL = WM_USER + 55;

TCharRange = record
cpMin: Longint;
cpMax: LongInt;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.02.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-79865
h0use
2004-02-09 16:58
2004.02.25
Работа в D8


1-79947
Firewall
2004-02-12 12:38
2004.02.25
получить картинку из Интернета


7-80336
ed_30
2003-12-06 23:29
2004.02.25
Висит ли процесс?


4-80366
Opryshok
2003-12-17 13:53
2004.02.25
Как изменить размер контрола посылкой месседжа?


1-79921
HolyMan
2004-02-09 00:05
2004.02.25
Инсталирование нескольких программ