Главная страница
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.019 c
1-79746
Bers01
2004-02-12 10:46
2004.02.25
Как в TListBox вставить элементы типа TCheckBox или TComboBox ...


1-79962
Dem@n
2004-02-13 17:45
2004.02.25
Реализация подсветки синтаксиса?


1-79878
Developerr
2004-02-10 11:23
2004.02.25
Edit.Enabled=false;


1-79851
snake1977
2004-02-10 16:55
2004.02.25
преобразовать строку


3-79548
NoName
2004-01-29 22:37
2004.02.25
Хранимая процедура