Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > SynUniHighlighter и SynEdit > Выделит текст в SunEdit для копирования


Автор: PalR 16.4.2005, 17:01
В SunEdit имеется текст в котором через некоторое количество строк встречаются строки, которые начинаются двойным слешем "//". Нужно программно выделить текст между этими строками. Строки все разной длинны, но не более 70 символов. RightEdge = 80. Не получается. Вот мой код, но работает он не правильно. Где то ошибка. Выделяется то лишнее, то не дотягивает.
Код

// предварительно курсор уже поставлен на начало откуда выделять
// ищем конец сообщения и сколько символов выделять
  SunEdit.SelLength := 0;
  for i:= SunEdit.CaretY to SunEdit.Lines.Count-1 do begin
    SunEdit.SelLength := SunEdit.SelLength +
                           Length(SunEdit.Lines[i]);
    if copy(SunEdit.Lines[i+1],1,2)='//' then begin
      break;
    end;
  end;


Автор: Vitalik 16.4.2005, 18:32
PalR, твоя ошибка в том, что ты не прибавляешь к SelLength еще символы переноса строки #13#10 smile
А также не учёл тот факт, что свойство CaretY указывает номер линии начиная с 1, а в свойстве Lines нумерация строк с 0 smile
То есть в твоём случае нужно было написать так:
Код

// предварительно курсор уже поставлен на начало откуда выделять    
// ищем конец сообщения и сколько символов выделять    
  SunEdit.SelLength := 0;    
  for i:= SunEdit.CaretY to SunEdit.Lines.Count-1 do begin    
    SunEdit.SelLength := SunEdit.SelLength +    
                         Length(SunEdit.Lines[i-1]) + 2; // Прибавить 2 
    if copy(SunEdit.Lines[i],1,2)='//' then begin    
      break;    
    end;    
  end;

Это если курсор стоит в начале строки. Если же он находится в середине, то нужно дополнительно вычесть из SelLength значение CaretX:
Код
  SynEdit.SelLength := SynEdit.SelLength - SynEdit.CaretX + 1;


А вообще можно написать еще проще, используя BlockBegin и BlockEnd:
Код

  SynEdit.BlockBegin := SynEdit.CaretXY;
  for i := SynEdit.CaretY to SynEdit.Lines.Count-1 do
    if copy(SynEdit.Lines[i], 1, 2) = '//' then begin
      SynEdit.BlockEnd := BufferCoord(1, i+1);
      break;
    end;

P.S. Только не SunEdit, а SynEdit smile

Автор: PalR 17.4.2005, 10:57
Цитата(Vitalik @ 16.4.2005, 18:32)
свойство CaretY указывает номер линии начиная с 1,

О как. smile Интересная особенность.
Цитата(Vitalik @ 16.4.2005, 18:32)
SynEdit

У меня обзывается по другому, поэтому правил при вставке в форум. Ну и обшибся. smile
Вобщем сделал. Сенкс.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)