|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Поиск внутри файлов
Помогите решить проблему.
Задача. Есть много файлов с расширением PAS (сколько не известно) в одной папке PAPKA. В них объявлено x классов (сколько именно неизвестно). Нужно произвести поиск классов и их предков (то есть того, что написано в скобках после "= class") во всех файлах с расширением PAS в папке PAPKA и записать в текстовой документ ProjectClasses. Но при этом есть одно очень важное замечание. Не у всех классов есть предки! Так же проблема с тем, что в строке с имянем класса и его предка/предков может быть произвольное количество пробелов, но стоит обратить внимание, что ВСЕГДА объявление класса и его предка/предков будет на одной строке. Конечно в идеале я бы хотел, чтобы компьютер составлял иерархическое древо классов (как во многих книгах по Delphi), но понимаю, что эта задача очень трудна. Заранее благодарен за любые ответы. P.S. Впринципе расскажите хотя бы как тупо производить поиск в файлах через Delphi, это информация уже бует очень важна. Делаем'c разные игры. Искать на glscene.ru |
#2
|
||||
|
||||
Не вижу больших сложностей.
Алгоритм примерно такой: 1. Открываем файл. 2. Построчно анализируем. Ищем вхождение "=class" в строке предварительно убрав все ненужные пробелы. 2.1. В случае нахождения, записываем в ветку дерева имя класса 2.2. Проверяем, является ли данный класс наследником ища в строке "=class(". Получаем имя предка. 2.2.1. В случае успеха переподчиняем ветку дерева ветке с именем предка. Если такой ветки еще не существует предварительно создаем ее. Выполняем п.2 Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Да, вроде все ok, но...
Цитата:
Делаем'c разные игры. Искать на glscene.ru |
#4
|
||||
|
||||
Цитата:
Давно я так заразительно не смеялся... А компьютер тебе зачем??? Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
Вопрос такой - как сделать игнорирование пробелов? Оба класса, объявленных ниже, должны попадать в список:
Код:
Syper = class (men) Код:
Beautiful= class (mensha) Цитата:
Делаем'c разные игры. Искать на glscene.ru |
#6
|
|||
|
|||
И ещё вопрос, как узнать сколько файлов лежит в папке PAPKA?
Делаем'c разные игры. Искать на glscene.ru |
#7
|
||||
|
||||
Ну никак непредполагал, что моя невинная фраза:
Цитата:
Имелось ввиду следующее: читаем строку(именно текущую стоку, а не весь юнит), прогоняем ее через S := StringReplace(S,#32#32,#32,[rfReplaceAll]) А получить количество нужных файлов можно так: Код:
Var FileInfo: TSearchRec; FileCount: Integer; begin FindFirst('c:\1\*.JPG', faAnyFile, FileInfo); FileCount := 0; repeat Inc(FileCount); until FindNext(FileInfo) <> 0; ShowMessage(IntToStr(FileCount)); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 28.08.2009 в 18:35. |
#8
|
|||
|
|||
2Страдалецъ,
спасибо. Кстати, покопал, вот ещё кое-что: http://www.delphisources.ru/pages/fa...First.php.html и тут есть кое-что, чего вы не учли. Но уже не важно. Возникла другая проблема. Я пишу: Код:
procedure TForm1.Button1Click(Sender: TObject); var TXT:TextFile; searchResult : TSearchRec; begin if FindFirst('C:\Wan.txt', faAnyFile, searchResult) = 0 then begin repeat AssignFile(TXT,'searchResult.Name'); Reset(TXT); CloseFile(TXT); until FindNext(searchResult) <> 0; FindClose(searchResult); end; end; Делаем'c разные игры. Искать на glscene.ru |
#9
|
|||
|
|||
Явная ошибка лежит тут
Код:
AssignFile(TXT,'searchResult.Name'); |
#10
|
||||
|
||||
ClassesTree
Держите: (Исправлено 23.09.09)
http://www.delphisources.ru/forum/sh...9&postcount=26 http://www.delphisources.ru/forum/sh...0&postcount=27 Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 09.11.2009 в 21:30. |
#11
|
||||
|
||||
ClassesTree
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject); var CT:TClassesTree; dir:string; begin dir := 'C:\Program Files\Borland\Delphi7\Projects\PAPKA\'; CT := TClassesTree.Create; try // исключая конструкции вида: TClass2 = class of TClass1; CT.IncludeClassLinks := false; CT.IncludeDebugInfo := false; // поиск включая подпапки CT.GetClassesFromDir(dir,true); // в TreeView1 построим дерево классов CT.MakeTree(TreeView1); // сохраним в виде дерева // ( можно использовать TreeView1.SaveToFile // результат будет одинаковый, кстати, полученный файл // можно будет загрузить используя TreeView1.LoadFromFile ) CT.SaveAsTree(dir+'ClassesTree.txt'); // сохраним в виде сортированного списка CT.SaveAsSortList(dir+'ClassesList.txt'); finally CT.Free; end; end; Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#12
|
|||
|
|||
2Rokuell,
мощьно! Но на строчке CT.SaveAsTree(dir+'ClassesTree.txt'); происходит ошибка. Конкретно в этой процедуре она происходит на строчке Rewrite(FTF);. Сама ошибка называется exception class EInOutError with message "Invalid filename". CT.SaveAsSortList(dir+'ClassesList.txt'); тоже не работатет! Делаем'c разные игры. Искать на glscene.ru |
#13
|
||||
|
||||
Цитата:
Invalid filename - Неправильное имя файла. Проверь ещё раз, что именно передаёшь в процедуру ( существует ли папка, заданная путём dir ), т.к у меня всё работает. Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 30.08.2009 в 21:42. |
#14
|
|||
|
|||
2Rokuell,
ещё раз спасибо за код!!! На деле ошибка возникала из-за того, что в папке (я забыл об этом сказать) лежал файл *.exe. Чтобы проблем не было, изменил код процедуры TClassesTree.SaveAsTree: Код:
procedure TClassesTree.SaveAsTree(FileName: string); var i:integer; function recsave(id:integer; pref:string):integer; var i:integer; begin if FIncludeDebugInfo then Writeln(FTF,pref+FNodes[id].name+' ',FNodes[id].line,' ',FNodes[id].fullpath) else Writeln(FTF,pref+FNodes[id].name); i := FNodes[id].fchildid; while (i<>-1) do i:=recsave(i,pref+FTabChar); Result := FNodes[id].nextid; end; begin if not IsLinked then MakeLinks; if NOT (FileName='*.pas') then exit; Assign(FTF,FileName); Rewrite(FTF); i := FNodes[0].fchildid; while (i<>-1) do i:=recsave(i,''); Close(FTF); end; Делаем'c разные игры. Искать на glscene.ru |
#15
|
||||
|
||||
1. Теги забыл))
2. выделенная строчка (ИМХО) должна иметь следующий вид: Код:
if not ExtractFileExt(FileName)='.pas' then exit; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 31.08.2009 в 13:19. |