如何从delphi函数返回多个值(return multiple values from a delphi function)

Delphi应用程序中最常见的构造是过程或函数。被称为例程的过程或函数是从程序中的不同位置调用的语句块。...

Delphi应用程序中最常见的构造是过程或函数。被称为例程的过程或函数是从程序中的不同位置调用的语句块。

简单地说,过程是一个例程,在函数返回值时不返回值。

函数的返回值由返回类型定义。在大多数情况下,您可以编写一个函数来返回一个值,该值可以是整数、字符串、布尔值或其他简单类型,返回类型也可以是数组、字符串列表、自定义对象实例或类似的类型。

请注意,即使函数返回一个字符串列表(字符串的集合),它仍然返回一个值:字符串列表的一个实例。

此外,Delphi例程可以有很多面:例程、方法、方法指针、事件委托、匿名方法。。。

函数能否返回多个值?

首先想到的答案是否定的,因为当我们想到一个函数时,我们想到的是一个返回值。

当然,上述问题的答案是肯定的。一个函数可以返回多个值。让我们看看如何。

var参数

以下函数可以返回多少个值,一个或两个?

function PositiveReciprocal(const valueIn : integer; var valueOut : real): boolean;

该函数显然返回一个布尔值(true或false)。第二个参数“valueOut”声明为“VAR”(变量)参数如何?

Var参数通过引用传递给函数,这意味着如果函数更改参数的值(代码调用块中的变量),函数将更改用于参数的变量的值。

要了解上述操作的工作原理,以下是实现:

function PositiveReciprocal(const valueIn: integer; var valueOut: real): boolean; begin result := valueIn > 0; if result then valueOut := 1 / valueIn; end;

“valueIn”作为常量参数传递,函数无法更改它,并且它被视为只读。

如果“valueIn”或大于零,“valueOut”参数被指定为“valueIn”的倒数值,函数结果为真。如果valueIn<=0,则函数返回false,“valueOut”不会以任何方式更改。

下面是用法:

var b : boolean; r : real; begin r := 5; b := PositiveReciprocal(1, r); //here: // b = true (since 1 >= 0) // r = 0.2 (1/5) r := 5; b := PositiveReciprocal(-1, r); //here: // b = false (since -1 end;

因此,正互易实际上可以“返回”2个值!使用var参数,可以让例程返回多个值。

输出参数

还有另一种使用“out”关键字指定by-reference参数的方法,如中所示:

function PositiveReciprocalOut(const valueIn: integer; out valueOut: real): boolean; begin result := valueIn > 0; if result then valueOut := 1 / valueIn; end;

PositiveReciprocalOut的实现与PositiveReciprocalOut相同,只有一个区别:“valueOut”是一个OUT参数。

当参数声明为“out”时,被引用变量“valueOut”的初始值将被丢弃。

下面是用法和结果:

var b : boolean; r : real; begin r := 5; b := PositiveReciprocalOut(1, r); //here: // b = true (since 1 >= 0) // r = 0.2 (1/5) r := 5; b := PositiveReciprocalOut(-1, r); //here: // b = false (since -1 end;

请注意,在第二次调用中,局部变量“r”的值是如何设置为“0”的。在函数调用之前,“r”的值被设置为5,但由于in参数声明为“out”,当“r”到达函数时,该值被丢弃,并且为参数设置了默认的“空”值(0表示实型)。

因此,您可以安全地为out参数发送未初始化的变量,这是不应该使用“var”参数的。参数用于向例程发送某些内容,但此处的“out”参数除外:),因此未初始化的变量(用于VAR参数)可能会有奇怪的值。

归还记录?

上述函数返回多个值的实现并不好。该函数实际上返回单个值,但也返回var/out参数的值(更确切地说是alters)。

因此,您可能很少希望使用按引用参数。如果需要函数的更多结果,可以让函数返回记录类型变量。

考虑以下事项:

type TLatitudeLongitude = record Latitude: real; Longitude: real; end;

还有一个假设函数:

function WhereAmI(const townName : string) : TLatitudeLongitude;

函数将返回给定城镇(城市、地区等)的纬度和经度。

执行工作将是:

function WhereAmI(const townName: string): TLatitudeLongitude; begin//use some service to locate "townName", then assign function result: result.Latitude := 45.54; result.Longitude := 18.71; end;

这里我们有一个函数,返回两个实数。好的,它返回1条记录,但该记录有2个字段。请注意,您可能有一个非常复杂的记录,它混合了各种类型,作为函数的结果返回。

就这样。因此,是的,Delphi函数可以返回多个值。

  • 发表于 2021-10-17 03:53
  • 阅读 ( 265 )
  • 分类:数学

你可能感兴趣的文章

delphi编译器版本指令

...将模拟IncludeTrailingBackslax函数。 它可能看起来像: function AddLastBackSlash(str: string) : string; begin{$IFDEF VER130}  Result:=IncludeTrailingBackslash(str) ; {$ELSE}if Copy(str, Length(str), 1) = "\" then    Result := str  else   Result := str + "\";​ {...

  • 发布于 2021-09-06 15:09
  • 阅读 ( 161 )

将项目添加到tpopup delphi菜单

... property Value : string read fValue write fValue;   end; 下面介绍如何将此“扩展”菜单项添加到PoupMenu1: var    menuItemEx : TMenuItemExtended; begin    menuItemEx := TMenuItemExtended.Create(PopupMenu1) ;    menuItemEx.Caption := 'Extended added at ' + TimeToStr...

  • 发布于 2021-09-06 15:10
  • 阅读 ( 164 )

delphi的顺序和枚举数据类型

...优化或组合以创建新的数据类型。在本文中,我们将看到如何在Delphi中创建自定义序号数据类型。 顺序类型 有序数据类型的定义特征是:它们必须由有限数量的元素组成,并且必须以某种方式排序。 顺序数据类型最常见的...

  • 发布于 2021-09-10 23:38
  • 阅读 ( 197 )

如何用delphi显示最顶层的系统模式消息框(display a topmost system modal message box with delphi)

...和按钮的任意组合。 下面是MessageBox的声明方式: function MessageBox(   hWnd: HWND;   lpText,   lpCaption : PAnsiChar;   uType : Cardinal) : integer; 第一个参数hwnd是要创建的消息框的所有者窗口的句柄。如果在对话框存在时创建消息...

  • 发布于 2021-09-15 03:45
  • 阅读 ( 226 )

用delphi截取键盘输入

... integer; {track battle ship's position}   {callback's declaration}   function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall; implementation ... 要安装钩子,我们在表单的OnCreate事件中调用SetWindowsHookEx。 procedure TForm1.FormC...

  • 发布于 2021-09-15 03:46
  • 阅读 ( 153 )

理解delphi中的内存分配

...的EStackOverflow错误,并显示消息“stack overflow”。 ​function DoStackOverflow : integer; begin result := 1 + DoStackOverflow; end; 这个“堆栈”是什么?为什么使用上面的代码会出现溢出? 因此,DoStackOverflow函数递归地调用自己——没...

  • 发布于 2021-09-15 03:47
  • 阅读 ( 190 )

如何用delphi搜索文件和文件夹(search for files and folders with delphi)

...子文件夹中搜索通常是有用且必要的。在这里,您将看到如何使用Delphi的强大功能创建一个简单但功能强大的查找所有匹配文件项目。 文件/文件夹掩码搜索项目 下面的项目不仅允许您通过子文件夹搜索文件,还允许您轻松...

  • 发布于 2021-09-15 03:52
  • 阅读 ( 211 )

了解delphi类(和记录)助手

...如下所示: type TStringsHelper = class helper for TStrings public function Contains(const aString : string) : boolean; end; 上述名为“TStringsHelper”的类是TStrings类型的类帮助器。请注意,TStrings是在Classes.pas中定义的,例如,对于任何Delphi表单的...

  • 发布于 2021-09-15 03:55
  • 阅读 ( 172 )

如何在delphi中编辑ini文件(edit ini files in delphi)

...不存在,则可以使用该值。 例如,ReadString声明为: function ReadString(const Section, Ident, Default: String): String; override; 写入ini 对于每个“读取”方法,该文件都有相应的“写入”方法。它们是WriteString、WriteBool、WriteInteger等。 ...

  • 发布于 2021-09-15 03:57
  • 阅读 ( 209 )

使用delphi获取文件的大小(以字节为单位)

...函数将返回-1。 // returns file size in bytes or -1 if not found.function FileSize(fileName : wideString) : Int64;varsr : TSearchRec;beginif FindFirst(fileName, faAnyFile, sr ) = 0 thenresult := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow)elseresult := -1;...

  • 发布于 2021-09-15 04:03
  • 阅读 ( 177 )
vttxxvtvx979
vttxxvtvx979

0 篇文章

相关推荐