[难:200]一个很郁闷的问题,我都不知道应该放到哪个版块(不好意思,没找着合适的所以先寄放在TCP/IP吧),但是不管怎么说还是请大家多多帮忙出出点子吧。(唉

  • 主题发起人 主题发起人 wx-ham
  • 开始时间 开始时间
W

wx-ham

Unregistered / Unconfirmed
GUEST, unregistred user!
[难:200]一个很郁闷的问题,我都不知道应该放到哪个版块(不好意思,没找着合适的所以先寄放在TCP/IP吧),但是不管怎么说还是请大家多多帮忙出出点子吧。(唉,这年头,程序员容易吗)我在线等(200分)<br />最近程序出了一个很奇怪的问题,我自己是从来没有遇到过,而且自己也记不得是改什么的时候出的这个问题。程序有主窗体,还有一个就是系统自动生成的DPR项目文件
具体的贴一点程序出来:
program ClientPro;

uses
Forms,
Main in 'Main.pas' {FrmMain},
。。。。。。。。。。。。。。。。//自定义的一些单元,略去
Login in 'Login.pas' {FrmLogin};

{$R *.res}
begin
Application.Initialize;
Application.ShowMainForm := False; //开始的时候设主窗体的属性为False
Application.CreateForm(TFrmMain, FrmMain); //一会儿就是这儿出的问题了
Application.Run;
end.

procedure TFrmMain.FormCreate(Sender: TObject);
begin
FilePath := ExtractFilePath(Application.ExeName);
FrmMain.OldCreateOrder := true;//这一句是以前老的窗体出现类似问题的解决办法////(也是网上的一位仁兄告诉我的,但是加了以后没有作用)
if not showLoginFrm then
Application.Terminate //如果验证没有通过,则关闭程序
else begin
show; //如果登陆验证通过,则显示主窗体。
PlaySound(ReadINIString('sound', 'welcome', ''));
end;
InitializeCriticalSection(CS); //初始化临界区
end;


就是在DPR文件中执行到Application.CreateForm(TFrmMain, FrmMain);这一句时,按照道理来说应该转到procedure TFrmMain.FormCreate(Sender: TObject);执行,得是运行的时候执行到CreateForm的时候没有FormCreate而就是死在那儿了。
本来程序是有信号灯的,但是后来考虑到出问题了,又将信号灯程序删了,还是有问题。
还请大家帮帮忙,根据你们的经验,我想大家一起想,一定会有解决的办法的,先谢谢你们了。

附,有关信号灯的处理程序:
initialization
MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
if MutHandle &gt; 0 then isActiveShow := False
else isActiveShow := true;
finalization
if MutHandle &lt;&gt; 0 then
CloseHandle(MutHandle);
 
你的程序就是验证的时候出问题?我没太搞明白问题所在,不过我可以给你一个我通常用的验证的代码:
var
BeginTime : Dword;
begin
Application.Initialize;
GetSysRce(TsSysREC);
w_Welcome := Tw_Welcome.Create(Application);
w_Welcome.Show;
w_WelCome.Update;

BeginTime := GetTickCount();
while (Gettickcount() - BeginTime) &lt; 1000 do
Application.ProcessMessages;

w_welcome.st_Tips.Caption := '正在连接数据库...';
//--------------------------------------------------------

Application.CreateForm(Tw_DataConnect, w_DataConnect);
// Application.CreateForm(Tw_Main, w_Main);
sleep(1000);
w_Welcome.Close;
f_Login:=Tf_Login.Create(Application);
f_Login.ShowModal;
if f_Login.ModalResult=1 then
begin
Application.CreateForm(Tw_Main, w_Main);
ApPlication.Run;
end
else
begin
Application.Run;
Application.Terminate;
end;

end.
 
FrmMain.OldCreateOrder := true;//这句绝对有问题
在OnCreate事件中不要引用实例名,因为
Application.CreateForm(TFrmMain, FrmMain);
还没执行完,FrmMain根本没有值,直接用
OldCreateOrder := true;
就行了

至于信号量,这里有个笔记,但有缺点
http://www.delphibbs.com/keylife/iblog_show.asp?xid=604
 
Specifies when OnCreate and OnDestroy events occur.

property OldCreateOrder: Boolean;

Description

When OldCreateOrder is False (the default) the OnCreate event occurs after all constructors are finished (from the AfterConstruction method) and the OnDestroy event occurs before any destructors are called (from the BeforeDestruction method).

This timing differs from Delphi version 3 and previous, where the OnCreate event occurred when the TCustomForm constructor executed and the OnDestroy event occurred when the TCustomForm destructor executed. Applications that require the OnCreate event and OnDestroy events to occur from the constructor and destructor of the form can set OldCreateOrder to True.
 
Application.ShowMainForm := False; //开始的时候设主窗体的属性为False
Application.CreateForm(TFrmMain, FrmMain); //一会儿就是这儿出的问题了

这两句换一下位置,换成这样:

Application.CreateForm(TFrmMain, FrmMain);
Application.ShowMainForm := False;
 
首先,谢谢你,但是我觉得不应该是验证的时候出的问题,为什么呢?
因为,程序在procedure TFrmMain.FormCreate(Sender: TObject);
中的if not showLoginFrm then的时候才去执行验证的,但是现在问题是根本连FormCreate程序都没有执行到。
procedure TFrmMain.FormCreate(Sender: TObject);
begin
FilePath := ExtractFilePath(Application.ExeName);//连这儿都没有执行到
FrmMain.OldCreateOrder := true;//这一句是以前老的窗体出现类似问题的解决办法////(也是网上的一位仁兄告诉我的,但是加了以后没有作用)
if not showLoginFrm then //ShowLoginFrm 是验证窗体
Application.Terminate //如果验证没有通过,则关闭程序
else begin
show; //如果登陆验证通过,则显示主窗体。
PlaySound(ReadINIString('sound', 'welcome', ''));
end;
InitializeCriticalSection(CS); //初始化临界区
end;
 
你新建一个工程,把这些代码复制进去运行,我敢说除了FrmMain.OldCreateOrder := true这句绝对没问题
 
果然是人多力量大啊,虽然问题还是没有解决是,但是我要谢谢的热心支持。
根据大家的建议我已经将程序做了一些改变,但是还是不行。
首先将顺序调了一下:Application.CreateForm(TFrmMain, FrmMain);
Application.ShowMainForm := False;
另外将OldCreateOrder := true;前的FrmMain去掉了。
但是还不是行的
再一起想想办法吧
谢谢各位了
 
先把这部分代码去掉,再试试
if not showLoginFrm then
Application.Terminate //如果验证没有通过,则关闭程序
else begin
show; //如果登陆验证通过,则显示主窗体。
PlaySound(ReadINIString('sound', 'welcome', ''));
end;
你的登录是不是用到了ShowModal,这是个思路
 
弹出什么错误提示,是不是窗体的创建的错误(还没有创建,就显示)?
 
我再把大家提出的那个显示登陆的那个程序贴出来吧,但是问题程序根本没有执行到这儿啊!!
function showLoginFrm(): Boolean;
begin
FrmLogin := TFrmLogin.Create(Application);
try
with FrmLogin do
begin
result := False;
result := ShowModal = mrOk;
end;
finally
FrmLogin.Release;
end;
end;
 
对了,再申明一点:程序不是每一次都执行不到主窗体的FormCreate的程序的,也许是一次是好的,再一次又不行了,或许是能连续是两三次是好的,忽然又有一次不行了,也有可能连续八九次是好的,又忽然不行了。
反正出错的可能性是不一定的吧。
 
1.不要使用 OldCreateOrder 。
2.问题出在 TFrmLogin 。
3.简单的测试,直接把
function showLoginFrm(): Boolean;
begin
FrmLogin := TFrmLogin.Create(Application);
try
with FrmLogin do
begin
result := False;
result := ShowModal = mrOk;
end;
finally
FrmLogin.Release;
end;
end;

改成
function showLoginFrm(): Boolean;
begin
FrmLogin := TFrmLogin.Create(Application);
try
// with FrmLogin do
// begin
result := True;
// result := ShowModal = mrOk;
// end;
finally
FrmLogin.Release;
end;
end;

假如还是有问题,再发帖。
 
把ShowLoginFrm改过来测试,还是老问题。
 
那就把TFrmLogin去掉,直接运行:
procedure TFrmMain.FormCreate(Sender: TObject);
begin
FilePath := ExtractFilePath(Application.ExeName);
// FrmMain.OldCreateOrder := true;//这一句是以前老的窗体出现类似问题的解决办法////(也是网上的一位仁兄告诉我的,但是加了以后没有作用)
// if not showLoginFrm then
// Application.Terminate //如果验证没有通过,则关闭程序
// else begin
show; //如果登陆验证通过,则显示主窗体。
PlaySound(ReadINIString('sound', 'welcome', ''));
// end;
InitializeCriticalSection(CS); //初始化临界区
end;

OldCreateOrder是一定不能用的!
 
注意保留或者直接常量化登陆名、权限、口令等参数。
 
多人接受答案了。
 
既然解决了问题,我想还是把问题拿出来跟大家共享一下:
其实呢,结果并不是出在代码上,但是要谢谢大家提出的这些方案,这也让我学到了不少东西。我想可能消息被中断了,所以造成了程序的假死。
结果是出在TMS的一个WEBIMAGE控件上,WEBIMAGE有一个属性Async如果指定了Webimage1.async开始的时候指定为true的话,就是异步。那么根据你的网速就可能会出现这个问题,所以会有有的时候可以的,有的时候不可以的。
所以呢,这个第三方控件也好也有的时候呢,反正不能迷信啊
 
问题解决了吗?
 
后退
顶部