Невведенный / параметры без типов в Delphi

Как какой тип параметры без типа в классе TStringStream:

function Read(var Buffer; Count: Longint): Longint; override;

Каков тип Буферного параметра (действительно ли это - тип Указателя?).

11
задан dan-gph 2 July 2013 в 08:18
поделиться

3 ответа

Несколько лет назад я написал статью на эту тему:

Что такое нетипизированный параметр?

Нетипизированные параметры используются в некоторых ситуациях; метод TStream.Read , о котором вы спрашиваете, наиболее точно соответствует процедуре Move , о которой я писал. Вот отрывок:

 процедура Move (const Source; var Dest; Count: Integer);

Процедура Move копирует данные из произвольной переменной. в любую другую переменную. Он должен принимать источники и назначения все типы, что означает, что он не может требовать какого-либо одного типа. Процедура не изменяет значение переменной, переданной для Источник , так что в объявлении параметра используется const вместо var , что является более распространенный модификатор для нетипизированных параметров.

В случае TStream.Read источником является содержимое потока, поэтому вы не передаете его в качестве параметра, а местом назначения является ] Параметр буфера , указанный в вопросе. Вы можете передать любой тип переменной для этого параметра, но это означает, что вам нужно быть осторожным. Это ваша задача, а не компилятор, чтобы убедиться, что содержимое потока действительно является допустимым значением для типа параметра, который вы предоставляете.

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

21
ответ дан 3 December 2019 в 04:32
поделиться

var в списке параметров - это синтаксис Delphi для вызова по ссылке . Его можно набрать как, например, параметр AllowChange в обработчике OnChanging в Listview:

procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
  if SomeProblemOccurred then
    AllowChange := False;
end;

или нетипизированный , как в вашем примере.

0
ответ дан 3 December 2019 в 04:32
поделиться

Обратитесь к справке Delphi для "Нетипизированных параметров"

Вы можете передать любой тип, но вы должны привести его в реализации. В справке указано, что вы не можете передать ему числовую или нетипизированную числовую константу. Итак, в основном вы должны знать, какого типа ожидать, а компилятор не может вам помочь, поэтому вам нужна веская причина, чтобы сделать это таким образом. Я полагаю, это может быть полезно, если вам нужен метод для обработки несовместимых типов, но, опять же, вы можете написать несколько перегруженных версий для каждого ожидаемого типа, я бы предложил это как лучшее решение.

3
ответ дан 3 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: