我有一个基本的构思,请高手指教!(100分)

  • 主题发起人 主题发起人 由由(love)
  • 开始时间 开始时间

由由(love)

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用DELPHI实现一个MIS系统的应用软件,其中我有一个基本的构思,请高手指

点具体的实现方式,只要告诉我一个方法就可以了,具体的就不麻烦各位了,当

然,能说的越详细越好了,多谢了!
我想做到这样:首先是一个小窗口用户登录,成功以后显示一个MDI主窗口,有菜

单和一行工具栏,菜单可以根据子窗口的菜单而改变(这个我知道怎么做),工

具栏是固定不变的,子窗口有一行工具栏,要求加在主窗口的下面,也就是说我

打开不同的子窗口,有一行工具栏是动态改变的。之后我有一些问题,请教:
1、登录窗口应该是怎么建立,比如说是做一个新的程序还是放在同主窗口一个工

程里,还是放在其它什么地方?登录成功后是释放还是隐藏?哪种更好一点?
2、用户登录后的基本信息应该存放在哪里?是INI文件还是数据库,还是其它的

什么地方?
3、怎么把子窗口的工具栏应用到主窗口上,就是说怎么在主窗口的工具栏下面显

示?
4、怎么控制子窗口在主窗口中的显示?就是说我登录成功后只显示一个子窗口,

然后通过菜单或工具栏显示并且只显示其它的一个子窗口?
5、我的功能模块是放在同一个工程里好,还是一个模块放在一个工程里好?不过

我就是想用MDI窗口来控制。如果是在不同的工程里,那又怎么去控制呢?

希望各位老大能指点一二,小弟不甚感激!
 
1.登陆窗口当然在同一个程序了。创建登陆窗口在project options 中设为Available form
Button 的代码:
procedure TFormLogin.BtnOkClick(Sender: TObject);
begin
。。。。。。//密码检验代码自己添加
ModalResult:=MrOk;
end;
procedure TFormLogin.BtnCancelClick(Sender: TObject);
begin
ModalResult:=MrCancel;
end;
工程文件代码:
uses
Forms,Controls,
FrmMain in 'FrmMain.pas' {FormMain},
FrmLogin in 'FrmLogin.pas' {FormLogin};

{$R *.res}

begin
Application.Initialize;
FormLogin:=TFormLogin.Create(Application);
if FormLogin.ShowModal=MrOk then
begin
Application.CreateForm(TFormMain, FormMain);
Application.Run;
end;
end.
 
2。最好是把登陆后的信息存在数据库里。
3。简单一点把子窗口的工具条放到主窗口里不用的时候设置visible:=false吧。
4。FormChild.ShowModal 用模式窗口。
5。相关模块还是放在一个project,调用简单吗。
 
1、同上
2、当然释放
3、编程实现很方便
 
1.同上
2.保存在远程数据库里(保存在ini里安全吗?用户删除了文件怎么办?新建一个用户难道还要
跑到他的计算机上生成一个ini?)
3.也可以在每个子窗口的工具条上都至少包含主窗口的工具条。然后,在每个子窗口的OnActivate
事件中,toolbar.parent:=main_form;(在子窗口释放时记得改回来)
4.在子窗口的OnActivate事件中编程,建一个循环,释放其他mdi子窗口。
5。放在一个工程中好。可以把独立的对象或函数或与界面无关的代码集中到一个pas文件中,便于
不同工程的共享。
 
楼上的:Style为fsMDIChild的的Form可以ShowModal吗?

我想用DELPHI实现一个MIS系统的应用软件,其中我有一个基本的构思,请高手指
点具体的实现方式,只要告诉我一个方法就可以了,具体的就不麻烦各位了,当
然,能说的越详细越好了,多谢了!
我想做到这样:首先是一个小窗口用户登录,成功以后显示一个MDI主窗口,有菜
单和一行工具栏,菜单可以根据子窗口的菜单而改变(这个我知道怎么做),工
具栏是固定不变的,子窗口有一行工具栏,要求加在主窗口的下面,也就是说我
打开不同的子窗口,有一行工具栏是动态改变的。之后我有一些问题,请教:
1、登录窗口应该是怎么建立,比如说是做一个新的程序还是放在同主窗口一个工
程里,还是放在其它什么地方?登录成功后是释放还是隐藏?哪种更好一点?
所谓功能模块,本来的意思就是指在一个项目中(也就是一个工程),一个单独的功能用
一个单独的模块来实现,而一个项目有多个功能,所以有多个模块也就是必要的了,
登录检查是一个功能,自然也应该在同一个工程中的一个相对独立的模块了.
物理位置放在哪里不重要,如果这个项目的单元不是非常多,数十个甚至数百个或更多的话,
可以和主Form的单元放在同一文件夹,如果项目非常复杂的话,可以放在主Form的单元所在
的文件夹中的一个相对独立的子文件夹中,但是无论如何,它们还是属于同一个项目(或工程).

2、用户登录后的基本信息应该存放在哪里?是INI文件还是数据库,还是其它的
什么地方?

登录后的信息我个人认为是存放在内存中好些,也就是在一些全局变量中,原因嘛:

首先,登录一般来说只对一次启动本系统的操作有效,当下次启动本系统时应该再次
登录,存在数据库或者INI或者注册表中都有可能因为本次登录未能正常退出而没有
清除,那样的话安全就不可保证了,但在内存中就不一样了,虽然有高手可以看到在
内存中找到任何想要的数据,但是如果要想找这么一个高手出来好象不容易.

第二:数据库操作的速度,虽然保存一点点登录数据耗不了多少时间,但是能节约一点时间
为什么不节约,整个系统的性能就是由这些一点点的时间组成的,保存到文件也是一样,
IO操作嘛怎么能与内存读写想比?

第三?晕,有了上面两条还要第三条?

3、怎么把子窗口的工具栏应用到主窗口上,就是说怎么在主窗口的工具栏下面显
示?

要把子窗体的ToolBar放到主窗体来显示,办法如下:
在子窗体的OnCreate事件中写下:
FormChild.ToolBar1.Parent:=FormMain;
然后在FormChild的OnDestroy事件中写下:
FormChild.ToolBar1.Parent:=nil;
FormChild.ToolBar1.Free;
以上办法没有经过试验.
这样做的条件是FormChild必须动态创建,使用完即Free,
不过fsMDIChild倒是必须具有这样的特点.

或者在FormChild的OnShow中写下
FormChild.ToolBar1.Parent:=FormMain;
然后在FormChild的OnHide中写下:
FormChild.ToolBar1.Parent:=FormChild;

4、怎么控制子窗口在主窗口中的显示?就是说我登录成功后只显示一个子窗口,
然后通过菜单或工具栏显示并且只显示其它的一个子窗口?

整个系统在dpr文件中只创建一个主窗体和一个子窗体,在运行的时候就会只显示一个
子窗体,因为Style属性为fsMDIChild的窗是不可以隐藏的,也是就一创建就会显示出来,
要想让它不显示,只有不创建,需要时再创建,用完后就Free.

至只允许一个子窗体显示,那就在子窗体的OnCreate中判断FormMain的MDIChildCount是否大于0,
如果大于0表示已经显示了一个子窗体,就把原窗体Free掉.

5、我的功能模块是放在同一个工程里好,还是一个模块放在一个工程里好?不过
我就是想用MDI窗口来控制。如果是在不同的工程里,那又怎么去控制呢?

如第1条所示,一个项目中的功能模块当然是放到一个项目中.

希望各位老大能指点一二,小弟不甚感激!
 
aizb的第三点:
有些地方不正确。mdichild肯定是要动态创建的,可以运行多个副本,否则就是SDI不是MDI了。
显示child的工具栏,应该在OnActivate事件中;而隐藏CHILD工具栏,是OnClose事件,不是
OnDestroy(因为mdichild的close有不同的参数,不一定会运行到Ondestroy).再者,toolbar
也不用free,因为在设计时出现的控件,该窗体free时自动会free的。
 
to whsuperboy:

"可以运行多个副本,否则就是SDI不是MDI了",我的说法并不与这点冲突;

"显示child的工具栏,应该在OnActivate事件中;而隐藏CHILD工具栏,是OnClose事件":如果你把
显示工具栏放在OnActivate事件中,那隐藏工具栏就应该放在OnDeactivate事件中,否则你关闭Form时,
如果OnClose事件的Action参数设为caMinimize或者不设的话,是不会把子窗口关闭的,但是会执行OnClose事件,
也就是说这时会隐藏工具栏,请注意:这时只是把子窗体最小化,而不是释放,而且这时子窗体连焦点都没有失去,
我们再把它复原显示出来,它就不会触发OnActivate事件,这时的问题就是工具栏没有显示出来.

总之,如果你把显示工具栏的代码放在OnActivate中,则应该把隐藏工具栏的代码放在OnDeactivate,或者OnShow和OnHide
(但是这一组意义不大,因为MDIChild是不可以Hide的),或者OnCreate和OnDestory.

"(因为mdichild的close有不同的参数,不一定会运行到Ondestroy).":是的,OnClose的Action有几种取值,
但是作为MDIChild,有一种是不可以取的:caHide,而caNone在MDIChild中和caMinimize是一样的,caFree就是要释放窗体.
如果设为caNone或caMinimize,则会出现前面的问题.

"因为在设计时出现的控件,该窗体free时自动会free的。":这个说法并不绝对,当你在设计时创建一个按钮Button1,
然后用Button1.Parent:=nil使用Button1与Form1脱离父子关系;再用Form1.RemoveComponent(Button1);使Button1和
Form1脱离所属关系,再用内存监测工具看看会不会释放?真的不会.因为在设计期出现的控件会自动释放的前提是它的
父子关系或所属性关还存在.
 
以下是用OnActivate和OnDeactivate事件实现的完整源码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(Self);
Form2.Tag:=MDIChildCount;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form3:=TForm3.Create(Self);
Form3.Tag:=MDIChildCount;
end;

end.

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm2 = class(TForm)
Panel1: TPanel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDeactivate(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm2.FormDeactivate(Sender: TObject);
begin
Panel1.Parent:=Self;
Panel1.Hide;
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
Panel1.Parent:=Form1;
Panel1.Show;
Panel1.Caption:=ClassName+':'+IntToStr(Tag)
end;

end.

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TForm3 = class(TForm)
Panel1: TPanel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
Panel1.Parent:=Form1;
Panel1.Show;
Panel1.Caption:=ClassName+':'+IntToStr(Tag)
end;

procedure TForm3.FormDeactivate(Sender: TObject);
begin
Panel1.Parent:=Self;
Panel1.Hide;
end;

end.
 
多人接受答案了。
 
后退
顶部