Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使过程更改变量参数的值?_Delphi_Delphi 2010 - Fatal编程技术网

Delphi 如何使过程更改变量参数的值?

Delphi 如何使过程更改变量参数的值?,delphi,delphi-2010,Delphi,Delphi 2010,我尝试制作一个简单的程序,从输入的字符串中删除空格: procedure RemoveSpaces(StringParameter : String); var SpacePosition: Integer; begin SpacePosition := Pos(' ',StringParameter); while SpacePos <> 0 do begin Delete(StringParameter,SpacePos,1); S

我尝试制作一个简单的程序,从输入的字符串中删除空格:

procedure RemoveSpaces(StringParameter : String);
var
   SpacePosition: Integer;
begin
   SpacePosition := Pos(' ',StringParameter);
   while SpacePos <> 0 do
   begin
      Delete(StringParameter,SpacePos,1);
      SpacePosition := Pos(' ',StringParameter);
   end;
end;
很明显,输入变量只是简单地从程序中倒出,就好像它从未改变过一样

我想这可能只是对我所能使用的程序的一些限制,我还没有意识到,但是我记得我以前做过一个程序,它接受一个StringList参数,按字母顺序对StringList中的字符串排序,并保存对StringList变量参数的更改:

var
   myStringList : TStringList;

implementation

procedure StringListSort(StringList : TStringList);
begin
   //Sort StringList
end;

procedure TFormName.ButtonNameClick(Sender: TObject);
begin
   StringListSort(myStringList);
end; 
我欢迎任何解决我问题的办法

procedure RemoveSpaces(StringParameter: string);
您正在按值传递字符串参数。语义1,对传递的参数进行复制,并对该副本进行任何修改。调用者没有观察到修改

您需要通过引用传递参数。通过引用传递时,该过程对原始变量而不是副本进行操作

在Pascal和Delphi中。改变

您观察到
TStringList
参数的不同行为的原因是
TStringList
是一个引用类型的类。这意味着给定的
List:TStringList
List
是对对象的引用。有关值类型和引用类型之间区别的更多讨论,请参见我的回答:

政府对此有以下看法:

类类型的变量实际上是引用对象的指针。因此,多个变量可以引用同一对象。与其他指针一样,类类型变量可以保存值
nil
。但是您不必显式地取消引用类类型变量来访问它所指向的对象。例如,
SomeObject.Size:=100
将值
100
分配给
SomeObject
引用的对象的
Size
属性;您不会将其写为
SomeObject^。大小:=100

这里的文档更明确地说明了这样一个事实:类类型变量实际上只是指针

通过使用RTL函数,您可以更高效、更简单地实施您的过程:

我还要指出,函数可能是一个更好的选择。这使您可以灵活地传递变量以外的内容,例如文字或常量。您还可以更轻松地组合和链接函数

所以这就是

function SpacesRemoved(const str: string): string;
begin
  Result := StringReplace(str, ' ', '', [rfReplaceAll]);
end;
然后就不用写了:

RemoveSpaces(Input);
Writeln(Input);
你可以写

Writeln(SpacesRemoved(Input));

1我之所以这么说是因为
字符串
是一种引用类型,尽管是一种特殊类型。区别在于,如果多个变量引用同一个字符串对象,则在进行修改时,字符串将复制到新对象,修改变量将被赋予唯一的引用。这称为写时复制,其作用是使
字符串
数据类型的行为类似于值类型

我的手机拍了这个CW,啊,我想你有足够的代表,你不会真的错过这些投票…;)@DavidM我更想解释为什么这是CW,以防有人想知道我为什么这么做。它是我的,它是我的手机!诚然,@DavidHeffernan是一个伟大的开发者,但他在手机上编码吗?哥们,这是硬核。@Gixabel只在堆栈上,只用于简短的回答和编辑,并且只在带有实际键盘的手机上
procedure RemoveSpaces(var StringParameter: string);
begin
  StringParameter := StringReplace(StringParameter, ' ', '', [rfReplaceAll]);
end;
function SpacesRemoved(const str: string): string;
begin
  Result := StringReplace(str, ' ', '', [rfReplaceAll]);
end;
RemoveSpaces(Input);
Writeln(Input);
Writeln(SpacesRemoved(Input));