Модераторы: Vitalik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделит текст в SunEdit для копирования 
V
    Опции темы
PalR
Дата 16.4.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 5.4.2005

Репутация: нет
Всего: нет



В 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;


PM MAIL   Вверх
Vitalik
Дата 16.4.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



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
PM MAIL WWW ICQ YIM   Вверх
PalR
Дата 17.4.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 5.4.2005

Репутация: нет
Всего: нет



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

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

У меня обзывается по другому, поэтому правил при вставке в форум. Ну и обшибся. smile
Вобщем сделал. Сенкс.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.