Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Найти все классы, зарегистрированные классом формы

Delphi , Компоненты и Классы , Классы

Найти все классы, зарегистрированные классом формы

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Question: How can I get all classes that are currently registered in my Application? 

  Answer: There is no way to get at classes registered via RegisterClasses, since the 
  list holding these is private to the classes unit.You can get at the classes 
  registered on a Form, however, since those use a Table connected to the Form 
  classes class record.The following is based on some spelunking in the classes unit: 
}

 // defined in classes.pas 
type
   PFieldClassTable = ^TFieldClassTable;
   TFieldClassTable = packed record
     Count: Smallint;
     Classes: array[0..8191] of ^TPersistentClass;
   end;


 function GetFieldClassTable(AClass: TClass): PFieldClassTable; assembler;
 asm
     MOV EAX,[EAX].vmtFieldTable
     OR EAX,EAX
     JE @@1
     MOV EAX,[EAX+2].Integer
     @@1:
 end;
   // end of quote from classes.pas 

procedure TForm1.Button1Click(Sender: TObject);

   procedure Display(const S: string);
   begin
     memo1.Lines.Add(S);
   end;

    var
   pFCT: PFieldClassTable;
   aClass: TClass;
   i: SmallInt;
 begin
   memo1.Clear;
   aClass := Classtype;
   while aClass <> TPersistent do
   begin
     Display('Registered classes for class ' + aClass.ClassName);
     pFCT := GetFieldClasstable(aClass);
     if not Assigned(pFCT) then
       Display(' No classes registered')
     else
     begin
       Display(Format(' %d classes registered', [pFCT^.Count]));
       for i := 0 to pFCT^.Count - 1 do
         Display(' ' + pFCT^.Classes[i]^.ClassName);
     end;
     aClass := aClass.ClassParent;
   end
 end;

Код-снippet предназначен для отображения всех классов, которые в настоящее время зарегистрированы в приложении, конкретно на форме.

Вот что код делает:

  1. Он итерирует все классы, начиная с TForm (текущей формы) и до корневого класса (TPersistent).
  2. Для каждого класса он вызывает функцию GetFieldClassTable, чтобы получить таблицу зарегистрированных классов.
  3. Если таблица не пуста, он отображает количество зарегистрированных классов и их имена.

Вот шаг за шагом:

  • Процедура Display используется для добавления строк в текстовое поле (memo1) с указанным текстом.
  • Основной код начинается с очистки текстового поля и установки aClass в тип текущего класса (TForm1 в этом случае).
  • Затем он вступает в цикл, который продолжается до тех пор, пока aClass не станет равным TPersistent.
  • Внутри цикла он отображает имя текущего класса, получает его таблицу полей с помощью GetFieldClassTable, проверяет, является ли таблица пустой (если не назначена), и если нет:
    • Отображает количество зарегистрированных классов в таблице.
    • Итерирует каждый класс в таблице и отображает их имена.
  • Цикл продолжается с следующим суперклассом до тех пор, пока не достигнет TPersistent.
  • Функция GetFieldClassTable - это обертка вокруг низкоуровневого ассемблерного кода, который извлекает таблицу полей из заданного класса. Эта таблица содержит массив зарегистрированных классов для этого класса.
  • В целом, этот код отображает все классы, зарегистрированные на форме, и их соответствующие количества. Он полезен при необходимости проверки или отладки зарегистрированных классов в вашем приложении.

Найдите все классы, зарегистрированные классом формы, используя функцию GetFieldClasstable и рекурсивно обойдите родительские классы.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-11 02:41:39/0.0083250999450684/1