Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как корректно выделить все функции и процедуры из *.pas файла? [D6, WinXP]


Страницы:   1 2

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.: Необходимо выделить ТОЛЬКО заголовок с параметрами! Сама реализация процедуры или функции мне не нужна!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо