begin
with TLoginForm.Create(nil) do try //建议
if ShowModal <> mrOk then Exit;
finally
Free;
end;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
with TLoginForm.Create(nil) do try //建议
if ShowModal <> mrOk then Exit;
finally
Free;
end;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
LoginForm := TLoginForm.Create(Application); //Application.Free会触发LoginForm.Free
try
if LoginForm.ShowModal = mrOk then
begin
Application.ShowMainForm := True;
Application.Run;
end else
begin
Application.ShowMainForm := False;
Application.Terminate;
end;
finally
if Assigned(LoginForm) then LoginForm.Free;
end;
end.
Application.Terminate后就不要LoginFm.Free了,因为Application.Terminate已经替你作过了,所以才会出错的。
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
LoginForm := TLoginForm.Create(nil); //nil or Application均一样出错
if LoginForm.ShowModal = mrOk then
begin
MainForm.UserCode := LoginForm.CodeEdit.Text;
SetCurrentUserCode(LoginForm.CodeEdit.Text);
Application.ShowMainForm := True;
Application.Run;
end else
begin
Application.ShowMainForm := False;
Application.Terminate;
end;
end.
begin
if Assigned(FCurrentFunctionlist) then
begin
FCurrentFunctionList.Free;
FCurrentFunctionList:=nil;
end;
if Assigned(FFunctionList) then
begin
FFunctionlist.Free;
FFunctionlist:=nil;
end;
end;
-----------------------------------
{$R *.RES}begin
Application.Initialize;
LoginForm := TLoginForm.Create(Application);
try
if LoginForm.ShowModal = mrOk then
begin
Application.CreateForm(TMainForm, MainForm);
Application.ShowMainForm := True;
Application.Run;
end else
begin
Application.ShowMainForm := False;
Application.Terminate;
end;
finally
if Assigned(LoginForm) then LoginForm.Free;
end;
end.
----------------------------------------------
主窗体看来有点毛病,导致主程序出错!
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if Assigned(FCurrentFunctionlist) then
begin
FCurrentFunctionList.Free;
FCurrentFunctionList:=nil;
end;
if Assigned(FFunctionList) then
begin
// FFunctionlist.Free; //就是这句!看来该列表早已释放!
FFunctionlist:=nil;
end;
if Assigned(Fmenu) then
begin
FMenu.Free;
Fmenu:=nil;
end;
end;procedure TMainForm.FormShow(Sender: TObject);
begin
..........
// 声明:这是我从别人手上接过来的活儿!
FCurrentFunctionList.Free ;
FCurrentFunctionList := FFunctionList;
//看这个变态的写法!
................
end;
再次感谢给兄弟这翻解答!希望经常得到您的指点!
本人最近没有关于DELPHI一些特别的特性方面的资料,比如:
Form1:=TForm1.create(Application);
Form1:=TForm1.create(nil);
Application.Create(TForm1,Form1);
这三者的不同,兄弟都不是很清楚
还有Assigned在这里的处理与<>nil有何不同?
if Assigned(FFunctionList) then
begin
FFunctionlist.Free;
FFunctionlist:=nil;
end;
//也许Value有指向的地址但有可能没有分配了资源
procedure TForm1.Button1Click(Sender: TObject);
var
P: TForm;
begin
P := TForm.Create(nil);
P.Free; //可P已经指向一个地址了
if P = nil then ShowMessage('我说错了');
if Assigned(P) then ShowMessage('看看就知道');
end;