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

Вывести информацию о классах

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

Вывести информацию о классах



unit ClaForm;

interface

uses
  SysUtils, Classes, Graphics, Controls, Forms,
  StdCtrls, ExtCtrls, Buttons, Clipbrd, Comctrls, Db, Dbcgrids,
  Dbctrls, Dbgrids, Dblookup, DbTables, Ddeman, Dialogs,
  Filectrl, Grids, Mask, Menus, Mplayer, Olectnrs,
  Outline, Tabnotbk, Tabs, IniFiles, Printers,
  Registry, DsgnIntf, TypInfo;

type
  TForm1 = class(TForm)
    Listbox1: TListBox;
    ListBox2: TListBox;
    Splitter1: TSplitter;
    procedure Listbox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
  public
    procedure AddType (pti: PTypeInfo);
  end;

  procedure ShowClass (pti: PTypeInfo; sList: TStrings);
  // repeated from TypInfo.Pas
  procedure SortPropList(PropList: PPropList; PropCount: Integer);

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Listbox1Click(Sender: TObject);
var
  pti: PTypeInfo;
begin
  pti := PTypeInfo (ListBox1.Items.Objects [
    Listbox1.ItemIndex]);
  ListBox2.Items.Clear;
  Caption := 'RTTI information for ' +
    ListBox1.Items [Listbox1.ItemIndex];
  ShowClass (pti, ListBox2.Items);
end;

// show RTTI information for class type
procedure ShowClass (pti: PTypeInfo; sList: TStrings);
var
  ptd: PTypeData;
  ppi: PPropInfo;
  pProps: PPropList;
  nProps, I: Integer;
  ParentClass: TClass;
begin
  // protect against misuse
  if pti^.Kind <> tkClass then
    raise Exception.Create ('Invalid type information');

  // get a pointer to the TTypeData structure
  ptd := GetTypeData (pti);

  // access the TTypeInfo structure
  sList.Add ('Type Name: ' + pti^.Name);
  sList.Add ('Type Kind: ' + GetEnumName (
    TypeInfo (TTypeKind),
    Integer (pti^.Kind)));

  // access the TTypeData structure
  {omitted: the same information of pti^.Name...
  sList.Add ('ClassType: ' + ptd^.ClassType.ClassName);}
  sList.Add ('Size: ' + IntToStr (
    ptd^.ClassType.InstanceSize) + ' bytes');
  sList.Add ('Defined in: ' + ptd^.UnitName + '.pas');

  // add the list of parent classes (if any)
  ParentClass := ptd^.ClassType.ClassParent;
  if ParentClass <> nil then
  begin
    sList.Add ('');
    sList.Add ('=== Parent classes ===');
    while ParentClass <> nil do
    begin
      sList.Add (ParentClass.ClassName);
      ParentClass := ParentClass.ClassParent;
    end;
  end;

  // add the list of properties (if any)
  nProps := ptd^.PropCount;
  if nProps > 0 then
  begin
    // format the initial output
    sList.Add ('');
    sList.Add ('=== Properties (' +
      IntToStr (nProps) + ') ===');
    // allocate the required memory
    GetMem (pProps, sizeof (PPropInfo) * nProps);
    // protect the memory allocation
    try
      // fill the TPropList structure
      // pointed to by pProps
      GetPropInfos(pti, pProps);
      // sort the properties
      SortPropList(pProps, nProps);
      // show name and data type of each property
      for I := 0 to nProps - 1 do
      begin
        ppi := pProps [I];
        sList.Add (ppi.Name + ': ' +
          ppi.PropType^.Name);
      end;
    finally
      // free the allocated memmory
      FreeMem (pProps, sizeof (PPropInfo) * nProps);
    end;
  end;
end;

procedure TForm1.AddType (pti: PTypeInfo);
begin
  ListBox1.Items.AddObject(pti.Name, TObject (pti));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // add classes to the first listbox
  AddType (TypeInfo (TApplication));
  AddType (TypeInfo (TAutoIncField));
  AddType (TypeInfo (TBatchMove));
  AddType (TypeInfo (TBCDField));
  AddType (TypeInfo (TBevel));
  AddType (TypeInfo (TBitBtn));
  AddType (TypeInfo (TBitmap));
  AddType (TypeInfo (TBlobField));
  AddType (TypeInfo (TBlobStream));
  AddType (TypeInfo (TBooleanField));
  AddType (TypeInfo (TBrush));
  AddType (TypeInfo (TButton));
  AddType (TypeInfo (TButtonControl));
  AddType (TypeInfo (TBytesField));
  AddType (TypeInfo (TCanvas));
  AddType (TypeInfo (TCaptionProperty));
  AddType (TypeInfo (TChangeLink));
  AddType (TypeInfo (TCharProperty));
  AddType (TypeInfo (TCheckBox));
  AddType (TypeInfo (TClassProperty));
  AddType (TypeInfo (TClipboard));
  AddType (TypeInfo (TCollection));
  AddType (TypeInfo (TCollectionItem));
  AddType (TypeInfo (TColorDialog));
  AddType (TypeInfo (TColorProperty));
  AddType (TypeInfo (TColumn));
  AddType (TypeInfo (TColumnTitle));
  AddType (TypeInfo (TComboBox));
  AddType (TypeInfo (TCommonDialog));
  AddType (TypeInfo (TComponent));
  AddType (TypeInfo (TComponentEditor));
  AddType (TypeInfo (TComponentList));
  AddType (TypeInfo (TComponentProperty));
  AddType (TypeInfo (TControl));
  AddType (TypeInfo (TControlCanvas));
  AddType (TypeInfo (TControlScrollBar));
  AddType (TypeInfo (TCurrencyField));
  AddType (TypeInfo (TCursorProperty));
  AddType (TypeInfo (TCustomCheckBox));
  AddType (TypeInfo (TCustomComboBox));
  AddType (TypeInfo (TCustomControl));
  AddType (TypeInfo (TCustomEdit));
  AddType (TypeInfo (TCustomGrid));
  AddType (TypeInfo (TCustomGroupBox));
  AddType (TypeInfo (TCustomLabel));
  AddType (TypeInfo (TCustomListBox));
  AddType (TypeInfo (TCustomMaskEdit));
  AddType (TypeInfo (TCustomMemo));
  AddType (TypeInfo (TCustomMemoryStream));
  AddType (TypeInfo (TCustomOutline));
  AddType (TypeInfo (TCustomPanel));
  AddType (TypeInfo (TCustomRadioGroup));
  AddType (TypeInfo (TDatabase));
  AddType (TypeInfo (TDataSource));
  AddType (TypeInfo (TDateField));
  AddType (TypeInfo (TDateTimeField));
  AddType (TypeInfo (TDBCheckBox));
  AddType (TypeInfo (TDBComboBox));
  AddType (TypeInfo (TDBCtrlGrid));
  AddType (TypeInfo (TDBEdit));
  AddType (TypeInfo (TDBGrid));
  AddType (TypeInfo (TDBImage));
  AddType (TypeInfo (TDBListBox));
  AddType (TypeInfo (TDBLookupCombo));
  AddType (TypeInfo (TDBLookupList));
  AddType (TypeInfo (TDBLookupListBox));
  AddType (TypeInfo (TDBMemo));
  AddType (TypeInfo (TDBNavigator));
  AddType (TypeInfo (TDBRadioGroup));
  AddType (TypeInfo (TDBText));
  AddType (TypeInfo (TDDEClientConv));
  AddType (TypeInfo (TDDEClientItem));
  AddType (TypeInfo (TDDEServerConv));
  AddType (TypeInfo (TDDEServerItem));
  AddType (TypeInfo (TDefaultEditor));
  AddType (TypeInfo (TDesigner));
  AddType (TypeInfo (TDirectoryListBox));
  AddType (TypeInfo (TDragControlObject));
  AddType (TypeInfo (TDragObject));
  AddType (TypeInfo (TDrawGrid));
  AddType (TypeInfo (TDriveComboBox));
  AddType (TypeInfo (TEdit));
  AddType (TypeInfo (TEnumProperty));
  AddType (TypeInfo (TField));
  AddType (TypeInfo (TFieldDef));
  AddType (TypeInfo (TFieldDefs));
  AddType (TypeInfo (TFileListBox));
  AddType (TypeInfo (TFiler));
  AddType (TypeInfo (TFileStream));
  AddType (TypeInfo (TFilterComboBox));
  AddType (TypeInfo (TFindDialog));
  AddType (TypeInfo (TFloatField));
  AddType (TypeInfo (TFloatProperty));
  AddType (TypeInfo (TFont));
  AddType (TypeInfo (TFontDialog));
  AddType (TypeInfo (TFontNameProperty));
  AddType (TypeInfo (TFontProperty));
  AddType (TypeInfo (TForm));
  AddType (TypeInfo (TFormDesigner));
  AddType (TypeInfo (TGraphic));
  AddType (TypeInfo (TGraphicControl));
  AddType (TypeInfo (TGraphicField));
  AddType (TypeInfo (TGraphicsObject));
  AddType (TypeInfo (TGroupBox));
  AddType (TypeInfo (THandleStream));
  AddType (TypeInfo (THeader));
  AddType (TypeInfo (THeaderControl));
  AddType (TypeInfo (THeaderSection));
  AddType (TypeInfo (THeaderSections));
  AddType (TypeInfo (THintWindow));
  AddType (TypeInfo (THotKey));
  AddType (TypeInfo (TIcon));
  AddType (TypeInfo (TIconOptions));
  AddType (TypeInfo (TImage));
  AddType (TypeInfo (TImage));
  AddType (TypeInfo (TImageList));
  AddType (TypeInfo (TIndexDef));
  AddType (TypeInfo (TIndexDefs));
  AddType (TypeInfo (TIniFile));
  AddType (TypeInfo (TInplaceEdit));
  AddType (TypeInfo (TIntegerField));
  AddType (TypeInfo (TIntegerProperty));
  AddType (TypeInfo (TLabel));
  AddType (TypeInfo (TList));
  AddType (TypeInfo (TListBox));
  AddType (TypeInfo (TListColumn));
  AddType (TypeInfo (TListItem));
  AddType (TypeInfo (TListItems));
  AddType (TypeInfo (TListView));
  AddType (TypeInfo (TMainMenu));
  AddType (TypeInfo (TMaskEdit));
  AddType (TypeInfo (TMediaPlayer));
  AddType (TypeInfo (TMemo));
  AddType (TypeInfo (TMemoField));
  AddType (TypeInfo (TMemoryStream));
  AddType (TypeInfo (TMenu));
  AddType (TypeInfo (TMenuItem));
  AddType (TypeInfo (TMetafile));
  AddType (TypeInfo (TMetafileCanvas));
  AddType (TypeInfo (TMethodProperty));
  AddType (TypeInfo (TModalResultProperty));
  AddType (TypeInfo (TMPFileNameProperty));
  AddType (TypeInfo (TNotebook));
  AddType (TypeInfo (TNotebook));
  AddType (TypeInfo (TObject));
  AddType (TypeInfo (TOleContainer));
  AddType (TypeInfo (TOpenDialog));
  AddType (TypeInfo (TOrdinalProperty));
  AddType (TypeInfo (TOutline));
  AddType (TypeInfo (TOutlineNode));
  AddType (TypeInfo (TPageControl));
  AddType (TypeInfo (TPaintBox));
  AddType (TypeInfo (TPanel));
  AddType (TypeInfo (TParaAttributes));
  AddType (TypeInfo (TParam));
  AddType (TypeInfo (TParams));
  AddType (TypeInfo (TPen));
  AddType (TypeInfo (TPersistent));
  AddType (TypeInfo (TPicture));
  AddType (TypeInfo (TPopupMenu));
  AddType (TypeInfo (TPrintDialog));
  AddType (TypeInfo (TPrinter));
  AddType (TypeInfo (TPrinterSetupDialog));
  AddType (TypeInfo (TProgressBar));
  AddType (TypeInfo (TPropertyEditor));
  AddType (TypeInfo (TQuery));
  AddType (TypeInfo (TRadioButton));
  AddType (TypeInfo (TRadioGroup));
  AddType (TypeInfo (TReader));
  AddType (TypeInfo (TRegIniFile));
  AddType (TypeInfo (TRegistry));
  AddType (TypeInfo (TReplaceDialog));
  AddType (TypeInfo (TResourceStream));
  AddType (TypeInfo (TRichEdit));
  AddType (TypeInfo (TSaveDialog));
  AddType (TypeInfo (TScreen));
  AddType (TypeInfo (TScrollBar));
  AddType (TypeInfo (TScrollBox));
  AddType (TypeInfo (TScrollingWinControl));
  AddType (TypeInfo (TSession));
  AddType (TypeInfo (TSetElementProperty));
  AddType (TypeInfo (TSetProperty));
  AddType (TypeInfo (TShape));
  AddType (TypeInfo (TShape));
  AddType (TypeInfo (TShortCutProperty));
  AddType (TypeInfo (TSmallIntField));
  AddType (TypeInfo (TSpeedButton));
  AddType (TypeInfo (TStatusBar));
  AddType (TypeInfo (TStatusPanel));
  AddType (TypeInfo (TStatusPanels));
  AddType (TypeInfo (TStoredProc));
  AddType (TypeInfo (TStream));
  AddType (TypeInfo (TStringField));
  AddType (TypeInfo (TStringList));
  AddType (TypeInfo (TStringProperty));
  AddType (TypeInfo (TStrings));
  AddType (TypeInfo (TStringGrid));
  AddType (TypeInfo (TTabbedNotebook));
  AddType (TypeInfo (TTabControl));
  AddType (TypeInfo (TTable));
  AddType (TypeInfo (TTabOrderProperty));
  AddType (TypeInfo (TTabSet));
  AddType (TypeInfo (TTabSheet));
  AddType (TypeInfo (TTextAttributes));
  AddType (TypeInfo (TThread));
  AddType (TypeInfo (TTimeField));
  AddType (TypeInfo (TTimer));
  AddType (TypeInfo (TTrackBar));
  AddType (TypeInfo (TTreeNode));
  AddType (TypeInfo (TTreeNodes));
  AddType (TypeInfo (TTreeView));
  AddType (TypeInfo (TUpdateSQL));
  AddType (TypeInfo (TUpDown));
  AddType (TypeInfo (TVarBytesField));
  AddType (TypeInfo (TWinControl));
  AddType (TypeInfo (TWordField));
  AddType (TypeInfo (TWriter));
  AddType (TypeInfo (Exception));
  AddType (TypeInfo (EAbort));
  AddType (TypeInfo (EAccessViolation));
  AddType (TypeInfo (EControlC));
  AddType (TypeInfo (EConvertError));
  AddType (TypeInfo (EDivByZero));
  AddType (TypeInfo (EExternalException));
  AddType (TypeInfo (EInOutError));
  AddType (TypeInfo (EIntError));
  AddType (TypeInfo (EIntOverFlow));
  AddType (TypeInfo (EInvalidCast));
  AddType (TypeInfo (EInvalidOp));
  AddType (TypeInfo (EInvalidPointer));
  AddType (TypeInfo (EMathError));
  AddType (TypeInfo (EOutOfMemory));
  AddType (TypeInfo (EOverflow));
  AddType (TypeInfo (EPrivilege));
  AddType (TypeInfo (EPropReadOnly));
  AddType (TypeInfo (EPropWriteOnly));
  AddType (TypeInfo (ERangeError));
  AddType (TypeInfo (EStackOverflow));
  AddType (TypeInfo (EUnderflow));
  AddType (TypeInfo (EVariantError));
  AddType (TypeInfo (EZeroDivide));
end;

// code extracted from TypInfo.pas
procedure SortPropList(PropList: PPropList; PropCount: Integer); assembler;
asm
        { ->    EAX Pointer to prop list        }
        {       EDX Property count              }
        { <-    nothing                         }

        PUSH    EBX
        PUSH    ESI
        PUSH    EDI
        MOV     ECX,EAX
        XOR     EAX,EAX
        DEC     EDX
        CALL    @@qsort
        POP     EDI
        POP     ESI
        POP     EBX
        JMP     @@exit

@@qsort:
        PUSH    EAX
        PUSH    EDX
        LEA     EDI,[EAX+EDX]           { pivot := (left + right) div 2 }
        SHR     EDI,1
        MOV     EDI,[ECX+EDI*4]
        ADD     EDI,OFFSET TPropInfo.Name
@@repeat:                               { repeat                        }
@@while1:
        CALL    @@compare               { while a[i] < a[pivot] do inc(i);}
        JAE     @@endWhile1
        INC     EAX
        JMP     @@while1
@@endWhile1:
        XCHG    EAX,EDX
@@while2:
        CALL    @@compare               { while a[j] > a[pivot] do dec(j);}
        JBE     @@endWhile2
        DEC     EAX
        JMP     @@while2
@@endWhile2:
        XCHG    EAX,EDX
        CMP     EAX,EDX                 { if i <= j then begin          }
        JG      @@endRepeat
        MOV     EBX,[ECX+EAX*4]         { x := a[i];                    }
        MOV     ESI,[ECX+EDX*4]         { y := a[j];                    }
        MOV     [ECX+EDX*4],EBX         { a[j] := x;                    }
        MOV     [ECX+EAX*4],ESI         { a[i] := y;                    }
        INC     EAX                     { inc(i);                       }
        DEC     EDX                     { dec(j);                       }
                                        { end;                          }
        CMP     EAX,EDX                 { until i > j;                  }
        JLE     @@repeat

@@endRepeat:
        POP     ESI
        POP     EBX

        CMP     EAX,ESI
        JL      @@rightNonEmpty         { if i >= right then begin      }
        CMP     EDX,EBX
        JG      @@leftNonEmpty1         { if j <= left then exit        }
        RET

@@leftNonEmpty1:
        MOV     EAX,EBX
        JMP     @@qsort                 { qsort(left, j)                }

@@rightNonEmpty:
        CMP     EAX,EBX
        JG      @@leftNonEmpty2
        MOV     EDX,ESI                 { qsort(i, right)               }
        JMP     @@qsort
@@leftNonEmpty2:
        PUSH    EAX
        PUSH    ESI
        MOV     EAX,EBX
        CALL    @@qsort                 { qsort(left, j)                }
        POP     EDX
        POP     EAX
        JMP     @@qsort                 { qsort(i, right)               }

@@compare:
        PUSH    EAX
        PUSH    EDI
        MOV     ESI,[ECX+EAX*4]
        ADD     ESI,OFFSET TPropInfo.Name
        PUSH    ESI
        XOR     EBX,EBX
        MOV     BL,[ESI]
        INC     ESI
        CMP     BL,[EDI]
        JBE     @@firstLenSmaller
        MOV     BL,[EDI]
@@firstLenSmaller:
        INC     EDI
        TEST    BL,BL
        JE      @@endLoop
@@loop:
        MOV     AL,[ESI]
        MOV     AH,[EDI]
        AND     EAX,$DFDF
        CMP     AL,AH
        JNE     @@difference
        INC     ESI
        INC     EDI
        DEC     EBX
        JNZ     @@loop
@@endLoop:
        POP     ESI
        POP     EDI
        MOV     AL,[ESI]
        MOV     AH,[EDI]
        CMP     AL,AH
        POP     EAX
        RET
@@difference:
        POP     ESI
        POP     EDI
        POP     EAX
        RET
@@exit:
end;

procedure TForm1.ListBox2Click(Sender: TObject);
var
  Text: string;
  Index: Integer;
  pti: PTypeInfo;
begin
  // get the current item
  Text := ListBox2.Items [ListBox2.ItemIndex];
  // search the first listbox
  Index := ListBox1.Items.IndexOf (Text);
  // if found, it was a parent class: show RTTI
  if Index >= 0 then
  begin
    pti := PTypeInfo (ListBox1.Items.Objects [Index]);
    Caption := 'RTTI information for ' + Text;
    ListBox2.Items.Clear;
    ShowClass (pti, ListBox2.Items);
  end;
end;

end.

Загрузить весь проект

Программа на Delphi, которая отображает информацию о типе выполнения (RTTI) для различных классов в библиотеке VCL. Проект состоит из единственной формы с двумя списками и несколькими кнопками.

Вот обзор того, как проект работает:

  1. Обработчик события FormCreate пополняет первый список классами из библиотеки VCL.
  2. Когда вы выбираете имя класса в первом списке, обработчик события Listbox1Click вызывает процедуру ShowClass, чтобы отобразить информацию RTTI для этого класса во втором списке.
  3. Процедура ShowClass принимает два параметра: указатель на PTypeInfo и объект TStrings. Она использует эти параметры, чтобы получить и отобразить информацию RTTI для указанного класса.
  4. Когда вы выбираете элемент из второго списка, обработчик события ListBox2Click ищет этот элемент в первом списке. Если он найден, то вызывает процедуру ShowClass снова, чтобы отобразить информацию RTTI для этого класса.

Отображаемая информация RTTI включает имя класса, тип, размер и список свойств с их именами и типами данных.

Обратите внимание, что этот проект использует встроенные функции RTTI Delphi, которые являются частью библиотеки VCL. Тип PTypeInfo используется для представления указателя на структуру информации о типе, а процедура ShowClass использует различные функции из единицы TypInfo, чтобы получить и отобразить информацию RTTI.

Если вы хотите узнать больше о функциях RTTI Delphi или вам нужна помощь с их реализацией в вашем проекте, я готов помочь вам.

"Вывести информацию о классах" - это программный код на языке Pascal, который выводит информацию о классах в формате RTTI (Run-Time Type Information). Код содержит список из более 100 классов Delphi, которые добавляются в список listBox1.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:07:59/0.0069351196289062/1