Недавно добавленные исходники

•  TDictionary Custom Sort  538

•  Fast Watermark Sources  904

•  3D Designer  1 830

•  Sik Screen Capture  1 478

•  Patch Maker  1 486

•  Айболит (remote control)  1 410

•  ListBox Drag & Drop  1 177

•  Доска для игры Реверси  21 940

•  Графические эффекты  1 357

•  Рисование по маске  1 297

•  Перетаскивание изображений  1 096

•  Canvas Drawing  971

•  Рисование Луны  814

•  Поворот изображения  771

•  Рисование стержней  815

•  Paint on Shape  493

•  Генератор кроссвордов  762

•  Головоломка Paletto  667

•  Теорема Монжа об окружностях  855

•  Пазл Numbrix  619

•  Заборы и коммивояжеры  850

•  Игра HIP  557

•  Игра Go (Го)  527

•  Симулятор лифта  549

•  Программа укладки плитки  509

•  Генератор лабиринта  565

•  Проверка числового ввода  524

•  HEX View  600

•  Физический маятник  528

•  Задача коммивояжера  560

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Пользовательские варианты



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

Чтобы познакомиться со свойствами новых вариантов, воспользуемся одним из них - вариантом, способным хранить комплексные числа, преобразовывать их в другие типы и осуществлять над ними нужные действия. Как мы увидим дальше, создание пользовательского варианта может быть весьма трудоемким делом - все зависит от сложности хранимых в нем данных. Мы воспользуемся вариантом, созданным разработчиками Delphi и включенным в модуль VarCmplx.

Создайте такой обработчик bbRunClick:

uses VarCmplx; // Эта ссылка обязательна!

procedure TfmExample.bbRunClick(Sender: TObject);
var
  VI, V2: Variants - begin
  // Создаем два случайных комплексных числа:
  VI := VarComplexCreate(Trunc(Random * 1000) / 100,
    Trunc(Random * 1000) / 100);
  V2 := VarComplexCreate(Trunc(Random * 1000) / 100,
    Trunc(Random * 1000) / 100);
  with mmOutput.Lines do
  begin
    // Пустая строка-разделитель
    Add(' ');
    Add('1-e число: '#09 + V1);
    Add('2-е число: '#9 + V2);
    Add('Сложение'#9 + (V1 + V2));
    Add('Вычитание'#9 + (V1 - V2));
    Add('Умножение'#09 + (VI * V2));
    Add('Деление'#9#9 + (V1 / V2))
  end
end;

Небольшой комментарий: сложная конструкция Trunc (Random*1000) /100 понадобилась только для того, чтобы реальные и мнимые части комплексных чисел содержали по три значащих цифры.

Как видим, новый вариант легко справляется с поддержкой комплексных чисел: функция VarComplexCreate создает вариант, содержащий комплексное число, а дальнейшее поведение варианта -стандартное (он поддерживает математические операции и преобразование к строковому типу). Однако эта легкость обманчива: исходный текст модуля VarCmplx, который, собственно, и придал варианту дополнительные свойства (по умолчанию располагается в файле Source\Rtl\Common\VarCmplx.pas), содержит более 30000 байт..

Структура записи TVarData. Два первых байта в этой записи (поле VType) хранят признак значения варианта, остальные 14 могут использоваться для размещения данных.

Создание пользовательского варианта проходит в три этапа.

  1. Сначала в записи rvarData размещаются новые данные или ссылка на них.
  2. Объявляется класс, который является прямым или косвеннымпотомком специального класса TCustomVariantType. В этомклассе предусматриваются все необходимые методы для реализации свойств варианта: присваивания ему новых значений, преобразования хранящихся значений к другим типам, выполнения необходимых математических действий.
  3. Создаются вспомогательные методы для объявления потомков нового класса и определения их типов.

В результате перечисленных шагов вы получаете полноценный вариант, обогащенный новыми свойствами: он может хранить не только те значения, которые перечислены в табл. 10.2, но и любые другие, в том числе свойства и методы! (В этом последнем случае наследником для исполняемого класса нового варианта вместо TCustomVariantType является TInvokeableVariantType или TPublishableVariantType.)








Copyright © 2004-2022 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте   Facebook   Ссылка на Twitter   Ссылка на Telegram