Выделение блоков begin - end в Memo

Linux_64
Дата: 18.09.2019 15:01:52
Добрый день!
Все вы видели как CnPack выделяет линиями блоки begin и end.
Кроме того они не обязательно могут находиться друг под другом и к тому же иметь "вложенные" блоки.
Кто-нибудь пытался реализовать подобное?
Мой код:
Type TNewMemo= class(TMemo)
  protected
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;

Procedure NewMemo.WMPaint(var Message: TWMPaint); message WM_PAINT;
var
 N1,           // Начальная точка прорисовки линии
 N2: integer;  // Конечная точка прорисовки линии
 A, B: integer;   // Количество символов слева до слов begin/end
 C: integer; // Отступ слева (Количество пикселей)
 N_BEGIN: integer; // номер строки, где найден begin
 N_END: integer; // номер строки, где найден end
 TopLine: integer; // Номер верхней видимой строки редактора
 K: TControlCanvas;
begin
 TopLine := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
 // Поиск слова BEGIN, начиная от верхней видимой линии
 for N_BEGIN:= TopLine to Memo.Lines.Count-1 do
 if Pos('begin', Memo.Lines[N_BEGIN])<>0 then
 begin
  A:= Pos('begin', Memo.Lines[N_BEGIN]);
  break;
 end;
 // Поиск слова END, начиная от верхней видимой линии
 for N_END:= TopLine to Memo.Lines.Count-1 do
 if Pos('end', Memo.Lines[N_END])<>0 then
 begin
  B:= Pos('end', Memo.Lines[N_END]);
  break;
 end;
 //
 N1:= Memo1.Font.Size*N_BEGIN+6;
 N2:= Memo2.Font.Size*N_END+6;
 C:= A*7; // Количество символов умножим на ~ширину одного символа
 //
 try // Создаем холст для рисования
  K:= TControlCanvas.Create;
  K.Control:= Self; // Присваиваем его нашему Memo
  with K do
  begin
   Pen.Color:= clRed;
   // Выводим вертикальную линию
   LineTo(C, N1);
   MoveTo(C, N2);
  end;
 finally
  K.Free;
 end;
end;
Мимопроходящий
Дата: 18.09.2019 15:04:33

ещё немного, ещо чу-чють
и ты на пишешь SynEdit

Posted via ActualForum NNTP Server 1.5

DimaBr
Дата: 18.09.2019 15:12:22
// Поиск слова BEGIN, начиная от верхней видимой линии

А что BEGIN не может быть выше ?
Linux_64
Дата: 18.09.2019 15:17:53
DimaBr, конечно может...
Предлагаете выполнять поиск, начиная с первой строки?
Linux_64
Дата: 18.09.2019 15:25:47
Кроме того, при добавлении новой пары: begin - end будет увеличено количество строк и прийдется все пересчитывать, либо вешать подобную процедуру на событие OnChange.
А как быть с вертикальной плохой прокрутки?, ведь даже если не прибавлять строки, следует сделать полную перерисовку...
Linux_64
Дата: 18.09.2019 15:28:24
Есть идеи? Или написать базу данных легче, чем рисовать в Memo ?
Мимопроходящий
Дата: 18.09.2019 15:33:42

18.09.2019 15:28, Linux_64 пишет:
> Есть идеи? Или написать базу данных легче, чем рисовать в Memo ?

Вы рисуйте, вы рисуйте, вам зачтётся,
Что гадать нам удалось, не удалось.
Ничего, что мы чужие, вы рисуйте,
Я потом, что непонятно, объясню.

(C)

Posted via ActualForum NNTP Server 1.5

Linux_64
Дата: 18.09.2019 15:44:51
Да ладно вам, конечно зачтется.
Я вот подумал, если завести ещё 4 переменных, тогда можно пройтись циклом снова и найти вторую пару begin - end
Мимопроходящий
Дата: 18.09.2019 15:47:29
Linux_64
Я вот подумал, если завести ещё 4 переменных, тогда можно пройтись циклом снова и найти вторую пару begin - end

DimaBr
Дата: 18.09.2019 15:48:56
А если я напишу Abegin ?