True C static local variable replacement?
There's no direct equivalent of a C static variable in Delphi.
A writeable typed constant (see user1092187's answer) is almost equivalent. It has the same scoping and instancing properties, but does not allow the one-time initialization that is possible with a C or C++ static variable. In any case it is my opinion that writeable typed constants should be shunned as a quaint historical footnote.
You can use a global variable.
var
dx: Integer;
dy: Integer
function UpdatePosition(x,y: Integer): Boolean;
begin
if (x+dx < 0) or (x+dx > 640) then
dx := -dx;
...
MoveObject(x+dx, y+dy);
...
end;
You have to do the one-time initialization in the initialization
section:
initialization
dx := Trunc( Power(-1, Random(2)) );
dy := Trunc( Power(-1, Random(2)) );
Of course this make a mess of the global namespace unlike the limited scope of a C static variable. In modern Delphi you can wrap it all up in a class and use a combination of class methods, class vars, class constructors to avoid polluting the global namespace.
type
TPosition = class
private class var
dx: Integer;
dy: Integer;
private
class constructor Create;
public
class function UpdatePosition(x,y: Integer): Boolean; static;
end;
class constructor TPosition.Create;
begin
dx := Trunc( Power(-1, Random(2)) );
dy := Trunc( Power(-1, Random(2)) );
end;
class function TPosition.UpdatePosition(x,y: Integer): Boolean;
begin
// your code
end;
Enable "Writable typed constants":
{$J+}
procedure abc;
const
II: Integer = 45;
begin
Inc(II);
ShowMessage(IntToStr(II));
end;
{$J-}
procedure TForm1.Button1Click(Sender: TObject);
begin
abc;
abc;
abc;
end;