Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c