Инфа о закладках

Место, где разработчики плагинов могут поделиться своим опытом.
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Инфа о закладках

Post by Dark »

Доброго времени суток Господа.
Подскажите пожалуйста по поводу получения инфы о закладках в редакторе.

1. Не совсем понял различие между ECTL_GETBOOKMARKS и ECTL_GETSTACKBOOKMARKS.
2. При попытке получить через ECTL_GETBOOKMARKS вроде как по началу отрабатывает, но потом плагин вообще вышибает.

Делал так:

Code: Select all

FARAPI.EditorControl(ECTL_GETINFO, @FarEditorInfo);
BookMarksCount := FarEditorInfo.BookMarkCount;

If FARAPI.EditorControl(ECTL_GETBOOKMARKS, @FarEditorBookMarks) = 1 then
begin
   For I := 0 to BookMarksCount do
   begin
      FarEditorColor.StringNumber := FarEditorBookMarks.Line[I];
      FarEditorColor.ColorItem := 0;
      FarEditorColor.StartPos := FarEditorBookMarks.Cursor[I];
      FarEditorColor.EndPos := FarEditorBookMarks.Cursor[I];
      FarEditorColor.Color := 31;

      FARAPI.EditorControl(ECTL_ADDCOLOR, @FarEditorColor);
   end;
end;
FARAPI.EditorControl возвращает True. Из этого могу сделать вывод, что FarEditorBookMarks все таки заполняется.
Но как только попадаю в цикл, плагин сразу вышибает по критической ошибке.

Есть подозрение, что нужно установить размер для FarEditorBookMarks.Line и FarEditorBookMarks.Cursor, но признаться не совсем понимаю как.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

For I := 0 to BookMarksCount - 1 do
Не?
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

Max Rusov wrote:
For I := 0 to BookMarksCount - 1 do
Не?
FarEditorInfo.BookMarkCount - возвращает всего закладок. А их 10 от 0..9
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

Ну так, если BookMarkCount - количество, то перебирать надо от 0 до Count - 1.
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

Max Rusov wrote:Ну так, если BookMarkCount - количество, то перебирать надо от 0 до Count - 1.
Результат тот же.
Понимаю так, что дело не в количестве. 10 их и 10. Все равно ему.
Если сделать:

Code: Select all

   For I := 0 to BookMarksCount do
   begin
      ShowMessage('111');
   end;
То цикл отрабатывает нормально.

Как только появляется обращение к FarEditorBookMarks.Line или FarEditorBookMarks.Cursor, сразу вышибает.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

Dark wrote:Как только появляется обращение к FarEditorBookMarks.Line или FarEditorBookMarks.Cursor, сразу вышибает.
Ну естественно, если в массиве N элементов, а ты обращаешься к N + 1, то все может вышибить.
Но если с -1 результат тот-же, то дело не в этом.

Вообще в писании этот ECTL_GETBOOKMARKS как-то мутно описан. Непонятно, надо ли самостоятельно выделять память под массивы...
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

Max Rusov wrote: Вообще в писании этот ECTL_GETBOOKMARKS как-то мутно описан. Непонятно, надо ли самостоятельно выделять память под массивы...
Я так понял, что именно размер назначить надо.

Вот как мне это на дельфю перегнать?

Code: Select all

EditorBookMarks bm = {new long[iBookmarkCount],new long[iBookmarkCount],0,0};
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

Попробуй так.

Code: Select all

with FarEditorBookMarks do begin
  Line := AllocMem( BookMarksCount  * SizeOf(Integer) );
  Cursor := AllocMem( BookMarksCount  * SizeOf(Integer) );
  ScreenLine := nil;
  LeftPos := nil;
end;
После обработки, естественно, память освободить не забудь.
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

А я через FillChar пробовал
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

:facepalm:
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

Max Rusov wrote::facepalm:
Да, сам уже допер, что дурак...
Dark
Posts: 47
Joined: Mon 08 Nov, 2010 20:45

Re: Инфа о закладках

Post by Dark »

Да, спасибо огромное.
Работает.

учимся дальше...
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

Тем не менее - в писании надо бы статью улучшить. Особенно это непонятно:
ECTL_GETSTACKBOOKMARKS

Получить информацию о позициях навигации ("стековых закладках") для текущего редактируемого файла. Param указывает на структуру EditorBookMarks или равен NULL.
Команда возвращает количество позиций навигации, информация о которых была передана (или общее количество позиций навигации, если в качестве Param было передано значение NULL).
User avatar
Tim Sobolev
Posts: 729
Joined: Fri 01 Apr, 2005 14:46
Location: Украина
Has thanked: 1 time
Been thanked: 7 times

Re: Инфа о закладках

Post by Tim Sobolev »

Dark wrote:1. Не совсем понял различие между ECTL_GETBOOKMARKS и ECTL_GETSTACKBOOKMARKS.
Первое относится к "обычным" закладкам, максимальным количеством до 10, с возможностью сохранения закладок между сеансами редактирования файлов.
Второе -- к так называемым "стековым" (есть более подходящее название -- предлагайте, сейчас я бы назвал "динамические"), с произвольно большим возможным количеством, не сохраняющимися между сеансами редактирования.
Max Rusov wrote:Тем не менее - в писании надо бы статью улучшить. Особенно это непонятно:
Если параметр NULL -- вернём существующее количество закладок, не NULL -- заполним структуру и укажем количество, информация о которых была передана.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Инфа о закладках

Post by Max Rusov »

Но в вызов не передается размер массивов, под которые я выделил память. Т.е. FAR предполагает, что этот размер достаточен, что я сначала узнал количество закладок, а потом выделил достаточно памяти. Следовательно он передает информацию о всех закладках и всегда возвращает общее количество. Так? Тогда к чему последняя фраза из которой, вроде как следует что с NULL и без NULL возвращаются разные числа?
Post Reply

Return to “Разработка плагинов”