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

Вариантные типы

Delphi , Синтаксис , Типы и Переменные

Вариантные типы

unit VariaF;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ListBox1: TListBox;
    BtnCreate: TButton;
    BtnClear: TButton;
    BtnConvert: TButton;
    procedure BtnClearClick(Sender: TObject);
    procedure BtnConvertClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BtnCreateClick(Sender: TObject);
  private
    Variant1: Variant;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  ComObj;

function VarTypeToString(VType: Integer): string;
begin
  case VType of
    varEmpty: Result := 'varEmpty';
    varNull: Result := 'varNull';
    varSmallint: Result := 'varSmallint';
    varInteger: Result := 'varInteger';
    varSingle: Result := 'varSingle';
    varDouble: Result := 'varDouble';
    varCurrency: Result := 'varCurrency';
    varDate: Result := 'varDate';
    varOleStr: Result := 'varOleStr';
    varDispatch: Result := 'varDispatch';
    varError: Result := 'varError';
    varBoolean: Result := 'varBoolean';
    varVariant: Result := 'varVariant';
    varUnknown: Result := 'varUnknown';
    varByte: Result := 'varByte';
    varString: Result := 'varString';
    varTypeMask: Result := 'varTypeMask';
    varArray: Result := 'varArray';
    varByRef: Result := 'varByRef';
  else
    Result := 'Error: Undefined variant type';
  end;
end;

procedure ShowVariantInfo(V: Variant; Str: TStrings);
begin
  Str.Clear;
  Str.Add('Var type: ' +
    VarTypeToString(VarType(V)));
  if VarIsArray(V) then
    Str.Add('Is an array');
  if VarIsEmpty(V) then
    Str.Add('Empty variant');
  if VarIsNull(V) then
    Str.Add('Null variant');
  // protect conversion methods and show default strings
  try
    Str.Add('String value: ' + VarToStr(V));
  except
    on EVariantError do
      Str.Add('String value: <Undefined>');
  end;
  try
    Str.Add('Numeric value: ' + FloatToStr(V));
  except
    on EVariantError do
      Str.Add('Numeric value: <Undefined>');
  end;
end;

procedure TForm1.BtnClearClick(Sender: TObject);
begin
  VarClear(Variant1);
  ShowVariantInfo(Variant1, Memo1.Lines);
end;

procedure TForm1.BtnConvertClick(Sender: TObject);
var
  VType: Integer;
begin
  VType := Integer(
    ListBox1.Items.Objects[ListBox1.ItemIndex]);
  try
    Variant1 := VarAsType(Variant1, VType);
    ShowVariantInfo(Variant1, Memo1.Lines);
  except
    on EVariantError do
      ShowMessage('Conversion not supported');
  end;
end;

const
  VarList: array[1..10] of Integer =
  (varSmallint, varInteger, varSingle, varDouble,
    varCurrency, varDate, varOleStr, varDispatch,
    varBoolean, varString);

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  // fill the list with variant type constants
  // (their description and their value)
  for I := 1 to High(VarList) do
    ListBox1.Items.AddObject(
      VarTypeToString(VarList[I]),
      TObject(VarList[I]));
  // select the first item
  ListBox1.ItemIndex := 0;
  ShowVariantInfo(Variant1, Memo1.Lines);
end;

procedure TForm1.BtnCreateClick(Sender: TObject);
var
  VType: Integer;
begin
  VType := Integer(
    ListBox1.Items.Objects[ListBox1.ItemIndex]);
  case VType of
    varSmallint: Variant1 := VarAsType(
        10, varSmallint);
    varInteger: Variant1 := Integer(1000);
    varSingle: Variant1 :=
      VarAsType(1.1, varSingle);
    varDouble: Variant1 := Sqrt(1000.01);
    varCurrency: Variant1 := 100.01;
    varDate: Variant1 := Now;
    varOleStr: Variant1 :=
      VarAsType('Hello', VarOleStr);
    varDispatch: Variant1 :=
      CreateOleObject('Word.Basic');
    varBoolean: Variant1 := WordBool(True);
    varString: Variant1 := 'Delphi';
  end;
  ShowVariantInfo(Variant1, Memo1.Lines);
end;

end.

Программное приложение на Delphi, демонстрирующее работу с вариантами и их типами. Приложение имеет четыре кнопки:

  • BtnCreate: Создает новый вариант и присваивает ему значение в зависимости от выбранного типа.
  • BtnClear: Очищает вариант и показывает его информацию.
  • BtnConvert: Преобразует тип варианта в выбранный из списка.
  • BtnClearClick и BtnConvertClick: Процедуры, которые показывают информацию о варианте после очистки или преобразования.

Рассмотрим, как работает каждая кнопка:

  1. BtnCreateClick: Создает новый вариант на основе выбранного типа из списка и присваивает ему значение. Например, если выбрать "varSmallint", то создаст маленький целочисленный вариант с значением 10.
  2. BtnClearClick: Очищает вариант с помощью функции VarClear и показывает его информацию в компоненте memo.
  3. BtnConvertClick: Преобразует тип варианта в выбранный из списка. Например, если выбрать "varDouble", то преобразует маленький целочисленный вариант с значением 10 в двойное точное число.

Далее приведены некоторые советы для улучшения этого кода:

  • Добавьте более надежные методы проверки и обработки ошибок, например, проверку на null или пустоту перед доступом к свойствам варианта.
  • Добавьте больше вариантов преобразования, таких как преобразование между различными типами чисел или датами.
  • Рассмотрите использование более robust метода отображения информации о варианте, например, с помощью контрола grid вместо memo.
  • Улучшите пользовательский интерфейс, добавив больше меток и подсказок для каждой кнопки.

Вот альтернативное решение, демонстрирующее, как можно работать с вариантами:

procedure TForm1.BtnConvertClick(Sender: TObject);
var
  VType: Integer;
begin
  VType := VarType(Variant1);

  if VType in [varSmallint, varInteger, varSingle, varDouble] then
    Begin
      Variant1 := VarAsType(10.0, VType); // Преобразовать вариант в двойное точное число
    End
  Else if VType = varString then
    Begin
      Variant1 := 'Hello World!'; // Преобразовать вариант в строку
    End;
  ShowVariantInfo(Variant1, Memo1.Lines);
end;

procedure TForm1.BtnCreateClick(Sender: TObject);
var
  VType: Integer;
begin
  VType := Integer(ListBox1.Items.Objects[ListBox1.ItemIndex]);

  case VType of
    varSmallint:
      Variant1 := VarAsType(10, varSmallint);
    varInteger:
      Variant1 := 1000;
    varSingle:
      Variant1 := VarAsType(1.1, varSingle);
    varDouble:
      Variant1 := Sqrt(1000.01);
    varCurrency:
      Variant1 := 100.01;
    varDate:
      Variant1 := Now;
    varOleStr:
      Variant1 := VarAsType('Hello', VarOleStr);
    varDispatch:
      Variant1 := CreateOleObject('Word.Application');
    varBoolean:
      Variant1 := True;
    varString:
      Variant1 := 'Delphi';
  End;

  ShowVariantInfo(Variant1, Memo1.Lines);
end;

В этом коде демонстрируется преобразование типа варианта с помощью функции VarAsType и присваивание значений вариантам в зависимости от их типов.

В статье рассмотрен пример программирования на языке Delphi, где демонстрируется использование вариантных типов и различных методов для работы с ними.


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

Получайте свежие новости и обновления по 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 14:20:11/0.0061149597167969/1