Коллеги просили в
соседней ветке разворачиватель для ABSTRACT-процедур.
модератор: "соседняя ветка" внесена сюдаПользуюсь вот таким.
Автор - Павел Манюнин (мой бывший студент, ныне проходящий службу в в рядах военно-воздушных сил РФ
).
Код:
IMPORT TextControllers, TextModels, TextMappers;
PROCEDURE MakeProcBody*;
VAR c: TextControllers.Controller;
beg, end: INTEGER;
rd: TextModels.Reader;
procname: ARRAY 64 OF CHAR;
i, j: INTEGER;
ch: CHAR;
find: BOOLEAN;
f: TextMappers.Formatter;
BEGIN
c := TextControllers.Focus();
IF c.HasSelection() THEN
c.GetSelection(beg, end);
rd := c.text.NewReader(NIL);
i := beg; j := 0;
rd.SetPos(beg);
WHILE i < end DO
rd.ReadChar(procname[j]);
INC(j);
INC(i)
END;
procname[j] := 0X;
find := FALSE;
i := end;
rd.ReadChar(ch);
WHILE ~( rd.eot OR (ch = 0DX) ) & ~( (ch = "(") OR (ch = ",") ) DO
rd.ReadChar(ch)
END;
IF ch = "(" THEN
rd.ReadChar(ch);
WHILE (~(ch = 0DX) & ~(rd.eot)) & ~(ch = ")") DO
rd.ReadChar(ch)
END;
IF ch # 0DX THEN
rd.ReadChar(ch);
WHILE (~(ch = 0DX) & ~(rd.eot)) & ~(ch = ",") DO
rd.ReadChar(ch)
END;
END;
END;
IF ch = "," THEN
beg := rd.Pos()-1;
find := TRUE;
END;
IF find THEN
rd.ReadChar(ch);
WHILE ~rd.eot & ~(ch = 0DX) DO
rd.ReadChar(ch);
END;
c.text.Delete(beg, rd.Pos());
f.ConnectTo(c.text);
f.rider.SetPos(beg);
f.rider.WriteChar(';');
f.rider.WriteChar(TextModels.line);
f.rider.WriteChar(TextModels.tab);
f.WriteString("BEGIN");
f.rider.WriteChar(TextModels.line);
(* IF это функция THEN
END; *)
f.rider.WriteChar(TextModels.tab);
f.WriteString("END ");
f.WriteString(procname);
f.rider.WriteChar(';');
f.rider.WriteChar(TextModels.line);
END;
END;
END MakeProcBody;
MakeProcBody вешается в меню.
Как применять:
скопировали себе в модуль реализации абстрактные декларации. Выделяем имя процедуры двойным кликом, даём команду, она разворачивается в реализацию. Надо бы избавиться от необходимости выделять, пусть просто курсор стоит на строке.