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

Вывести информацию о возможных значениях свойств

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



Автор: Xavier Pacheco

unit MainFrm;

interface

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

type
  TMainForm = class(TForm)
    lbSamps: TListBox;
    memInfo: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure lbSampsClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
uses TypInfo, Buttons;

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  // Add some example enumerated types
  with lbSamps.Items do
  begin
    AddObject('TBorderIcons', TypeInfo(TBorderIcons));
    AddObject('TGridOptions', TypeInfo(TGridOptions));
  end;
end;

procedure GetTypeInfoForOrdinal(AOrdTypeInfo: PTypeInfo; AStrings: TStrings);
var
  //  OrdTypeInfo: PTypeInfo;
  OrdTypeData: PTypeData;

  TypeNameStr: string;
  TypeKindStr: string;
  MinVal, MaxVal: Integer;
  i: integer;
begin

  // Get the TTypeData pointer
  OrdTypeData := GetTypeData(AOrdTypeInfo);

  // Get the type name string
  TypeNameStr := AOrdTypeInfo.Name;
  // Get the type kind string
  TypeKindStr := GetEnumName(TypeInfo(TTypeKind), Integer(AOrdTypeInfo^.Kind));

  // Get the minimum and maximum values for the type
  MinVal := OrdTypeData^.MinValue;
  MaxVal := OrdTypeData^.MaxValue;

  // Add the information to the memo
  with AStrings do
  begin
    Add('Type Name: ' + TypeNameStr);
    Add('Type Kind: ' + TypeKindStr);

    // Call this function recursively to show the enumeration
    // values for this set type.
    if AOrdTypeInfo^.Kind = tkSet then
    begin
      Add('==========');
      Add('');
      GetTypeInfoForOrdinal(OrdTypeData^.CompType^, AStrings);
    end;

    // Show the values and names of the enumerated types belonging to the
    // set.
    if AOrdTypeInfo^.Kind = tkEnumeration then
    begin
      Add('Min Val: ' + IntToStr(MinVal));
      Add('Max Val: ' + IntToStr(MaxVal));

      for i := MinVal to MaxVal do
        Add(Format('  Value: %d   Name: %s', [i, GetEnumName(AOrdTypeInfo,
          i)]));
    end;
  end;

end;

procedure TMainForm.lbSampsClick(Sender: TObject);
begin
  memInfo.Lines.Clear;
  with lbSamps do
    GetTypeInfoForOrdinal(PTypeInfo(Items.Objects[ItemIndex]), memInfo.Lines);
end;
end.

Here's the translation of the provided Delphi code into Russian:

Код на языке Delphi предназначен для отображения информации о возможных значениях свойств для заданного типизированного типа.

Обзор кода:

  1. Определен класс TMainForm, содержащий список (lbSamps) и компонент мемо (memInfo).
  2. В процедуре FormCreate добавляются примеры типизированных типов в список.
  3. Когда пользователь выбирает элемент из списка, вызывается процедура lbSampsClick. Эта процедура очищает любые предыдущие содержимое компонента мемо и затем вызывает функцию GetTypeInfoForOrdinal с информацией о выбранном типе и строками компонента мемо как параметрами.

Функция GetTypeInfoForOrdinal принимает указатель на информацию о типе (AOrdTypeInfo) и строковый список (AStrings). Она использует эту информацию для сбора деталей о типе, таких как его имя, вид (enum или set) и диапазон значений. Для типизированных типов она также отображает имена каждого значения в этом диапазоне.

Модификации кода:

  1. Вместо использования lbSamps.Items в нескольких местах, рекомендуется создать отдельную переменную для этого списка, чтобы улучшить читаемость.
  2. В функции GetTypeInfoForOrdinal, вместо ручного конкатенации строк с помощью Add, используйте метод Append, предоставляемый типом TStrings.

Пример рефакторинга кода:

procedure TMainForm.GetTypeInfoForOrdinal(AOrdTypeInfo: PTypeInfo; AStrings: TStrings);
var
  OrdTypeData: PTypeData;
  TypeNameStr, TypeKindStr: string;
  MinVal, MaxVal: Integer;
  i: integer;
begin
   // Получение указателя на TTypeData
  OrdTypeData := GetTypeData(AOrdTypeInfo);

   // Получение строки имени типа
  TypeNameStr := AOrdTypeInfo.Name;

   // Получение строки вида типа
  TypeKindStr := GetEnumName(TypeInfo(TTypeKind), Integer(AOrdTypeInfo^.Kind));

   // Получение минимального и максимального значений для типа
  MinVal := OrdTypeData^.MinValue;
  MaxVal := OrdTypeData^.MaxValue;

   // Добавление информации в мемо
  AStrings.Append('Type Name: ' + TypeNameStr);
  AStrings.Append('Type Kind: ' + TypeKindStr);

  if AOrdTypeInfo^.Kind = tkSet then
  begin
    AStrings.Append('==========');
    AStrings.Append('');
    GetTypeInfoForOrdinal(OrdTypeData^.CompType^, AStrings);
  end
  else if AOrdTypeInfo^.Kind = tkEnumeration then
  begin
    AStrings.Append('Min Val: ' + IntToStr(MinVal));
    AStrings.Append('Max Val: ' + IntToStr(MaxVal));

    for i := MinVal to MaxVal do
      AStrings.Append(Format('  Value: %d   Name: %s', [i, GetEnumName(AOrdTypeInfo, i)]));
  end;
end;

procedure TMainForm.lbSampsClick(Sender: TObject);
begin
  memInfo.Lines.Clear;
  with lbSamps do
    if ItemIndex <> -1 then
      GetTypeInfoForOrdinal(PTypeInfo(Items.Objects[ItemIndex]), memInfo.Lines)
    else
      memInfo.Lines.Append('Пожалуйста, выберите тип');
end;

В процедуре lbSampsClick добавлен проверка, чтобы увидеть, был ли выбран элемент перед вызовом GetTypeInfoForOrdinal. Если не выбран элемент, отображается сообщение в компоненте мемо.

В статье описана программа на языке Delphi, которая выводит информацию о возможных значениях свойств типов данных и их характеристиках.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:14:45/0.0035710334777832/0