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

Получить список событий и их описание

Delphi , Компоненты и Классы , Свойства и События

Получить список событий и их описание



unit MethForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, TypInfo, ExtCtrls;

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

  procedure ShowMethod (pti: PTypeInfo; sList: TStrings);

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;
  ShowMethod (pti, ListBox2.Items);
end;

type
  TParamData = record
    Flags: TParamFlags;
    ParamName: ShortString;
    TypeName: ShortString;
    // beware: string length varies!!!
  end;
  PParamData = ^TParamData;

// show RTTI information for method pointers
procedure ShowMethod (pti: PTypeInfo; sList: TStrings);
var
  ptd: PTypeData;
  pParam: PParamData;
  nParam: Integer;
  Line: string;
  pTypeString, pReturnString: ^ShortString;
begin
  // protect against misuse
  if pti^.Kind <> tkMethod then
    raise Exception.Create ('Invalid type information');

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

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

  // 2: access the TTypeData structure
  sList.Add ('Method Kind: ' + GetEnumName (
    TypeInfo (TMethodKind),
    Integer (ptd^.MethodKind)));
  sList.Add ('Number of parameters: ' +
    IntToStr (ptd^.ParamCount));

  // 3: access to the ParamList
  // get the initial pointer and
  // reset the parameters counter
  pParam := PParamData (@(ptd^.ParamList));
  nParam := 1;
  // loop until all parameters are done
  while nParam <= ptd^.ParamCount do
  begin
    // read the information
    Line := 'Param ' + IntToStr (nParam) + ' > ';
    // add type of parameter
    if pfVar in pParam^.Flags then
      Line := Line + 'var ';
    if pfConst in pParam^.Flags then
      Line := Line + 'const ';
    if pfOut in pParam^.Flags then
      Line := Line + 'out ';
    // get the parameter name
    Line := Line + pParam^.ParamName + ': ';
    // one more type of parameter
    if pfArray in pParam^.Flags then
      Line := Line + ' array of ';
    // the type name string must be located...
    // moving a pointer past the params and
    // the string (including its size byte)
    pTypeString := Pointer (Integer (pParam) +
      sizeof (TParamFlags) +
      Length (pParam^.ParamName) + 1);
    // add the type name
    Line := Line + pTypeString^;
    // finally, output the string
    sList.Add (Line);
    // move the pointer to the next structure,
    // past the two strings (including size byte)
    pParam := PParamData (Integer (pParam) +
      sizeof (TParamFlags) +
      Length (pParam^.ParamName) + 1 +
      Length (pTypeString^) + 1);
    // increase the parameters counter
    Inc (nParam);
  end;
  // show the return type if a function
  if ptd^.MethodKind = mkFunction then
  begin
    // at the end, instead of a param data,
    // there is the return string
    pReturnString := Pointer (pParam);
    sList.Add ('Returns > ' + pReturnString^);
  end;
end;

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddType (TypeInfo (TNotifyEvent));
  AddType (TypeInfo (TFindMethodEvent));
  AddType (TypeInfo (THelpEvent));
  AddType (TypeInfo (TSetNameEvent));
  AddType (TypeInfo (TDragDropEvent));
  AddType (TypeInfo (TDrawItemEvent));
  AddType (TypeInfo (TMeasureItemEvent));
  AddType (TypeInfo (TScrollEvent));
  AddType (TypeInfo (TDragOverEvent));
  AddType (TypeInfo (TEndDragEvent));
  AddType (TypeInfo (TKeyEvent));
  AddType (TypeInfo (TKeyPressEvent));
  AddType (TypeInfo (TMouseEvent));
  AddType (TypeInfo (TMouseMoveEvent));
  AddType (TypeInfo (TStartDragEvent));
  AddType (TypeInfo (TCloseEvent));
  AddType (TypeInfo (TCloseQueryEvent));
  AddType (TypeInfo (TExceptionEvent));
  AddType (TypeInfo (TIdleEvent));
  AddType (TypeInfo (TMessageEvent));
  AddType (TypeInfo (TShowHintEvent));
end;

end.

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

Программа на Delphi, которая отображает информацию о событиях и их описаниях в приложении GUI.

Вот разбивка кода:

Unit MethForm

  • Единица определяет форму (TForm1) с двумя списками (Listbox1 и ListBox2) и разделителем (Splitter1).
  • Форма имеет три процедуры:
    • Listbox1Click: Когда выбирается элемент в Listbox1, эта процедура получает соответствующую информацию о типе с помощью RTTI (Run-Time Type Information) и отображает ее в ListBox2.
    • FormCreate: Эта процедура инициализирует форму, добавляя некоторые типы событий в Listbox1 с помощью процедуры AddType.
    • AddType: Эта процедура добавляет объект информации о типе в Listbox1.

Процедура ShowMethod

  • Эта процедура принимает два параметра: pti, который является указателем на объект информации о типе, и sList, которая является строковым списком, который будет хранить информацию для отображения.
  • Процедура проверяет, является ли объект информации о типе валидным (т.е., это метод) и затем получает соответствующую структуру TTypeData с помощью RTTI.
  • Она отображает различные сведения о методе, включая его имя, вид, количество параметров и типы параметров.

Процедура TForm1.Listbox1Click

  • Эта процедура вызывается, когда выбирается элемент в Listbox1.
  • Она получает объект информации о типе, связанный с выбранным элементом, и вызывает процедуру ShowMethod, чтобы отобразить его детали в ListBox2.

Процедура TForm1.FormCreate

  • Эта процедура инициализирует форму, добавляя некоторые типы событий в Listbox1 с помощью процедуры AddType.

Программа демонстрирует использование RTTI для доступа к информации о встроенных событиях Delphi, таких как TNotifyEvent, TFindMethodEvent и другие. Вывод будет отображать имя, вид (метод или свойство), количество параметров и типы параметров для каждого типа события. Чтобы запустить это проект, просто откройте файл .dpr в Delphi и нажмите кнопку "Выполнить" или нажмите F9. Форма будет появляться с списком типов событий. Выберите элемент из списка, чтобы отобразить его детали во втором списке.

Получение списка событий и их описания в Delphi при помощи RTTI.


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

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




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


:: Главная :: Свойства и События ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:10:45/0.02515697479248/1