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

•  TDictionary Custom Sort  3 227

•  Fast Watermark Sources  2 993

•  3D Designer  4 752

•  Sik Screen Capture  3 260

•  Patch Maker  3 469

•  Айболит (remote control)  3 530

•  ListBox Drag & Drop  2 907

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

•  Графические эффекты  3 844

•  Рисование по маске  3 172

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

•  Canvas Drawing  2 674

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

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

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

•  Paint on Shape  1 526

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

•  Головоломка Paletto  1 731

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

•  Пазл Numbrix  1 649

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

•  Игра HIP  1 262

•  Игра Go (Го)  1 201

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

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

•  Генератор лабиринта  1 512

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

•  HEX View  1 466

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

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

 
скрыть


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

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



Delphi Sources

Пример переменного количества параметров




program VarPar;

{ Простая программа, демонстрирующая пример использования переменного

числа параметров заданного типа в Delphi.

Создано в марте 1995, автор Hallvard Vassbotn
hallvard@falcon.no
}

uses WinCrt, SysUtils;

{ предопределения в System:
const

vtInteger  = 0;
vtBoolean  = 1;
vtChar     = 2;
vtExtended = 3;
vtString   = 4;
vtPointer  = 5;
vtPChar    = 6;
vtObject   = 7;
vtClass    = 8;

type
TVarRec = record
case Integer of
vtInteger:  (VInteger: Longint; VType: Byte);
vtBoolean:  (VBoolean: Boolean);
vtChar:     (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString:   (VString: PString);
vtPointer:  (VPointer: Pointer);
vtPChar:    (VPChar: PChar);
vtObject:   (VObject: TObject);
vtClass:    (VClass: TClass);
end;
}

const

  TypeNames: array[vtInteger..vtClass] of PChar =
  ('Integer', 'Boolean', 'Char', 'Extended', 'String',
    'Pointer', 'PChar', 'Object', 'Class');

  {
  Согласно on-line документации (поиск по слову TVarRec), массив параметров
  array of const интерпретируется компилятором подобно массиву array of TVarRec.
  Данный пример будет работать подобно тому, как если бы вы изменили
  объявление TestMultiPar на:

  procedure TestMultiPar(const Args: array of TVarRec);

  Вы можете сделать реализацию обычного "очистителя" (без объявления
  переменных), но интерфейс был бы менее понятным пользователям данного
  модуля.

  Компилятор видит параметры и формирует массив непосредственно в
  стеке. Для каждого элемента массива также устанавливается поле
  VType с одной из предопределенных констант vtXXXX. Фактически
  значение всегда передается в виде четыре байта информации. Для
  типов Boolean и Char полезную информацию содержит только первый
  байт.

  Теперь вы можете писать все те же хорошие программы, но вдобавок
  поддерживающие переменное количество параметров с проверкой типов!
  }

function PtrToHex(P: pointer): string;
begin

  Result := IntToHex(Seg(P^), 4) + ':' + IntToHex(Ofs(P^), 4);
end;

procedure TestMultiPar(const Args: array of const);
var

  ArgsTyped: array[0..$FFF0 div sizeof(TVarRec)] of TVarRec absolute Args;
  i: integer;
begin

  for i := Low(Args) to High(Args) do
    with ArgsTyped[i] do
    begin
      Write('Args[', i, '] : ', TypeNames[VType], ' = ');
      case VType of
        vtInteger: writeln(VInteger);
        vtBoolean: writeln(VBoolean);
        vtChar: writeln(VChar);
        vtExtended: writeln(VExtended^: 0: 4);
        vtString: writeln(VString^);
        vtPointer: writeln(PtrToHex(VPointer));
        vtPChar: writeln(VPChar);
        vtObject: writeln(PtrToHex(Pointer(VObject)));
        vtClass: writeln(PtrToHex(Pointer(VClass)));
      end;
    end;
end;

var

  MyObj: TObject;
begin

  Writeln('Проверка выполнения функции с переменным количеством параметров и проверкой типов:');
  MyObj := TObject.Create;
  TestMultiPar([123, 45.67, PChar('ASCIIZ'), 'Здравствуй, мир!', true, 'X',
    @ShortDayNames, TObject, MyObj]);
  MyObj.Free;

  { Для того, чтобы обеспечить предварительную проверку типа при передаче параметров,
  попробуйте следующее: }
  writeln(Format('%d', ['привет']));
  { Переданный параметр не является ожидаемым типом. Строка формата '%d'
  говорит о том, что параметр должен быть целой величиной, но вместо этого мы передаем
  строку. Во время выполнения это вызовет исключительную ситуацию, и если вы не организовали
  ловушку для объектов исключения, то Delphi выведет вам строку с описанием ошибки.
  Использование функции C-типа sprintf в этом случае может привести к непредсказуемым
  последствиям (читай: крах системы, GP и все что угодно) }
end.





Похожие по теме исходники

Примеры работы с БД

Примеры оформления DBGrid

Пример использования DBGrid




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

Группа ВКонтакте