起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 380|回复: 10

【结】重载DoRun方法后很诡异的错误

[复制链接]
发表于 2010-1-26 10:49:04 | 显示全部楼层 |阅读模式
我在一个功能的代码里重载了DoRun方法,(代码如下):
procedure TWPHSGL.DoRun;
var
  I: Integer;
  S: string;
  lFunc: TFunc;
  lFuncIsRunning: Boolean;
  tmpUniqueId:string;
begin
  //加些判断是否关闭功能。
  //判断当前要执行的功能是否已经运行
  S := 'Biz:\OABGZDHXT\WPHSGL.FUNC';
  for I := 0 to TSystemCore.FuncManager.RunningFuncCount-1  do
  begin
    if SysUtils.UpperCase(TSystemCore.FuncManager.RunningFuncs[I].BizClassURL.BizURL.URL) = SysUtils.UpperCase(S) then
    begin
      lFuncIsRunning := True;
      break;
    end else
    begin
      lFuncIsRunning := False;
    end;

  end;
  if  lFuncIsRunning =true  then
  begin
    self.Terminate;
    SystemCore.TSystemCore.FuncManager.RunFunc(Context.Parent,'',SysUtils.UpperCase(S) ,  '', nil, False);
  end else
  begin
    tmpUniqueId:= SYSTEMCORE.TFuncManager.GetFuncUniqueID(context.parent, SysUtils.UpperCase(S),'');
    lFunc:= SYSTEMCORE.TSYSTEMCORE.FuncManager.FindRunning(tmpUniqueId);
    TSystemCore.FuncManager.ActivateFunc(lFunc);
  end;
  inherited;
end;


前几天运行还没错,今天再运行的时候,如果是初始化运行会卡死,如果用IE浏览会提示Stack OverFlow,加了断点运行的时候发现如果 lFuncIsRunning := True;的话程序会运行到红色那一句后不是接着往下执行而是跳回到一开始的For循环,最后陷入死循环不停的执行如下的代码
  for I := 0 to TSystemCore.FuncManager.RunningFuncCount-1  do
  begin
    if SysUtils.UpperCase(TSystemCore.FuncManager.RunningFuncs[I].BizClassURL.BizURL.URL) = SysUtils.UpperCase(S) then
    begin
      lFuncIsRunning := True;
      break;
    end else
    begin
      lFuncIsRunning := False;
    end;

  end;
  if  lFuncIsRunning =true  then
  begin
    self.Terminate;
    SystemCore.TSystemCore.FuncManager.RunFunc(Context.Parent,'',SysUtils.UpperCase(S) ,  '', nil, False);

高手帮忙看看到底是什么问题,谢谢了
回复

使用道具 举报

发表于 2010-1-26 11:13:52 | 显示全部楼层
SystemCore.TSystemCore.FuncManager.RunFunc(Context.Parent,'',SysUtils.UpperCase(S) ,  '', nil, False);
把这句注释掉。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-26 11:27:08 | 显示全部楼层
那一句是用来跳到已经运行的功能的,注释掉当然没错,但是也实现不了执行DoRun的意义了
回复 支持 反对

使用道具 举报

发表于 2010-1-26 11:35:39 | 显示全部楼层
在a功能的dorun中关闭自己又runfunc 自己肯定死循环啊。
你想具体干啥呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-26 11:38:32 | 显示全部楼层
我是想判断一下,如果功能已经运行的话就跳到此功能的界面,没运行的话就创建这个功能
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-26 12:08:41 | 显示全部楼层
我注释掉了self.Terminate一样会错啊
回复 支持 反对

使用道具 举报

发表于 2010-1-26 13:44:38 | 显示全部楼层
楼主,你的逻辑是否有问题,self.Terminate 是关闭功能,后面下面又去运行功能,那到底是关闭还是运行呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-26 15:21:31 | 显示全部楼层
呃,比如我已经从功能树把功能运行起来了,但是在另一个功能里也有一个地方通过代码能启动这个功能,如果不加这个判断的话会产生同时运行两个相同功能的情况,我现在想做的是在功能运行的时候加上这个判断,如果功能已经运行了就要跳到这个功能的窗体界面,如果没运行就运行这个功能,请问该怎么做,麻烦给个思路好吗
回复 支持 反对

使用道具 举报

发表于 2010-1-26 17:10:07 | 显示全部楼层
我不知道是否是版本的版本,我在3068上测试的
我这里测试后,在调用的功能里面用RunFunc直接调用就可以了,不需要在被调用的功能上加任何代码,调用功能参考如下(我是调用的Biz:\OPERATION\CRMSPACE\YWGN4.Func 这个功能)
SystemCore.TSystemCore.FuncManager.RunFunc(Context,'','Biz:\OPERATION\CRMSPACE\YWGN4.Func','',nil,False);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-27 08:49:46 | 显示全部楼层
应该不是版本的问题,我这里调用功能是自己写的一个方法,可能是因为那方法没判断好,现在直接用RunFunc已经解决了
结贴吧,感谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-12 15:02 , Processed in 0.044948 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表