Undeclared identifier: 'result'这个错误究竟如何纠正?

时间:2022-04-24 09:27:03
先附上一段代码:
function  TForm1.GetKeyStr(key:word):string;
var
 mkey:string;
begin
// if key in [16..18] then exit;
 if (key in [65..90]) or (key in [48..57]) then  mkey:=char(key);
 case key of
     VK_BACK:mkey:= 'Back';
     VK_NUMPAD1:mkey:= 'NUM 1';
     VK_NUMPAD2:mkey:= 'NUM 2';
     VK_NUMPAD3:mkey:= 'NUM 3';
     VK_NUMPAD4:mkey:= 'NUM 4';
     VK_NUMPAD5:mkey:= 'NUM 5';
     VK_NUMPAD6:mkey:= 'NUM 6';
     VK_NUMPAD7:mkey:= 'NUM 7';
     VK_NUMPAD8:mkey:= 'NUM 8';
     VK_NUMPAD9:mkey:= 'NUM 9';
     VK_NUMPAD0:mkey:= 'NUM 0';
     VK_MULTIPLY:mkey:= 'NUM *';
     VK_ADD:     mkey:= 'NUM +';
     VK_SUBTRACT:mkey:= 'NUM -';
     VK_DECIMAL: mkey:= 'NUM .';
     VK_DIVIDE: mkey:= 'NUM /';
     VK_NUMLOCK:mkey:='NUMLOCK';

     VK_SCROLL :mkey:='SCROLLLOCK';
     VK_PAUSE :mkey:='PAUSE';
     VK_INSERT :mkey:='INSERT';
     VK_DELETE :mkey:='DELETE';
     VK_PRIOR :mkey:='PageUp';
     VK_NEXT :mkey:='PageDown';
     VK_END :mkey:='END';
     VK_HOME :mkey:='HOME';
     VK_LEFT :mkey:='LEFT';
     VK_UP :mkey:='UP';
     VK_RIGHT :mkey:='RIGHT';
     VK_DOWN :mkey:='DOWN';

     VK_ESCAPE :mkey:='ESC';
     VK_F1 :mkey:='F1';
     VK_F2 :mkey:='F2';
     VK_F3 :mkey:='F3';
     VK_F4 :mkey:='F4';
     VK_F5 :mkey:='F5';
     VK_F6 :mkey:='F6';
     VK_F7 :mkey:='F7';
     VK_F8 :mkey:='F8';
     VK_F9 :mkey:='F9';
     VK_F10 :mkey:='F10';
     VK_F11 :mkey:='F11';
     VK_F12 :mkey:='F12';

     192:mkey:='`';
     189:mkey:='-';
     187:mkey:='=';
     220:mkey:='\';
     VK_RETURN:mkey:='ENTER';
     219:mkey:='[';
     221:mkey:=']';
     20:mkey:='CAPSLOCK';
     186:mkey:=';';
     222:mkey:='''';
     188:mkey:=',';
     190:mkey:='.';
     191:mkey:='/';
     VK_LWIN:mkey:='LWIN';
     VK_RWIN:mkey:='RWIN';
     VK_SPACE:mkey:='SPACE';
  end;
  result:=mkey;
end;

上面是函数代码,下面是部分调用代码:
var
  Res: TResourceStream;
begin
 result:=false;

 dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'.dll';
// dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'l.dll';
 if not FileExists(dllname) then
  begin
    Res := TResourceStream.Create(Hinstance, 'MYDAT', RT_RCDATA);
    Res.SavetoFile(dllname);
    Res.Free;
 end;

一运行就出现这样的错误提示:
[Error] Unit1.pas(100): Undeclared identifier: 'result'

晕,变量未定义,但这里的result应该是对应于上面的result,可在程序源码中并没有定义这个变量(摘自网上一开源程序),但编译无误的,而我自己将上面的函数代码及调用过程代码取出来执行就是总出现如上错误,无法成功执行,在网上搜来搜去,看到这样一段介绍:
Result是function的返回定义。 function TInputDlg.ValidCheck:boolean; 在这个函数中,result:=true跟:validcheck:=true是一样的。 -------------

这里说明了result是函数的返回定义,并不需定义变量的,可上面的代码运行后就提示变量未定义,这是为何呢?搜了半天也没找到答案,望大家给指点一下,如果这样定义好像不对头:
result:boolean;

这样虽然定义方法是对的,但应该不是这样子的,在网上看了不少其他示例,也并没有这样定义的(都是直接result:=false;或result:=true;这样写的),说来说去还是没搞懂,大家给指点一下,谢谢。

7 个解决方案

#1



var 
  Res: TResourceStream; 
begin 
result:=false; 

dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'.dll'; 
// dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'l.dll'; 
if not FileExists(dllname) then 
  begin 
    Res := TResourceStream.Create(Hinstance, 'MYDAT', RT_RCDATA); 
    Res.SavetoFile(dllname); 
    Res.Free; 
end; 

你的调用代码是写在函数中,还是子程序中。
如果在子程序就没有result

#2


先谢赤楼上的指点,是在函数中啊,为何没用呢?

#3


这么用没有问题,是不是别的问题

#4


再请教一下:为何写在函数中就没有问题,而写在子程序中就不行,是不是因为函数具有返回值而子程序没有返回值啊?

#5


引用 4 楼 my3b 的回复:
再请教一下:为何写在函数中就没有问题,而写在子程序中就不行,是不是因为函数具有返回值而子程序没有返回值啊?

是的

#6


先谢过楼上的热心指点了,再请教一下:为何子程序不能引用函数的返回值?不好意思,这应该是个基础问题,但我还是没搞明白,我原来是将
var 
  Res: TResourceStream; 
begin 
result:=false;
这段代码写在子程序中的,所以老是提示变量未定义,后来经你指点,改写在函数中(将子程序改成函数)就可以了,你看上面的result是另一函数的返回值,而引用此返回值只能是函数,子程序就不行,我的概念还有点模糊,不太理解引用时为何非的要函数?其实还是没有完全搞懂函数有返回值而子程序没有返回值的意思!

#7


函数是有返回值的。
子程序没有返回值的。
就是这样设计的,没什么可以说的,这就是规则。

#1



var 
  Res: TResourceStream; 
begin 
result:=false; 

dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'.dll'; 
// dllname:=copy(application.ExeName,1,length(application.ExeName)-4)+'l.dll'; 
if not FileExists(dllname) then 
  begin 
    Res := TResourceStream.Create(Hinstance, 'MYDAT', RT_RCDATA); 
    Res.SavetoFile(dllname); 
    Res.Free; 
end; 

你的调用代码是写在函数中,还是子程序中。
如果在子程序就没有result

#2


先谢赤楼上的指点,是在函数中啊,为何没用呢?

#3


这么用没有问题,是不是别的问题

#4


再请教一下:为何写在函数中就没有问题,而写在子程序中就不行,是不是因为函数具有返回值而子程序没有返回值啊?

#5


引用 4 楼 my3b 的回复:
再请教一下:为何写在函数中就没有问题,而写在子程序中就不行,是不是因为函数具有返回值而子程序没有返回值啊?

是的

#6


先谢过楼上的热心指点了,再请教一下:为何子程序不能引用函数的返回值?不好意思,这应该是个基础问题,但我还是没搞明白,我原来是将
var 
  Res: TResourceStream; 
begin 
result:=false;
这段代码写在子程序中的,所以老是提示变量未定义,后来经你指点,改写在函数中(将子程序改成函数)就可以了,你看上面的result是另一函数的返回值,而引用此返回值只能是函数,子程序就不行,我的概念还有点模糊,不太理解引用时为何非的要函数?其实还是没有完全搞懂函数有返回值而子程序没有返回值的意思!

#7


函数是有返回值的。
子程序没有返回值的。
就是这样设计的,没什么可以说的,这就是规则。