试举一例: procedure test; var a, b: Integer; bein read(a); write(a); read(b); // 从这句开始,a 就用不到了,不妨将 b “映射”到 a 所在的位置, // 于是,这里的b其实就是a,b被优化掉了。 write(b); end;
to: zhengji(看雨飞) 你调试这一句代码,其中又没用到Self,Delphi给你这样的提示也不妨碍你什么,不是吗?就是因为报这样的错,所以不能取出数据,程序不能执行下去。to:angle097113(深思<刘强>):leftstr是什么东东啊 没有见过啊
Returns the substring of a specified length that appears at the start of a string 看帮助
iWei:=strtoint(leftstr(strWei,1))这一句跟Self有什么联系?你把你的代码多贴几句出来!楼主在考验人的推断能力。那好,我想,strWei或者iWei至少有一个是类的非静态成员 变量,将这个类记做TUnknown,然后楼主“创建”了一实例: var Obj: TUnknown; begin Obj.Foo; // 楼主给的代码在 Foo 函数中,楼主运行之,必出错。 end;出错原因: 楼主实际上并未“创建”出对象,此时的Obj = nil。楼主跟进Foo 后,一方面 是对象指针 Self = nil, 令一方面是Delphi优化掉了Self参数。解决方法: 不要忘了创建对象:Delphi里的对象都是在堆上的,是用类的静态构造函数创建 出来的: begin Obj := TUnknown.Create; Obj.Foo; end;可合楼主之意否?
修改了下程序,还是报错procedure TForm1.MSComm1Comm(Sender: TObject); var STX:string; iLen:Integer; begin case MSComm1.CommEvent of .... comEvReceive: begin sleep(200); strWei:= MSComm1.Input ; iLen := MSComm1.InBufferCount ; STX:=MidStr(strWei,1,1); if STX= #2 then begin iWei:= strtoint(MidStr(strWei,5,6)); //到这一步都正常 edit1.Text:= inttostr(iWei) ; //报错:edit1.Text为Variable 'self' inaccessible here due to optimization end; end; end; end; 这是用MSCOMM通过工业秤从串口读重量数据
我就不信。除非是在窗口创建之前 MSComm控件就发出了 OnComm 消息。
在窗口创建后,RUN前,进入OnComm事件,我测试了很多次。请高手指教
我把edit1.text该为label1.caption, label1.caption也为: Variable 'self' inaccessible here due to optimization。我是用MSCOMM控件通过串口从toledo工业秤读重量数据,还有一个问题: 我读出来的数据格式跟 toledo相应的技术手册上的有的不一样
procedure test;
var
a, b: Integer;
bein
read(a);
write(a); read(b); // 从这句开始,a 就用不到了,不妨将 b “映射”到 a 所在的位置,
// 于是,这里的b其实就是a,b被优化掉了。
write(b);
end;
你调试这一句代码,其中又没用到Self,Delphi给你这样的提示也不妨碍你什么,不是吗?就是因为报这样的错,所以不能取出数据,程序不能执行下去。to:angle097113(深思<刘强>):leftstr是什么东东啊 没有见过啊
Returns the substring of a specified length that appears at the start of a string
看帮助
变量,将这个类记做TUnknown,然后楼主“创建”了一实例:
var
Obj: TUnknown;
begin
Obj.Foo; // 楼主给的代码在 Foo 函数中,楼主运行之,必出错。
end;出错原因:
楼主实际上并未“创建”出对象,此时的Obj = nil。楼主跟进Foo 后,一方面
是对象指针 Self = nil, 令一方面是Delphi优化掉了Self参数。解决方法:
不要忘了创建对象:Delphi里的对象都是在堆上的,是用类的静态构造函数创建
出来的:
begin
Obj := TUnknown.Create;
Obj.Foo;
end;可合楼主之意否?
var
STX:string;
iLen:Integer;
begin
case MSComm1.CommEvent of
....
comEvReceive:
begin
sleep(200);
strWei:= MSComm1.Input ;
iLen := MSComm1.InBufferCount ;
STX:=MidStr(strWei,1,1);
if STX= #2 then
begin
iWei:= strtoint(MidStr(strWei,5,6)); //到这一步都正常
edit1.Text:= inttostr(iWei) ; //报错:edit1.Text为Variable 'self'
inaccessible here due to optimization
end;
end;
end;
end;
这是用MSCOMM通过工业秤从串口读重量数据
Variable 'self' inaccessible here due to optimization。我是用MSCOMM控件通过串口从toledo工业秤读重量数据,还有一个问题:
我读出来的数据格式跟 toledo相应的技术手册上的有的不一样