Recommended Free Pascal Programmming Practices Read the first comment of each program. program RFPPP1; {FPC produces better code for String := ''; than for SetLength(String, 0);} uses uriparser; function foo(const URI: TURI): String; begin SetLength(Result, 0);//Add breakpoint at this line if Length(URI.Protocol) > 0 then Result := LowerCase(URI.Protocol) + ':'; end; function bar(const URI: TURI): String; begin Result := '';//Add breakpoint at this line if Length(URI.Protocol) > 0 then Result := LowerCase(URI.Protocol) + ':'; end; var u:TURI; begin u:=Default(TURI); writeln(foo(u)+bar(u)); end. program RFPPP2; {FPC produces better code for SetLength(String, SaneLength); than for String := copy(String, 1, SaneLength); Maximum value of SaneLength must be smaller or equal to the length of the String, including zero and negative values.} procedure foo(var Param:string; const SaneLength:integer); begin Param := copy(Param, 1, SaneLength);//Add breakpoint at this line end; procedure bar(var Param:string; const SaneLength:integer); begin SetLength(Param, SaneLength);//Add breakpoint at this line end; var Parameter:string; SLen:integer; begin SLen:=length(paramstr(0)); Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=1; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=0; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=-1; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); end. program RFPPP3; {FPC produces better code for SetLength(String, SaneValue-1); than for Delete(Param, SaneValue, MaxInt); Maximum value of SaneValue must be smaller or equal to the length of the String and the minimum value of SaneValue must be 1.} procedure foo(var Param:string; const SaneValue:integer); begin Delete(Param, SaneValue, MaxInt);//Add breakpoint at this line end; procedure bar(var Param:string; const SaneValue:integer); begin SetLength(Param, SaneValue-1);//Add breakpoint at this line end; var Parameter:string; SLen:integer; begin SLen:=length(paramstr(0))+1; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=1; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=0; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); SLen:=-1; Parameter:=paramstr(0); foo(Parameter,SLen); writeln(Parameter); Parameter:=paramstr(0); bar(Parameter,SLen); writeln(Parameter); end. program RFPPP4; {FPC produces better code for SetLength(String, Length(String)-1); than for Delete(Param, Length(String), 1);} procedure foo(var Param:string); begin Delete(Param, Length(Param), 1);//Add breakpoint at this line end; procedure bar(var Param:string); begin SetLength(Param, Length(Param)-1);//Add breakpoint at this line end; var Parameter1,Parameter2:string; last:boolean; begin Parameter1:=paramstr(0); Parameter2:=paramstr(0); writeln(Parameter1); writeln(Parameter2); repeat last:=(Parameter1=''); foo(Parameter1); bar(Parameter2); writeln(Parameter1); writeln(Parameter2); until last; writeln('====='); end.