Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2017, 09:01   #1
jirtreck
Пользователь
 
Регистрация: 29.06.2011
Сообщений: 56
По умолчанию Посчитать количество классов в программе

Нужно сделать программу-тестировщик, которая будет выводить количество классов в другой программе на delphi.
В программе указываешь папку с тестируемой программой, где есть расширение .pas, программа сканирует все файлы с этим расширением и выводит общее количество классов в тестируемой программе.

С помощью каких компонентов/функций можно сделать выбор папки и прочтение всех файлов с одинаковым расширением в ней?

Чтобы посчитать количество классов в файле, достаточно только посчитать сколько раз попадается слово class?
jirtreck вне форума Ответить с цитированием
Старый 14.12.2017, 09:19   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
С помощью каких компонентов/функций можно сделать выбор папки и прочтение всех файлов с одинаковым расширением в ней?
(выбор)select(папки)directory
(поиск)find(файлов)file(все)*(c одинаковым расширением).pas

Цитата:
Чтобы посчитать количество классов в файле, достаточно только посчитать сколько раз попадается слово class?
Код:
...
public
 class procedure ShowItem;
...
implementation
class procedure ShowItem;
begin
....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.12.2017 в 09:24.
evg_m на форуме Ответить с цитированием
Старый 14.12.2017, 09:26   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Чтобы посчитать количество классов в файле, достаточно только посчитать сколько раз попадается слово class
В Classes тоже class есть. И, например, в декларации
Код:
    CDSVagUpdateClass: TSmallintField;
и в константе
Код:
s:='TGdcDM = class(TDataModule)';
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.12.2017 в 09:29.
Аватар вне форума Ответить с цитированием
Старый 14.12.2017, 09:29   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от jirtreck Посмотреть сообщение
Чтобы посчитать количество классов в файле, достаточно только посчитать сколько раз попадается слово class?
в принципе - да, достаточно.

НО! но нужно обязательно учитывать синтаксис,
искать слово class нужно целиком,
искать желательно только в разделе type...

обязательно делать синтаксический разбор кода,
т.к.
Код:
  TThemeServicesClass = class of TThemeServices;
это объявление класса.

а это нет:
Код:
const searchValue= 'class';
кроме того, нужно не подсчитывать слово class, если оно встречается в строковых литералах (см. пример выше) и если кусок кода, где используется слово class закомментарен.

Так что, по хорошему, без синтаксического анализатора не обойтись.

Добавлено
пока писал, уже без меня всё разжевали...

Цитата:
Сообщение от evg_m Посмотреть сообщение
class procedure
ну и из той же серии
Цитата:
Код:
  CoConnection = class
    class function Create: _Connection;
    class function CreateRemote(const MachineName: string): _Connection;
  end;

Последний раз редактировалось Serge_Bliznykov; 14.12.2017 в 09:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2017, 09:34   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Какой дебил придумал эту задачу?
Сломай ему нос. Скажи - я разрешил.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 14.12.2017, 10:02   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Какой дебил придумал эту задачу?
Сломай ему нос. Скажи - я разрешил.
Вот зря Вы так. У меня стояла реальная аналогичная задача, только в неё кроме классов ещё и функции/процедуры входили. В проекте на 50 тыщ строк
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 14.12.2017, 10:14   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Вот зря Вы так. У меня стояла реальная аналогичная задача, только в неё кроме классов ещё и функции/процедуры входили. В проекте на 50 тыщ строк
Та що ви говОрите?! И как использовать полученную инфу? Кому нахрен она нужна? Какая разница, сколько классов в программе: 100500 или 100501?

Ненужная дебильная пустая работа!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 14.12.2017, 10:57   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Та що ви говОрите?! И как использовать полученную инфу? Кому нахрен она нужна? Какая разница, сколько классов в программе: 100500 или 100501?

Ненужная дебильная пустая работа!
Это исключительно Ваше мнение, уважаемый. Рекомендую Вам впредь не судить, предварительно не ознакомившись со всеми обстоятельствами. За сим предлагаю завязывать с ненужным оффтопом.

P.S. А что без картинки? Неужели подходящей по случаю не нашли?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 14.12.2017, 11:05   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
в другой программе на delphi.
Цитата:
указываешь папку с тестируемой программой
в одной папке может быть БОЛЕЕ ЧЕМ один проект, особенно если есть несколько взаимосвязанных. к примеру общей БД и общими модулями доступа, но разными её областями.
а большой проект можно разложить и по вложенным папкам.
а если в папке есть "'мусорные" unit (файлы не включенные в проект)?
и наоборот есть файлы проекта, НО за пределами папки(директории)?
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 17.12.2017, 23:14   #10
jirtreck
Пользователь
 
Регистрация: 29.06.2011
Сообщений: 56
По умолчанию

Всем спасибо, у меня появилась проблема: как сделать так, чтобы список выводимых файлов появлялся в Memo?
После выбора директории ничего не происходит.

Код:
procedure ScanDir(SearchPath: string; SearchExt:string; List: TStrings);
var
Mask:string;
SR: TSearchRec;
begin
Mask:='*.*';
if FindFirst(SearchPath+Mask,faAnyfile,SR) <> 0 then
begin
  repeat
    if (SR.Attr and faDirectory) = faDirectory then
    begin
      if (sr.Name <> '.') and (sr.Name <> '..') then
      ScanDir (Searchpath + SR.Name + '\',SearchExt, List);
    end
    else
    begin
      if extractfileext(sr.Name) = Searchext then
      List.Add(Searchpath+SR.Name);
    end
  until FindNext(SR) <> 0;
  FindClose(SR);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var chosenDirectory: string;
begin
SelectDirectory('Выберите каталог', '', chosenDirectory);
ScanDir(chosenDirectory, 'pas', memo1.Lines);
end;
jirtreck вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[VB] Нужно посчитать их количество Никита222 Помощь студентам 3 22.10.2017 21:53
Можно ли посчитать количество строк в программе, зная только ее вес? Olga_Mi Помощь студентам 3 06.10.2016 08:46
как посчитать количество xauto-pro Microsoft Office Excel 6 23.08.2015 15:18
Посчитать количество Aqil_f Microsoft Office Excel 6 11.03.2014 08:51
Посчитать количество слов OPEJI Паскаль, Turbo Pascal, PascalABC.NET 5 19.05.2011 17:58