用来把别的form显示在主form的一个image里。。的函数哪位有啊? ( 积分: 50 )

  • 主题发起人 主题发起人 小红河
  • 开始时间 开始时间

小红河

Unregistered / Unconfirmed
GUEST, unregistred user!
主要考虑到一个一个调用form比较麻烦,如果有个函数,可以在主form中自动显示别的form里面的内容,开发起来就方便多了。手头有这么一段代码,可是只有dcu文件。。
使用方法如下:
BasicFrameManager.CreateStandFrame(TDataInput_DRAW_Frame,pflAll);

感觉不是很安全,想用有源代码的。哪位有阿?谢谢。。
 
主要考虑到一个一个调用form比较麻烦,如果有个函数,可以在主form中自动显示别的form里面的内容,开发起来就方便多了。手头有这么一段代码,可是只有dcu文件。。
使用方法如下:
BasicFrameManager.CreateStandFrame(TDataInput_DRAW_Frame,pflAll);

感觉不是很安全,想用有源代码的。哪位有阿?谢谢。。
 
不是吧.没人?.......
 
把一form完全放到主form里?
 
其实你这样一个一个调用的话会增加程序的可读性;介意不要更改
 
BasicFrameManager.CreateStandFrame(TDataInput_DRAW_Frame,pflAll);
使用的是TFrame 而不是 TForm 不过,实现是一样
TBasicFrameManager.CreateStandFrame(TDataInput_DRAW_Frame: TComponentClass;
pflAll: Boolean);
begin
with TComponent(TDataInput_DRAW_Frame.NewInstance) do
begin
with Create(Self) do //创建实例
begin
Parent := Self ; //把新创建的组件加到当前容器组件中
if pfAll then
//做你想做的事情
end;
end ;
end;
 
fushizhiren您好!
请教一下,请问你这个TDataInput_DRAW_Frame.NewInstance是什么意思?
还有,
with Create(Self) do //创建实例
begin
Parent := Self ; //把新创建的组件加到当前容器组件中
if pfAll then
//做你想做的事情
end;
中,第二个self表示谁呢?能表示当前容器吗?

我现在是想实现这样的功能:
最上面是一个扁扁的图片,用来放软件的名字或者公司的标志性图片
下面分两部分,左边是很多橡皮条式的按钮,右边是一个image或者别的什么东西.通过点左边的按钮,变换右边容器里的内容..
程序中有很多form,但是都是通过一个函数调用的.通过这个函数调用以后,别的form都显示在image里面,但是不显示边框.因此在运行以后就看不出来其实是调用了很多form
我觉得这样的好处是在设计的时候比较方便,可以很好多解决多个界面一个一个showmodal,而很多用户在点出一个showmodal界面以后又想点原来的界面,却点不动的问题.
分数少了点.不好意思.刚刚起步,请多指教.谢谢....
 
自己顶啊 ............
 
用子Form可以实现:
unit MyPas;

interface

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

type
TMyForm = class(TForm)
tlbUser: TToolBar;
mmUser: TMainMenu;
private
{ Private declarations }
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(var Params: TCreateParams);override;
procedure Loaded;override;
public
{ Public declarations }
constructor Create(AOwner: TComponent);overload;override;
constructor Create(AOwner: TComponent; AParent: TWinControl);reintroduce;overload;
function GetMenu: TMainMenu;virtual;
function CanChange: Boolean; virtual;
procedure SetToolBar(AParent: TWinControl);
end;

var
MyForm: TMyForm;

implementation

uses MainPas;

{$R *.dfm}

constructor TMyForm.Create(AOwner: TComponent);
begin
FAsChild:=False;
inherited Create(AOwner);
end;

constructor TMyForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild:=True;
FTempParent:=aParent;
inherited Create(AOwner);
end;

procedure TMyForm.Loaded;
begin
inherited;
if FAsChild then
begin
align:=alClient;
BorderStyle:=bsNone;
BorderIcons:=[];
Parent:=FTempParent;
Position:=poDefault;
end;
end;

procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
if FAsChild then
Params.Style:=Params.Style or WS_CHILD;
end;

function TMyForm.GetMenu;
begin
Result:=mmUser;
end;

function TMyForm.CanChange: Boolean;
begin
Result:=True;
end;

procedure TMyForm.SetToolBar(AParent: TWinControl);
begin
tlbUser.Parent:=aParent;
end;

end.

只要其他窗体继承自这个窗体,就可以利用第二个构造在主窗体中调用:
if not assigned(form1) then
form1:=tform1.create(application,panel1);
form1.show;
注意,第二个参数是TWinControl类型,所以不能直接是TImage,可以将Image放入TPanel中,效果一样。
 
你看过“东之源超市管理”软件没有?和你的要求一样的,他实现的很简单,但非常漂亮,自己找找吧
 
我以前做过一个例子 就是点击TreeView的item 可以把窗体加如主窗体的一个容器中
做一个过程 用时调用这个可以吗?
用法 OnParentOpenForm(Tform1,form1,ScrollBox1);
//////////////////////////////////////////////////////////////////////////////
//在指定容器中打开窗体 FormClass 窗体类 一般在 窗体名前面加T
// FormName 窗体名称 ParentName 容器名称
//////////////////////////////////////////////////////////////////////////////
procedure OnParentOpenForm(FormClass:TComponentClass;FormName:Tform;ParentName:TWincontrol);
var
i:integer;
begin
//在打开窗体之前先清空指定容器中的窗体
for i:=0 to Application.ComponentCount-1 do
begin
if Application.Components is tform then
begin
if (Application.Components as tform).Parent=ParentName then
(Application.Components as tform).Free;
end;
end;
//创建并在指定容器中打开窗体
Application.CreateForm(FormClass,FormName); //创建窗体
FormName.Parent:=ParentName; //指定窗体容器
FormName.Align:=alClient;
FormName.BorderStyle:=bsNone;
FormName.Show;
end;
 
我觉得这个过程因该和服你的要求 比如你放几个按钮 可以切换不同的窗体
本人是新手 就当给以上程序做一下指点了 调一下试试![:D]
 
to hb_wshsh
您说的子窗体是什么意思?是mdi窗体还是说你用的是子窗体原理?两种我都试过了。不行

to kiki4
您的方法我试过了。被调用窗体里面的组件一个也显示不出来,为什么啊?是不是还有设置?我的代码如下:
unit Unit2;

interface

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

type
TForm2 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
ListBox1: TListBox;
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

end.

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
procedure OnParentOpenForm(FormClass:TComponentClass;FormName:Tform;ParentName:TWincontrol);
implementation

uses Unit2;
//////////////////////////////////////////////////////////////////////////////
//在指定容器中打开窗体 FormClass 窗体类 一般在 窗体名前面加T
// FormName 窗体名称 ParentName 容器名称
//////////////////////////////////////////////////////////////////////////////
procedure OnParentOpenForm(FormClass:TComponentClass;FormName:Tform;ParentName:TWincontrol);
var
i:integer;
begin
//在打开窗体之前先清空指定容器中的窗体
for i:=0 to Application.ComponentCount-1 do
begin
if Application.Components is tform then
begin
if (Application.Components as tform).Parent=ParentName then
(Application.Components as tform).Free;
end;
end;
//创建并在指定容器中打开窗体
Application.CreateForm(FormClass,FormName); //创建窗体
showmessage('sdfas');
FormName.Parent:=ParentName; //指定窗体容器
FormName.Align:=alClient;
//FormName.BorderStyle:=bsNone;
FormName.Show;
formname.Visible:=true;
end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
OnParentOpenForm(Tform,form2,panel1);
end;

end.

哪位最终答对了我还会再开一贴给50分。这个帖子大家打过的平分吧。好不好?谢谢各位。。
 
呵呵,对frame怎么都不理解
谁给详细的结实一下啊
 
我按 你的做过了是不能显示
OnParentOpenForm(Tform,form2,panel1);你要在Tform加个2 呵呵
只是差了个2 可能是我标注释没标清让你误解了
下面这句 完全可以显示
OnParentOpenForm(Tform2,form2,panel1);
 
如果可以 就回复一下 不差分 就是纯交流!
 
kiki4您好!
我按照您说的做了。挺好!!呵呵。谢谢。。又一个问题出现了。怎么释放这个窗体啊?
其实不是您没说清楚。是我没好好看注释,而且看了代码也没多想。呵呵。
我用form2.close释放form2未遂。。不知道怎么释放啊?
后来我想想,在创建的时候加句if not assigned(FormName) then。。可以防止重复创建,可是怎么关闭呢?怎么想也不明白。。谢谢指教。。
 
我已经写了啊 看这句 只要想再次创建组建里的窗体时 容器里的窗体是会被释放的
begin
//在打开窗体之前先清空指定容器中的窗体
for i:=0 to Application.ComponentCount-1 do
begin
if Application.Components is tform then
begin
if (Application.Components as tform).Parent=ParentName then
(Application.Components as tform).Free;
end;
end;
这个过程就是为了 让在容器中加入窗体的
你要加入另一个窗体就可以释放前一个窗体
我不知道你有什么特殊用途 所以解释不清 因为我也是刚学delphi半年
 
我现在是想实现这样的功能:
最上面是一个扁扁的图片,用来放软件的名字或者公司的标志性图片
下面分两部分,左边是很多橡皮条式的按钮,右边是一个image或者别的什么东西.通过点左边的按钮,变换右边容器里的内容..
程序中有很多form,但是都是通过一个函数调用的.通过这个函数调用以后,别的form都显示在image里面,但是不显示边框.因此在运行以后就看不出来其实是调用了很多form
我觉得这样的好处是在设计的时候比较方便,可以很好多解决多个界面一个一个showmodal,而很多用户在点出一个showmodal界面以后又想点原来的界面,却点不动的问题.
分数少了点.不好意思.刚刚起步,请多指教.谢谢....

我才看见 那你就按我写的做就可以了 //FormName.BorderStyle:=bsNone;
这句别屏蔽 因为你不是要不显示边框吗!
按别的按钮切换到另一个窗体时 前一个窗体会被释放的 这个不用担心
QQ279114877(加我时注释 是delphi的朋友就可以了)
我是新手 可以交流一下
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
909
DelphiTeacher的专栏
D
后退
顶部