数据库程序开发中的一个奇怪的现象???

zsr 2000-07-10 09:38:00
一个奇怪的现象:(源代码如下)
其中,Form1为主窗口,Form2为动态生成的子窗口,DataModual为数据模块;
DataModual1上置一TDatabase平构件,程序运行时自动连接数据服务器(用的是DB2);
Form1上有主菜单File,按New时动态生成Form2;
Form2上有Table1,连接置数据库的一个表,另有Dbgrid和dbnavigator,窗口生成
时打开表,关闭时关闭表;
通过试验发现,当Form2的属性为fsdialog时,程序运行正常(重复打开关闭对话框),而Form2的属性为fsMdiChild时,即使保证只打开一个子窗口(打开后又关闭),在下次打开子窗口时出现"Open语句中指定的游标已经打开"错误.
这是为什么????Form2都是动态生成,为什么结果却不同呢???
请各位高手赐教.

主窗口:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
file1: TMenuItem;
new1: TMenuItem;
procedure new1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses unit2;
{$R *.DFM}

procedure TForm1.new1Click(Sender: TObject);
var
child: TForm2;
begin
Child:= TForm2.Create( application );
{ try
Child.Showmodal;
finally
Child.free;
end; }
end;

end.

子窗口:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables;

type
TForm2 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
uses unit3;
{$R *.DFM}

procedure TForm2.FormShow(Sender: TObject);
begin
table1.open;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
table1.close;
// action:= cafree;
end;

end.


数据模块:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables;

type
TDataModule3 = class(TDataModule)
db1: TDatabase;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
DataModule3: TDataModule3;

implementation

{$R *.DFM}

procedure TDataModule3.DataModuleCreate(Sender: TObject);
begin
db1.open;
end;

procedure TDataModule3.DataModuleDestroy(Sender: TObject);
begin
db1.close;
end;

end.
...全文
732 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
RobertLubj 2000-07-13
  • 打赏
  • 举报
回复
看一下有关Tform的方法create的说明,你便会明白有什么区别!
zsr 2000-07-12
  • 打赏
  • 举报
回复
请问对于子窗口来说,
create( application ) 和create( self)有什么区别?
meijg 2000-07-11
  • 打赏
  • 举报
回复
你的action:=cafree是注释掉的呀,怎么会起作用呢?
另外在调用form2的时候,可以将child:=TForm2.Create(Self);试试

zsr 2000-07-11
  • 打赏
  • 举报
回复
莫非无人能解此问题?失望!!
Hank 2000-07-10
  • 打赏
  • 举报
回复
将TDataModule3里面的过程全部去掉然后再试一下!
supershan 2000-07-10
  • 打赏
  • 举报
回复
更正一下,是
child.show;
supershan 2000-07-10
  • 打赏
  • 举报
回复
如果你用MDICHILD模式则应改为
procedure TForm1.new1Click(Sender: TObject);
var
child: TForm2;
begin
Child:= TForm2.Create( application );
{ try
Child.Show;
finally
Child.free;
end; }
end;
并且主FORM应为MDIFORM



ymxxm 2000-07-10
  • 打赏
  • 举报
回复
数据模块在关闭时要设DataModule3为null
zsr 2000-07-10
  • 打赏
  • 举报
回复
在子窗口的onclose中已经有action:= cafree 了呀!
trivita 2000-07-10
  • 打赏
  • 举报
回复
Dialog形式的窗口在被关闭是就释放了;
而MdiChild则只是隐藏,所以出现你所述情况,
你应该在调用完MdiChild后主动释放Form2

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧