程序一运行就退出是怎么回事?(50分)

  • 主题发起人 biyesheng
  • 开始时间
B

biyesheng

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序以前还好好的,但过了个周末回来后一执行完
procedure TMainForm.FormShow(Sender: TObject);就自动退出来了,
单步走也找不到程序执行过退出的命令,请大家帮我想想这是怎么回事。
(在2000和98下都是这样)
 
用没用过第三方控件?
 
把代码贴出来,看看!`
 
没代码?怎么看? 检查你的过程中是否有结束之类的语句?或者把原先编译的 EXE 文件删除,
然后重新编译看看吧!
 
贴代码出来
 
代码太长了,我不知道哪一部分有用。我没用到第三方的控件。重新编译也不管用呀。
 
删除原来的exe文件,重新编译生成
 
这怎么看,根据个人的经验和第三方控件有关。
 
我不知道是哪一部分代码的问题,总不能把上千行代码都贴出来吧。
我想问问根据大家的经验有可能是什么问题。我没用到第三方的控件。
 

利用 Delphi的单步调试肯定可以找到原因的。
你不是说 在执行 procedure TMainForm.FormShow(Sender: TObject);就自动退出来了
问题肯定出在这里。
仔细检查这个过程里的所有语句,跟踪每一条语句的执行情况。特别要注意函数调用语句。
如果查不出问题,我想你是不是写了什么定时关闭的东西在里面。
 
你的工程文件文件有没有问题啊?
 
工程文件如下,应该没什么问题吧?

program TestCos;

uses
Forms,
MainFrm in 'MainFrm.pas' {MainForm},
OptionFrm in 'OptionFrm.pas' {OptForm},
ByteString in 'ByteString.pas',
Error in 'Error.pas',
Executor in 'Executor.pas',
ScriptList in 'ScriptList.pas',
VarTable in 'VarTable.pas';

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TOptForm, OptForm);
Application.Run;
end.
 
检查一下第三方控件,重新编译一下
 
因为Show 事件 是发生在 Create 之后,
你首先应该检查 pcc_mmz1 兄所说的那样,
其次,你应该保证 OnCreate 里没有发生 Close 这样的过程。

咦,你说以前是对?现在不行?没有改过代码出现这种情况?
 
百分之百出在控件上,因为是在窗体的显示之前,而窗体的显示之前只是做了些
控件(或者类)的构造,在构造的时候出现了问题。
 
找到问题所在了,我的程序中有一段“同时只能执行一个程序”的代码,我把它注释
了就没事了。但是这段代码我以前用也没什么问题呀,我把代码贴出来大家看看它到底
有问题没有。
//仅运行一个实例

{ Oldtitle:=Application.Title;
Application.Title:='Main'+IntToStr(HInstance); //暂时修改窗口标题
strPCopy(ZAppName,OldTitle);
PrevWnd:=findWindow(nil,ZAppName); //查找窗口
if PrevWnd<>0 then
begin
ShowWindow(PrevWnd,SW_RESTORE);
SetForegroundWindow(PrevWnd); //将该实例显示在最前台
TempWnd:=GetLastActivePopup(PrevWnd); //取得该实例的激活子窗口
SetForegroundWindow(TempWnd); //将该子窗口显示在最前
Application.Terminate;
Exit;
end;
Application.Title:=OldTitle; }
 
如果你的那个 ZAppName 是 PChar ,
那你在
strPCopy(ZAppName,OldTitle);
之前加上 getmem(ZAppName,255);试试呢?

最后记着 freemem(ZAppName);
 
有用到数据库吗?
Path不对的话会出这种问题
 
你上面的程序只简单地处理了一下程序已经运行的情况,
如果程序没有运行,还要 Create 主窗口!!!!!!!
 
我又单步走了一下刚才的代码,终于弄清是怎么回事了。
刚才的代码是放在下面代码后面的(刚才忘了贴了来)
procedure TMainForm.FormCreate(Sender: TObject);
var
ZAppName:array[0..127] of char;
OldTitle:String;
PrevWnd:HWND;
TempWnd:HWND;
begin

它的功能是在启动时首先改程序标题,并将原来标题保存下来,再用FindWindow来根据
原来的标题来打是否有已经打开的该程序。找到则激活它,本程序退出,找不到则改回
标题,继续执行下去。
我上周未无意中把主窗体的Caption属性改为该工程的名字了,在DELPHI中打开该工程
那么DELPHI的标题就是这个工程的标题,所以执行FindWindow虽然只运行一个程序但
还是能找到另一个同标题的程序。我改了一下主窗体的Caption属性,上贴的代码就没
问题了。
在这里非常感谢大家帮助。分数不多,见谅。
 
顶部