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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неработает кусок Api-функции или, как перейти на строку, зная ее индекс 
V
    Опции темы
ActioN
Дата 10.4.2005, 00:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот столкнулся с проблемой. Использую TSynEdit+Hightlighter. Мне необходимо сделать как в билдере, ... к примеру компилируется код в билдере, находятся ошибки, в нижней части редактора кода появляется окно со списком ошибок и при двойном клике на одном из items, редактор кода переходит на строку указанную в тексте ошибки. Как из текста взять цифры(номер строки) уже сделал, а вот как перейти на строку незнаю. Предложили мне такой код, который на RichEdit и Memo работает без проблем а в SynEdit отказывается работать:

Код

void SelectLine(TRichEdit *Editor, DWORD nLine)
{ 
Editor->SetFocus();  
Editor->SelStart=SendMessage(Editor->Handle,EM_LINEINDEX,nLine,0);  // Здесь
SendMessage(Editor->Handle,EM_SCROLLCARET,0,0);  
Editor->SelLength = Editor->Lines->Strings[nLine].Length();
}
........
void __fastcall TForm1::Button1Click(TObject *Sender)
{  
SelectLine(RichEdit1,20);
}


Это сообщение отредактировал(а) Vitalik - 10.4.2005, 10:18
  Вверх
Vitalik
Дата 10.4.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ActioN, почему бы просто не использовать свойства SynEdit'a BlockBegin, BlockEnd и CaretXY для этого? smile

Код

var
  Len: integer;
begin
  Editor.SetFocus();
  Len := Length(Editor.Lines.Strings[nLine-1])+1;
  Editor.CaretXY    := BufferCoord(Len, nLine);
  Editor.BlockBegin := BufferCoord(0,   nLine);
  Editor.BlockEnd   := BufferCoord(Len, nLine);
end;

Код

{
  Editor->SetFocus();
  int Len = Editor->Lines->Strings[nLine-1].Length()+1;
  Editor->CaretXY    = BufferCoord(Len, nLine);
  Editor->BlockBegin = BufferCoord(0,   nLine);
  Editor->BlockEnd   = BufferCoord(Len, nLine);
}

Добавлено @ 14:05
P.S. В твоём сообщении я только исправил тип кода с Delphi на C++ Builder. И вместо невостребованных тегов жирности в коде вставил комментарий.
PM MAIL WWW ICQ YIM   Вверх
Guest
Дата 11.4.2005, 00:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Vitalik, спасибо за исправления, попробовал откомилировать(Builder 6), выдает вот такие ошибки:

[C++ Error] Unit1.cpp(22): E2268 Call to undefined function 'BufferCoord'
[C++ Error] Unit1.cpp(22): E2034 Cannot convert 'int' to 'TPoint'
[C++ Error] Unit1.cpp(23): E2034 Cannot convert 'int' to 'TPoint'
[C++ Error] Unit1.cpp(24): E2034 Cannot convert 'int' to 'TPoint'
[C++ Warning] Unit1.cpp(25): W8004 'Len' is assigned a value that is never used
  Вверх
ActioN
Дата 11.4.2005, 01:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











+еще пришлось в файле SynEditHighlighter.hpp закоментировать две строчки, т.к. выдавались ошибки

// __property AnsiString LanguageName = {read=GetLanguageName};
// __property TSynHighlighterCapabilities Capabilities = {read=GetCapabilities, nodefault};

  Вверх
Vitalik
Дата 11.4.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ActioN @ 11.4.2005, 00:58)
попробовал откомилировать(Builder 6), выдает вот такие ошибки:

У меня сейчас Билдер не установлен, поэтому я написал как оно приблизительно должно выглядеть...

Цитата(Guest @ 11.4.2005, 00:58)
[C++ Error] Unit1.cpp(22): E2268 Call to undefined function 'BufferCoord'
[C++ Error] Unit1.cpp(22): E2034 Cannot convert 'int' to 'TPoint'

По видимому у тебя старая версия SynEdit. В ней вместо нового типа TBufferCoord для задания позиции курсора использовался стандартный тип TPoint smile
У тебя какая версия SynEdit? Тебе нужна именно старая, но стабильная или ты просто не знал о существовании новой версии (правда беты)?
Если что, советую скачать последнюю бету SynEdit 2.0.1 beta smile

Цитата(ActioN @ 11.4.2005, 01:02)
+еще пришлось в файле SynEditHighlighter.hpp закоментировать две строчки, т.к. выдавались ошибки

Да, помню... Тоже была такая проблемка, когда под Билдером компонент ставил smile
hpp файлы создаются самим билдером, попробую разобраться в чём тут дело...


P.S. Зарегистрируйся на этом форуме smile
Вот ссылочка: http://forum.vingrad.ru/index.php?act=Reg&CODE=00

PM MAIL WWW ICQ YIM   Вверх
ActioN
Дата 12.4.2005, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Vitalik, в readme написано:
This is the first public version 1.0 of the SynEdit project.
Скорее всего у меня версия 1.0 smile
Мне нужна такая версия SynEdit чтобы нормально работала и чтобы реализовать работу куска этого кода, который на старой неработает
И еще
1: т.к. я пользуюсь старой версией SynEdit и уже кучу кода написал под нее, будет ли он работать на новой версии?
2: В RichEdit есть SelLenght() и SelStart, а в SynEdit SelStart и SelEnd, неужели нету каких-нибудь быстрых команд для реализации "SelLength"?, а то на вычисление длинны слова через SelStart & SelEnd уходит больше времени.
PM MAIL WWW   Вверх
Vitalik
Дата 12.4.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ActioN @ 12.4.2005, 01:34)
Мне нужна такая версия SynEdit чтобы нормально работала и чтобы реализовать работу куска этого кода, который на старой неработает

SynEdit 2.0.1 beta вполне нормально работает. Я ей и сам пользуюсь smile
Но этот код можно реализовать и на старой версии SynEdit'a:
Код
{    
  Editor->SetFocus();    
  int Len = Editor->Lines->Strings[nLine-1].Length()+1;    
  Editor->CaretXY    = Point(Len, nLine);
  Editor->BlockBegin = Point(0,   nLine);
  Editor->BlockEnd   = Point(Len, nLine);
}


Цитата(ActioN @ 12.4.2005, 01:34)
1: т.к. я пользуюсь старой версией SynEdit и уже кучу кода написал под нее, будет ли он работать на новой версии?

Работать будет, но как минимум придётся везде поменять использование свойств CaretXY, BlockBegin, BlockEnd и др. Так как они поменяли их тип с TPoint на TBufferCoord, то BlockBegin.X нужно будет поменять на BlockBegin.Char и BlockBegin.Y - на BlockBegin.Line. А также тип соответствующих переменных с TPoint на TBufferCoord.
Если же ты не использовал этих свойств, то этого и менять не надо будет.
Вроде бы есть еще какие-то не стыковки, но они не такие существенные и исправляются легко.
В целом - переход на новую версию SynEdit в любом случае того стоит smile

Цитата(ActioN @ 12.4.2005, 01:34)
2: В RichEdit есть SelLenght() и SelStart, а в SynEdit SelStart и SelEnd, неужели нету каких-нибудь быстрых команд для реализации "SelLength"?, а то на вычисление длинны слова через SelStart & SelEnd уходит больше времени.

В SynEdit 2.0.1 beta и более ранних версиях, кстати, уже есть такое свойтсво SelLength у SynEdit'a smile
Еще один повод перейти на новую версию smile
PM MAIL WWW ICQ YIM   Вверх
ActioN
Дата 13.4.2005, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Vitalik, скачал новую версию SynEdit с Sourceforge.net, воспользовался кодом из сообщения #2, и все заработало, спасибо.
А можно узнать какие нововведения появились в новой версии (на русском желательно). Сам заметил что много hightloghter'ов появилось.
И еще. Можно ли где-то достать описание команд SynEdit?
PM MAIL WWW   Вверх
Vitalik
Дата 14.4.2005, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ActioN @ 13.4.2005, 00:16)
А можно узнать какие нововведения появились в новой версии (на русском желательно).

Не встречал историй версий smile
Есть на английском, но не в очень-то удобочитабельном виде smile

Цитата(ActioN @ 13.4.2005, 00:16)
Можно ли где-то достать описание команд SynEdit?

Этого тоже не знаю. К сожалению не слышал об этом... smile
Добавлено @ 00:27
Но если будут вопросы - спрашивай здесь smile
Чем сможем - поможем smile
PM MAIL WWW ICQ YIM   Вверх
ActioN
Дата 14.4.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Vitalik, ОК, буду знать. Повысил бы тебе репутацию за хорошие ответы и советы, дак у меня нету 100 постов. Поэтому просто Спасибо!

Это сообщение отредактировал(а) ActioN - 14.4.2005, 23:50
PM MAIL WWW   Вверх
Quadr0
Дата 11.5.2005, 15:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:14
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




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


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

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