Delphi - Call procedure with additional VAR parameters?

Delphi 2010 - I have a routine that takes a string and processes it. There are 3 different types of processing, and I may need any combination, including all three processing methods. I am trying to determine what to name my routine, but everything I try causes problems. What I want to do is call a procedure like this ...

StringProcess(StartString1, VarProcess1, VarProcess2, VarProcess3);

but it would be just as easy, I want only 2 processes

StringProcess(StartString1, '', VarProcess2, VarProcess3);

A procedure definition is something like

procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string);

So, in a nutshell ... How do I define my procedure for returning between 1 and 3 VAR variables? Delphi wants me to always go through 3 variables, and I just need to ignore one if I don't need it. Is there a way to pass "non-existent" VAR parameters and just ignore them as needed?

thank

+4
3

, rountine StringProcess S1, S2 S3 , . , , .

- :

type
  TStringData = record
    S1, S2, S3: string;
  end;

procedure StringProcess(StartString: string; var StringData: TStringData);

. , S1, S2 S3 StringProcess. , out. :

function StringProcess(StartString: string): TStringData;
+9

A var , . , :

procedure StringProcess(StartString: string; S1:PString; S2:Pstring; S3:Pstring);
begin
  ...
  if S1 <> nil then
  begin
    // Use S1^ as needed...
  end;
  ...
end;

:

StringProcess(StartString1, @VarProcess1, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, @VarProcess2, @VarProcess3);
StringProcess(StartString1, nil, nil, @VarProcess3);
StringProcess(StartString1, @VarProcess1, nil, @VarProcess3);
...
+8
Parameters

var may not be optional. The solution would be to define overloads for the function:

procedure StringProcess(StartString: string; var S1:String); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string); overload;
procedure StringProcess(StartString: string; var S1:String; var S2:string; var S3:string); overload;

You can implement overloads as follows:

procedure StringProcess(StartString: string; var S1:String); overload;
var
  S2, S3: String;
begin
  StringProcess(StartString, S1, S2, S3);
end;

Overloading with a single process simply causes overloading with most processes and uses dummy variables to capture output.

+1
source

Source: https://habr.com/ru/post/1541621/


All Articles