Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 26

стр.

>(P1, P2 : Integer) : Integer;

> MyFuncRetBool : Function (P1, P2 : Integer) : LongBool;

> MyFuncRetPointer : Function (P1, P2 : Integer) : Pointer;

> function MyFuncRetAnything (P1, P2 : Integer) : Integer;

>var

> RetPointer : Pointer;

> RetBool : LongBool;

> RetInteger : Integer;

>begin

> RetPointer := nil;

> RetBool := False;

> RetInteger := 4711;

case P1 of

>1 : Result := Integer (RetPointer);

> 2 : Result := Integer (RetBool);

> 3 : Result := RetInteger;

end;

>end;


>procedure TForm1.Button1Click(Sender: TObject);

>begin

> if MyFuncRetBool (2, 1900) then Label1.Caption := 'True'

else Label1.Caption := 'False';

> Label2.Caption := IntToStr(MyFuncRetInt(3, 1900));

> Label3.Caption := IntToHex(Integer(MyFuncRetPointer(1, 1900)), 16);

>end;


>initialization

> MyFuncRetInt := @MyFuncRetAnything;

> MyFuncRetBool := @MyFuncRetAnything;

> MyFuncRetPointer := @MyFuncRetAnything;

>end. 

Преобразование формата MS BINARY в IEEE

Delphi 1

«Использование, независимое от машинного уровня» не так просто в реализации с процессорами, выпущенными до Intel-го математического сопроцессора 80x87. Я не уверен в том, что процессоры 80x86 имели какие-либо родные инструкции для выполнения операций с плавающей точкой. По-видимости, поэтому Microsoft создал свой собственный формат для чисел с плавающей точкой; он сам осуществлял всю арифметику с помощью библиотеки времени выполнения. Сегодня 80x87 осуществляет такую арифметику автоматически, и IEEE теперь стандарт.

Delphi хранит следующие типы чисел с плавающей точкой в формате IEEE:

Single4 байт
Double8 байт
Extended10 байт

Обратите внимание на то, что тип Real (6 байт) отсутствует в данном списке. Я могу ошибаться, но мне кажется что тип Real – синтезированный в Pascal тип; он может без особых проблем существовать на процессорах ниже 80x87.

[В сторону: электронная справка Delphi сообщает, что по умолчанию (через директиву компилятора $N+), компилятор будет генерировать код для выполнения ВСЕХ операций с плавающей точкой, используя инструкции 80x87, включая тип Real. Также, для работы с типом Real, компилятор генерирует вызовы библиотеки времени выполнения, или же я полностью неправ в вышесказанном! :) ]

Во всяком случае, в электронной справке Visual Basic я увидел, что VB оперирует с типами данных Single и Double, которые также относятся к типу IEEE, и идентичны Delphi-типам Single и Double. Тем не менее, в справке отсутствует упоминание «Microsoft Binary Format».

Для того, чтобы разобраться в вопросе, я «опустился» до DOS и запустил QBasic, новую версию интерпретатора Microsoft QuickBasic, включаемую теперь в поставку DOS. Если мы посмотрим в электронную справку, то увидим следующее:

MKSMBF$ и MKDMBF$ преобразуют числа формата IEEE в «числовые строки» формата Microsoft-Binary, которые могут храниться в строковых переменных типа FIELD. CVSMBF и CVDMBF преобразуют эти строки обратно в числа формата IEEE.

>MKSMBF$(выражение-единичной-точности!)

>MKDMBF$(выражение-двойной-точности#)

>CVSMBF (4-байтовая-числовая-строка)

>CVDMBF (8-байтовая-числовая-строка)

ФункцияВозвращаемое значение
MKSMBF$4-байтовая строка, содержащая число в формате Microsoft-Binary-format
MKDMBF$8-байтовая строка, содержащая число в формате Microsoft-Binary-format
CVSMBFЧисло единичной точности в формате IEEE
CVDMBFЧисло двойной точности в формате IEEE

Эти функции могут оказаться полезными при поддержке файлов данных, созданных с помощью старых версий Basic.

Суммируя вышесказанное, можно дать 3 рекомендации для получения доступа к вашим «MetaStock»-файлам:

1. Напишите вашу программу в QBasic/DOS

2. Найдите замену (с учетом совместимости с Delphi) для функций преобразований, упомянутых выше.

3. Напишите эти функции сами. Вы должны найти документацию для старых типов Single и Double, применявшихся в «Microsoft Binary Format», возможно в справочных файлах старых версий MS Basic.

Переменные 

Статические переменные

Delphi 1 

Да, это работает. Объявите переменную в секции const, например:

>procedure p;

>const MyVariable : Integer = 0;

>begin

> Inc(MyVariable);

>end;

В нашем примере переменная MyVariable содержит количество вызовов P.

Тем не менее, это лучшее решение, чем использование взамен какого-либо поля объекта (если это возможно).