|
Вопрос # 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
-
- {
-
- TClass1
- TClass2
- TClass3
- }
- 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|