Значение параметра по умолчанию для TSomething в Delphi - PullRequest
4 голосов
/ 20 сентября 2010

Я хотел бы знать, возможно ли это в Delphi (или есть ли обходной путь):

type
 TSomething = record
  X, Y : Integer;
 end;

GetSomething( x, y ) -> Возвращает запись с этими значениями.

... и у вас есть эта функция с TSomething в качестве параметра, и вы хотите установить ее по умолчанию как

function Foo( Something : TSomething = GetSomething( 1, 3 );

Компилятор выдает ошибку здесь, однако я не уверен, есть ли способ обойти это!

Можно ли это сделать?

Ответы [ 4 ]

10 голосов
/ 20 сентября 2010

Использовать перегрузку:

procedure Foo(const ASomething: TSomething); overload;
begin
  // do something with ASomething
end;

procedure Foo; overload;
begin
  Foo(GetSomething(1, 3));
end;
3 голосов
/ 20 сентября 2010

Самый простой способ - использовать перегруженные процедуры:

program TestOverloading;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSomething = record
    X,Y : integer;
  end;

const
  cDefaultSomething : TSomething = (X:100; Y:200);

procedure Foo(aSomething : TSomething); overload;
begin
  writeln('X:',aSomething.X);
  writeln('Y:',aSomething.Y);
end;

procedure Foo; overload;
begin
  Foo(cDefaultSomething);
end;

begin
  Foo;
  readln;
end.
3 голосов
/ 20 сентября 2010

Используйте класс вместо записи и что-то , как это сделает это:

TSomething = class
public 
  X: integer;
  Y: integer
end;

procedure Foo(Something: TSomething = nil);
begin
  if (Something = nil) then
    Something := GetSomething(1, 3);
  ...
end;
0 голосов
/ 21 мая 2013

Если вы используете указатель вместо типа записи, вы можете использовать nil в качестве значения по умолчанию:

type
  TSomething = record
    X, Y : Integer;
  end;

  PSomething = ^TSomething;

function Foo(Something: PSomething = nil);

На самом деле, передача указателей в качестве параметров, как правило, происходит быстрее, поскольку позволяет избежать копирования блоков памяти.1005 *

...