我想给程序做一个动态封面窗口 (20分)

  • 主题发起人 主题发起人 631229
  • 开始时间 开始时间
6

631229

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个窗体,Form1和MainForm,希望程序运行时先弹出封面窗体Form1,显示欢迎信息并
要求输入几个全局变量,然后就再也不用它了,即希望释放掉它所占的内存等所有资源,然
后显示主窗口MainForm。为此在Project-> Options中设MainForm为主窗体,将Form1移
至Available Forms列表中。项目文件代码如下:
program Activity;
uses
Forms,
Main in 'MAIN.PAS' {MainForm},
Cover in 'Cover.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
With TForm1.Create(nil) do
try
Showmodal;
Update;
finally
Free;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Form1窗体的代码如下:
unit Cover;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label5: TLabel;
Label6: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CentroidLongtitude,CentroidLatitude:Single;
UpLeftLongtitude,UpRightLongtitude,DownLeftLatitude,DownRightLatitude:Single;
implementation
uses Main;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
while (Edit1.text<>'') And (Edit2.text<>'') And (Edit3.text<>'') And (Edit4.text<>'') Do
begin
CentroidLongtitude:=StrToInt(Edit1.text)+(StrToFloat(Edit2.text))/60;
CentroidLatitude:=StrToInt(Edit3.text)+(StrToFloat(Edit4.text))/60;
UpLeftLongtitude:=CentroidLongtitude+1.4;
UpRightLongtitude:=CentroidLongtitude+1.4;
DownLeftLatitude:=CentroidLatitude+1.4;
DownRightLatitude:=CentroidLatitude+1.4;
end;
end;
end.
问题是:Form1出现后如果直接关闭它,可以顺利地出现主窗体MainForm,但如果在Form1里的
Edit1、Edit2、Edit3、Edit4等里输入数值后单击Button1,主窗体就出不来运行不下去了。
将项目文件代码中的Free改写成TForm1.Button1Click(Sender: TObject中的
DownRightLatitude:=CentroidLatitude+1.4后的Form1.free也不行。
哪位大侠能帮我解决这个问题,除给分外,我还可以告诉他一个免费的Gis控件下载地址。
 
將項目文件改為:
Begin
Application.Initialize;
With TForm1.Create(nil) do
begin
try
Showmodal;
if ModalResult=mrok thrn
Begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
End;
finally
free;
end;
end;

end;

在Form1的Button1的單擊事件中加上
ModalResult:=Mrok;
 
项目文件:
With TForm1.Create(nil) do
try
Showmodal;
Update;
finally
Free;
end;

Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
你试一试。
 
我照两位说的做了可还是不行啊!
 
Begin
Application.Initialize;
With TForm1.Create(nil) do
begin
try
Showmodal;
if ModalResult=mrok thrn
Begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
End;
finally
free;
end;
end;

在MainForm的Create事件中调用Form1中的内容。
试试!
 
注意看你的這按鈕事件,若edit1,edit2,edit3,edit4這四個編輯框都有值,這不成了死循環,
難怪MainForm不顯示出來,
procedure TForm1.Button1Click(Sender: TObject);
begin
//while (Edit1.text<>'') And (Edit2.text<>'') And (Edit3.text<>'') And (Edit4.text<>'') Do
//改用If語句
if (Edit1.text<>'') And (Edit2.text<>'') And (Edit3.text<>'') And (Edit4.text<>'') then

begin
CentroidLongtitude:=StrToInt(Edit1.text)+(StrToFloat(Edit2.text))/60;
CentroidLatitude:=StrToInt(Edit3.text)+(StrToFloat(Edit4.text))/60;
UpLeftLongtitude:=CentroidLongtitude+1.4;
UpRightLongtitude:=CentroidLongtitude+1.4;
DownLeftLatitude:=CentroidLatitude+1.4;
DownRightLatitude:=CentroidLatitude+1.4;
end;
end;
 
To:zxb200
说的死循环问题确实存在,犯这种低级错误令我赧颜。不过改成if后并在Button1.click中加入
Form1.hide,然后运行,在几个Edit控件输入值,单击Butoon1,出错:
Project Activity.exe raised exception class EAccsessViolation with message 'Accsess
violation at address 0043BE0E in module 'ACTIVITY.EXE'.Read of address FFFFFFFF.'
Process stoped.Use Step or Run to continue.
我会继续查找原因的。
 
在Button1click事件下
不要加form1.hide;
把其改為modalresult:=mrok;
就可以了。
 
我照zxb200的方法做成功了,不过我觉得这个问题可能说明我对某些基本概念还不了解,还想
知道这里面的道理,希望哪位能解释一下,暂不结束帖子。我水平很低经常要提问的,故分
数一般给得较少,为了感谢大家的帮助,列出一个Gis控件的下载地址:
http://www.inovagis.org/giobjects/inovagis31_beta5.zip
它是Free的,以ActiveX的形式提供。
 
后退
顶部