Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



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


 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.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS