| 
| 
 | Вопрос # 6 471/ вопрос решён / | 
 |  Здравствуйте, эксперты!Подскажите, пожалуйста, как можно получить список классов секции interface в Unit при известном имени этого Unit.
 Я уже видел такое, только забыл названия методов...
 
 Пример:
 Приложение:Переключить в обычный режим unit unit1; interface type   TClass1 = class end;  TClass2 = class end;  TClass3 = class end; implementation end. ======== unit unit2; interface uses Classes; type   TClassX = class    public funtion proc: TStringList;  end; implementation function TClassX.proc: TStringList;begin { TClass1TClass2TClass3}end; end.
|  |   Вопрос задал: dmistand (статус: 1-ый класс)Вопрос отправлен: 26 августа 2013, 13:01
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, dmistand!Если в каком то произвольном pas файле, тогда нужно делать парсер. И парсить все вручную (хотя можно поискать готовые парсеры).
 Если же это модуль в Вашем приложении, тогда можно - stack overflow
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 26 августа 2013, 13:29
 Оценка за ответ: 5
 Комментарий к оценке: Да-да! Это то, что нужно, спасибо!Единственное: чтобы это работало, классы нужно регистрировать в потоковой системе. Привожу код обоих модулей:
 
 unit Unit1;
 
 interface uses Classes;
 
 type
 
 TClass1 = class(TPersistent) end;
 TClass2 = class(TPersistent) end;
 TClass3 = class(TPersistent) end;
 
 implementation
 
 initialization
 
 RegisterClasses([TClass1, TClass2, TClass3]);
 
 end.
 
 ========
 
 program test_unit_classes;
 
 {$APPTYPE CONSOLE}
 
 uses
 Rtti,
 SysUtils,
 Unit1 in 'Unit1.pas';
 
 procedure Test;
 Var
 t : TRttiType;
 //extract the unit name from the  QualifiedName property
 function GetUnitName(lType: TRttiType): string;
 begin
 Result := StringReplace(lType.QualifiedName, '.' + lType.Name, '',[rfReplaceAll])
 end;
 
 begin
 //list all the types of the System.SysUtils unit
 for t in TRttiContext.Create.GetTypes do
 if SameText('Unit1',GetUnitName(t)) and (t.IsInstance) then
 Writeln(t.Name);
 end;
 
 begin
 try
 Test;
 except
 on E: Exception do
 Writeln(E.ClassName, ': ', E.Message);
 end;
 Readln;
 end.
 |  
 Мини-форум вопросаВсего сообщений: 0. 26 августа 2013, 14:06: Статус вопроса изменён на решённый (изменил автор вопроса — dmistand) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |