![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как корректно выделить все функции и процедуры из *.pas файла? [D6, WinXP]
Volf_555 © (2005-12-15 22:43:00)Для того, чтобы выудить все функции с процедурами из *.pas файла, необходимо искать их после implementation.
С определением функций и процедур, написанных в одну строку - проблем не возникает. А начинаются они с того момента, когда заголовок функции или процедуры написан в несколько строк. Допустим есть следующий набор функций и процедур из Windows.pas:
function EndDialog; external user32 name 'EndDialog';
procedure GlobalUnfix; external kernel32 name 'GlobalUnfix';
function CreateWindowW(lpClassName: PWideChar; lpWindowName: PWideChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
function EndMenu; external user32 name 'EndMenu';
В обработчике событий пишу следующее:
procedure TForm1.Button1Click(Sender: TObject);
var
a1,a2:Integer;
cur:String;
chk:String;
res:String;
co:Integer;
zbeg,zend:Integer;
val:Integer;
begin
zbeg:=0;
zend:=memo1.Lines.Count-1;
for a1:=zbeg to zend do
begin
chk:='';
res:='';
cur:=memo1.Lines.Strings[a1];
for a2:=1 to 9 do
chk:=chk+cur[a2];
if (chk='function ') OR (chk='procedure') then
begin
res:=cur;
cur:=memo1.Lines.Strings[a1+1];
chk:='';
if Length(cur)<>0 then
for co:=a1 to zend do
begin
for a2:=1 to 9 do
chk:=chk+cur[a2];
val:=a1;
repeat
if (chk<>'function ') AND (chk<>'procedure') AND
(chk<>'begin ') AND (chk<>'var ') AND
(chk<>'asm ') then
begin
res:=res+cur;
cur:=memo1.Lines.Strings[val+1];
for a2:=1 to 9 do
chk:=chk+cur[a2];
end until (chk<>'function ') AND (chk<>'procedure') AND
(chk<>'begin ') AND (chk<>'var ') AND
(chk<>'asm ');
chk:='';
end;
end;
ShowMessage(res);
res:='';
end;
end;
конечному результату, то есть строкеres, если функция содержится в нескольких строках, присваивается несколько одинаковых фрагментов.
Как мне изменить код чтобы функции с процедурами определялись корректно?
Lamer@fools.ua (2005-12-16 11:47:00) [21]
function DoSomething(A: String = ');'; B: String = 'begin'; C: Integer): Integer;
Плохиш (2005-12-16 11:03:00) [22]
> Volf_555 (16.12.05 01:16) [4]
> Тоже думал по поводу составления такого алгоритма - но есть
> одно НО, которое заключается в том, что в названии функции
> или процедуры может присутствовать несколько точек с запятыми
И в чём проблема?
Если знаешь, что описания параметров функций/процедур всегдазаключаются в скобки, т.е. если имеется открывающая скобка, то и обязательнобудет закрывающая.
evvcom (2005-12-16 10:59:00) [23]
> Искать "begin"
Внутри функции может быть объявлена другая функция, а также type, const, var и прочее.
Slym (2005-12-16 04:58:00) [24]Искать "begin"
Volf_555 (2005-12-16 01:16:00) [25]
> Лучше составь регулярное выражение и воспользуйся TRegExpr.
В смысле регулярное выражение? И что это за класс TRegExpr?
> The_scorpion (15.12.05 22:58) [3]
> 1)Находишь function или procedure
> 2) ищешь ";"
> 3) выводишь результат.
> 4)Если далее следует Begin, то пропускаешь все строчки,
> пока не встретишь end.
> Пока не закончиться файл повторить указанный алгоритм.
Тоже думал по поводу составления такого алгоритма - но есть одно НО, которое заключается в том, что в названии функции или процедуры может присутствовать несколько точек с запятыми, например:
Допустим, в следующей функции после PWideChar стоит точка с запятой - получается что результат программы будет следующим:
function CreateWindowW(lpClassName: PWideChar;
А остальную часть тоже ведь надо дописать как то. Вот в этом и вопрос.
Думал вместо точек с запятыми искать скобки - бесполезно, начало вхождения новой функции или процедуры или бегина, энда - бесполезно.
Какой ещё может быть выход из ситуации?
function CreateWindowW(lpClassName: PWideChar; lpWindowName: PWideChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
The_scorpion (2005-12-15 22:58:00) [26]1)Находишь function или procedure
2) ищешь ";"
3) выводишь результат.
4)Если далее следует Begin, то пропускаешь все строчки, пока не встретишь end.
Пока не закончиться файл повторить указанный алгоритм.
Zeqfreed (2005-12-15 22:57:00) [27]Volf_555 (15.12.05 22:46) [1]
Лучше составь регулярное выражение и воспользуйся TRegExpr.
Volf_555 (2005-12-15 22:46:00) [28]P.S.: Необходимо выделить ТОЛЬКО заголовок с параметрами! Сама реализация процедуры или функции мне не нужна!