delphi制作多文档界面

合集下载

第6章Delphi教程

第6章Delphi教程
窗体名.Show; 窗体名.ShowModal;
Show方法与ShowModal函数的区别时, 使用Show方法显示窗体称为非模式显示,可 以在窗体之间任意切换;使用ShowModal函
数显示窗体称为模式显示,只能显示指定的窗 体,不能切换到其他窗体。 2)隐藏窗体 当显示一个窗体后,如果暂时不需要访问 该窗体,可以使用Hide方法将该窗体隐藏起来 ,当需要访问时再显示出来。Hide方法的格式 如下:
procedure TForm1.Button2Click(Sender: TObject); begin Form2.Hide; end;
3)关闭窗体 当确定窗体不再使用后,应关闭窗体, 从而释放该窗体占用的资源。在Delphi系统 中,通常有两种关闭窗体的形式。一种方式 是单击关闭按钮,另一种是使用Close方法来 关闭窗体,其格式如下:
窗体名.Close; 提示: 提示:当关闭窗体时,由该窗体派生出的所有窗体 也一同关闭。
6.1.3 多个窗体间的数据传递
在多窗体程序中,各个窗体之间需要交 换信息,在Delphi程序设计中通常使用公共 变量来共享数据。 在Delphi系统中,公共变量通常定义在程 序单元中的接口变量处(Interfac通过 引用的方式来调用这些变量。为了更好地管 理公共变量,用户往往在程序设计过程中创 建一个独立的Unit单元,用以定义所有的公 共变量,供其它程序单元使用。下面给出定 义公共变量的具体步骤。
第6章 多窗体程序设计 章
当程序比较复杂时,往往需要将不同 功能的程序模块放置到不同的窗体中以 便于管理,由此引出了多窗体程序设计 问题。在Delphi系统设计中,多窗体程序 有两种形式,一种是由多个Form窗体实 现的多窗体程序,窗体与窗体之间彼此 没有主从关系;另一种是由多文档 (Multiple Document Interface,MDI)窗 体实现的多窗体程序。

第5章 菜单、工具栏和多文档的设计

第5章 菜单、工具栏和多文档的设计
创 建 菜 单 时 , 首 先 要 在 窗 体 中 放 置 一 个 菜 单 对 象 。 然 后 调 入 Menu Designer进行菜单的详细设定。用两种方式可以进入Menu Designer:
➢选中菜单部件,点动属性中Items省略按钮。
➢在菜单部件上双击左键,就会出现Menu Designer。
5.2.4 动态菜单的设计
(3)如果仅仅是改变菜单项上的显示标题,只需将一 个新的标题赋给菜单项的 Caption 属性即可以实现。 (4)如果在菜单设计阶段并不知道需要添加的菜单项 是什么,或者实际要求是应用程序的使用者去创建的, 可以利用菜单项的 Insert 和 Remove 方法进行添加和删 除菜单项。 (5)可以设计多个菜单,再通过 AutoMerge 属性对相 应的菜单进行融合,也可以将融合的菜单分离开来。融 合菜单时要设置菜单项的 GroupIndex 属性,融合的结 果将按 GroupIndex 属性值的大小进行排列。在程序中 也可通过 Merge 和 UnMerge 方法来融合和取消融合。 如MainMenu1.Merge(MainMenu2);或 MainMenu1.UnMerge(MainMenu2)。 事实上,更多的时候是依据开发者的习惯,可以综合灵 活运用。
件列表中。 ToolBar 组件常用的属性和事件如下: (1)Align 属性:默认为 alTop ,所以 ToolBar 组件默认停靠 在窗体的最上边,并且宽度会自动适应窗体宽度的改变。
(2)AutoSize 属性:工具栏的大小是否自动匹配。 (3)Caption 属性:工具栏的标题,当其浮动时可显示的标 题名称。
5.2.1 设置菜单项的有效和无效
在实际的应用程序中,由于各种原因需要对菜单项的有效和无效进行动态 设置。比如当前的系统剪贴板中没有数据可以粘贴,【粘贴】菜单项就应 该是变灰的禁用状态。

Delphi编程_界面设计

Delphi编程_界面设计

Font maxFontSize, MinFontSize Option
3.8.3.3 颜色对话框
3.8.3.4 查找对话框
属性 FindText
说明 在设计期用来预设一个待查的字符串,运行期 用来获得欲查的字符串 选项的集合 决定了对话框在屏幕上出现的位置
Options Position
3.8.3.4 查找对话框(续)
• wsMinimized • wsMaximized
3.4 控件的位置(续)
不同分辨率下的窗体位置设计
• 将窗体的Scaled属性设为True
当窗体的PixelsPerInch属性值不同于当前系统时, Delphi将自动改变窗体和窗体内的控件的尺寸。 当窗体的AutoScroll属性为true时,自动改变尺寸不适 用于窗体,只适用于窗体内的控件。
窗体的位置和大小
• • • • • • • • poDesigned poDefault poDefaulPosOnly poDefaulSizeOnly poScreenCenter poDesktopCenter poMainFormCenter poOwnerFormCenter
WindowState属性
界面设计
内容提要
用户界面样式 界面设计一般性原则 光标和帮助提示的用法 状态栏和工具栏等控件的用法 窗口的分割和分页 控件的悬停 多文档界面(MDI)
3.1 用户界面
用户界面是一个应用程序最重要的部分,它是最直 接的现实世界。 设计应用程序时,需要做出有关界面的若干决定。 设计用户界面之前,需要考虑应用程序的用途。 初学者的应用程序,它的设计要求简单明了,而针 对有经验用户可以复杂一些。 用户界面的设计是一个反复过程,很难在第一遍就 能提出一个完美的设计。

delphi mdi 原理

delphi mdi 原理

Delphi是一种编程语言和集成开发环境(IDE),支持多文档界面(MDI)应用程序的开发。

MDI是一种用户界面设计模式,允许在一个主窗口中同时打开多个子窗口。

在Delphi中,MDI应用程序的原理如下:
1. 创建主窗口:首先,你需要创建一个主窗口,它将包含所有的子窗口。

你可以使用Delphi的窗体设计器来创建主窗口。

2. 创建子窗口:接下来,你需要创建子窗口。

子窗口是主窗口的子控件,可以在主窗口中显示。

你可以使用Delphi的窗体设计器或代码来创建子窗口。

3. 设置主窗口属性:在主窗口上,你需要设置一些属性来启用MDI功能。

你可以将主窗口的FormStyle属性设置为fsMDIForm,这将使主窗口成为MDI容器。

4. 设置子窗口属性:在子窗口上,你需要设置一些属性来使其成为MDI子窗口。

你可以将子窗口的FormStyle属性设置为fsMDIChild,这将使子窗口成为MDI容器的子控件。

5. 打开子窗口:当用户需要打开一个子窗口时,你可以使用
Delphi的代码来创建一个新的子窗口实例,并将其添加到主窗口的子控件列表中。

6. 切换子窗口:用户可以通过点击主窗口的标题栏或使用菜单或工具栏来切换子窗口。

当用户切换子窗口时,主窗口会自动将当前活动的子窗口显示在前面。

7. 关闭子窗口:当用户关闭一个子窗口时,你需要从主窗口的子控件列表中移除该子窗口,并释放其资源。

通过以上步骤,你可以在Delphi中创建一个MDI应用程序,允许用户同时打开多个子窗口,并在主窗口中进行切换和管理。

创建多文档界面(MDI)程序7

创建多文档界面(MDI)程序7

}
void __fastcall TChildFrm::Save1Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
RichEdit1->Lines->SaveToFile(SaveDialog1->FileName+".txt");//把RichEdit的内容保
{
MDIFrm->New1Click(Sender); //新建文件,可以直接调用主窗体事件处理函数
}
void __fastcall TChildFrm::Open1Click(TObject *Sender)
{
MDIFrm->Open1Click(Sender); //打开文件,可以直接调用主窗体事件处理函数
{
RichEdit1->CutToClipboard(); //把RichEdit中选中的内容剪切到剪切板
}
1
void __fastcall TChildFrm::Paste1Click(TObject *Sender)
{
RichEdit1->PasteFromClipboard(); //把剪切板中的内容粘贴到RichEdit的当前位置
}
MDI应用程序在缺省的情况下,执行关闭操作时并不真正关闭子窗口,而仅仅是最小化 它。因此子窗口关闭时,要首先设置其Action属性。
void __fastcall TChildFrm::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
//存到文件

Delphi_7_用户界面设计

Delphi_7_用户界面设计
Close 和 SpeedBotton2的Click事件代码设成同样:
procedure TForm1.Close1Click(Sender: TObject); begin
Close; end;
状态栏组件栏中Standard卡,取Panel组件,形成长条, 准备作状态的承载面板。Caption: 空, Name: StatusPanel ,
[例7-7]
5. InputBox函数
function InputBox(const Acaption,Aprompt, AdefaultMsg:string;):string;
6. MessageDlgPosHelp函数
function MessageDlgPos(constMag:string; DlgType:TMsgDlgType;Buttons:TmsgDlgButtons; HelpCtx:Longint;x,y:Integer; const HelpFileName:string):Word;
procedure ShowMessage(const Msg:string); onst Text; Caption: Pchar;
Flage: Longint=MB_OK):Iteger; 2. MessageDlg函数
function MessageDlg(constMag:string; DlgType:TMsgDlgType;Buttons:TmsgDlgButtons; HelpCtx:Longint):Word;
设计File ->Open Close 对这二个菜单设计工具栏 组件栏中【Standard】卡,取Panel组件,形成长条,准
备作工具的承载面板,快捷工具按钮将建在其上。它是容 器组件。 Caption: 空,Name: ToolPanel,Align: alTop(顶端, 标题、菜单的下方)

C#WinfromMDI(多文档界面)

C#WinfromMDI(多文档界面)

C#WinfromMDI(多⽂档界⾯)1、⾸先设置⽗级Form1界⾯,只需要将该界⾯的IsMdiContainer属性设置为true;2、设置按钮的事件来打开⼦级的窗⼝Form2,Form3等等;3、在From1内设置⼀个容器panel,范围为需要打开的⼦级界⾯的⼤⼩;4、设置Form2、Form3的事件,以及唯⼀窗⼝等;//Form2的点击事件private void form2ToolStripMenuItem_Click(object sender, EventArgs e){Form2 f2 = new Form2(); = "f2";openwidow(f2);}//Form3的点击件private void form3ToolStripMenuItem_Click(object sender, EventArgs e){Form3 f3 = new Form3(); = "f3";openwidow(f3);}//设置唯⼀窗⼝://新建⼀个formlist集合,供唯⼀窗⼝使⽤List<Form> formlist = new List<Form>();//新建⼀个public的⽅法private void openwidow(Form f){//定义⼀个Form fff变量Form fff = null;//定义⼀个bool类型的变量为false;bool open = false;//遍历这个集合foreach (Form ff in listfrom){//只要遍历到就隐藏ff.Hide();//如果遍历到if ( == ){open = true;//把ff放到集合内fff = ff;}}//如果遍历到,if (open){//关闭所有窗⼝f.Close();//重新打开这个串⼝fff.Show();}//否则else{//设置打开的窗⼝为Form1的⼦窗体;f.MdiParent = this;//设置⼦窗⼝的⼤⼩为最⼤化;f.WindowState = FormWindowState.Maximized;//把⼦窗⼝放到Form1的panel1⾥;f.Parent = panel1;//设置⽆边框f.FormBorderStyle = FormBorderStyle.None;//打开窗⼝f.Show();//把这个窗⼝放到集合内fromlist.Add(f);}}。

delphi 动态多页面

delphi 动态多页面

var
Pi : Pointer;
begin
Pi := Notebook1.Pages.Object[];
Memo.Parent := Pi;
end;
这样就可在TPage上动态创建编辑部件了。
往Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage. Notebook1.Tabset1有关的属性要作相应的调整。
定义了TDynaPage后,只需在Open,Close菜单项中加入如下代码,即可方便的在用户打开关闭文件时创建成删除页面。
procedure TEditForm.Close1Click(Sender: TObject);
begin
if DynaPage.CurPage<>0 then
TNotebook部件创建后至少有一个页面,因此Pages属性不是空值,只要往Pages中加入字符串,Delphi自动地把该字符串与TPage类对象相联系。TPage类是TCustomEdit派生出来的,在对象浏览器(Object Browse)中可观察到TPage的数据成员和方法。静态生成的页面也是 TPage类。
TabSet1.Tabs:=Notebook1.Pages;
end
else
begin
DynaPage.DynaAdd( Notebook1, ExtractFileName(OpenDialog1.FileName));
Open(OpenDialog1.Filename);
end;
procedure DynaMemo(Pi:Pointer);
var
Memo:TMemo;
begin
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI示范程序,这个程序的功能是打开和保存图形文件(包括位图、图标等),为了完成这个任务,我们有一个大概的计划,计划内容如下:(1)建立主窗体(一个MDI父窗体),包括菜单。

(2)为【File | Open…】和【File | Save…】菜单选项编写代码。

(3)为Windows菜单上的Cascade、Tile和Arrange All选项编写代码。

(4)建立MDI子窗体。

(5)建立一个About对话框。

(6)然后再回忆和欣赏一下这段工作。

时间就是金钱,即刻就做吧。

一、创建主窗口窗体首先创建一个主窗口窗体,一个MDI应用程序的主窗口的FormStyle属性必须设置为fsMDIForm。

不但要为应用程序增加File Open和File Save 对话框,还要增加一个菜单。

1、启动Delphi,并从主菜单选择【File | New | Application】;2、把主窗体的Name属性设置为MainForm;3、把Caption属性设置为Picture Viewer;4、把FormStyle属性设置为fsMDIForm;好了,下面为此窗体增加一个菜单,利用Delphi特性,引进一个预定义菜单,具体如下:1、点击组件选项板的Standard标签,并点击MainMenu按钮;2、把MainMenu组件点击放置到窗体上,具体放到哪个地方无所谓了,因为在运行阶段,代表菜单的图标只是占地方而不显示,这是非可视化组件。

3、把MainMenu组件Name属性改为MainMenu;4、双击MainMenu组件,就会出现Menu Designer对话框;5、在MainMenu上点击鼠标右键,选择“Insert From Template…”,将出现Insert Template对话框;6、选择“MDI Frame Menu”并点击OK,此菜单将显示在Menu Designer上,关闭Menu Designer窗口。

现在又回到了主窗体,注意现在窗体上多了一条菜单,此时先不要点击任何子菜单项,我们先准备File Open对话框和File Save对话框:1、点击组件选项板的Dialogs标签,选择Open Picture Dialog组件,并把它放到窗体上,这也是一个非可视组件。

2、把Open对话框的Name属性改为OpenPictureDialog;3、把Open对话框的Title属性改为“Open a Picture for Viewing”;4、在窗体再增加一个Save Picture Dialog组件;5、把此组件的Name属性改为“SavePictureDialog”,把Title属性改为“Save aPicture”;此时窗体看起来应该像下图:二、编写【File | Open…】和【File | Save As…】菜单选项代码下面就准备开始编写代码,Delphi提供了一种很好地编写菜单处理程序的方法,从而使遇到的麻烦最小。

还不要建立MDI子窗体,但要充分了解它,并用它来为菜单处理程序编写代码,记住在建立MDI子窗体之前一直不要编译应用程序(因为还没有建立MDI子窗体,编译会出现错误的)1、在主窗体上选择【File | Open…】菜单项,这样就会在Code Editor中为此菜单项建立一个事件处理程序。

2、为此事件处理程序键入下列代码:?1 2 3 4 5 procedureTMainForm.Open1Click(Sender: TObject); varChild: TChild;beginifOpenPictureDialog.Execute then6 7 8 91011121314151617 beginChild := TChild.Create(Self);withChild.Image.Picture dobeginLoadFromFile(OpenPictureDialog.FileName);Child.ClientWidth := Width;Child.ClientHeight := Height;end;Child.Caption := ExtractFileName(OpenPictureDialog.FileName); Child.Show;end;end;这段代码首先打开一个“Open a Picture for Viewing”对话框,并得到一个文件名,如果点击这个对话框的OK按钮,就会产生一个TChild对象(TChild是MDI子类的名字,后面将要建立它。

)图像文件被显示到窗体上的Image组件,并且MDI子窗口将会与图像大小相匹配,最后子窗体的标题会显示被选中的图像文件名。

Note在上面的方法中,ExtractFileName函数是用来从路径中提取文件名的函数,文件名包含在OpenPictureDialog的FileName属性中,相关的函数包括ExtractFilePath、ExtractFileDir、ExtractFileDrive和ExtractFileExt。

Note前面我们说过所有动态创建的对象到最后都要用Free删除掉,但是上面的代码中好像违反了这个规律,实际上并没有,因为VCL将负责释放分配给MDI子窗口的内存。

注意TChild 构造程序中的单个参数是Self;这是通知VCL,MDI子窗体的拥有者就是此MDI窗体窗口。

当MDI窗体消失时,它将删除所有MDI子对象。

3、按下F12键,切换到主窗体MainForm,现在从菜单中选择【File | Save As…】,将会显示该菜单项处理事件。

4、键入以下代码:?1 2 3 4 5 6 7 8 9 procedureTMainForm.SaveAs1Click(Sender: TObject);beginifSavePictureDialog.Execute thenbeginwithActiveMDIChild asTChild do{ 检查MDI子窗体是否被激活,只保存激活窗体的图像文件}Image.Picture.SaveToFile(SavePictureDialog.FileNam e);end;end;这段代码比较简洁,头两行是用来检查MDI子窗口是否被激活,如果是激活的窗体,就会显示“Save a Picture”对话框,若用户点击OK,那就将用TPicture类的SaveToFile方法把图像存到盘上去。

Note前面的这段代码中用到了as操作符,ActiveMDIChild属性返回一个指向TForm对象的指针,在这种情况下,实际上只需要一个指向TChild对象的指针(MDI子类是从TForm类派生来的),as操作符把ActiveMDIChild变量强制转化为一个TChild指针,如果as不能完成这种强制转化,as后面的语句将被忽略。

在继续讲解前,我们先把这个工程保存起来,将Unit1保存为PctViewU.pas,将工程文件dpr保存为PictView。

三、为【Windows】菜单编写代码1、F12切换到MainForm窗体上,从窗体上MainMenu菜单上选择【Windows | Tile】;2、只需要为此事件处理程序中输入一行代码即可,最终的事件处理代码如下:?1 2 3 procedureTMainForm.ile1Click(Sender: TObject);begin4 Tile;end;3、切换到MainForm窗体,并为菜单【Windows | Cascade】创建代码,如下:?1 2 3 4 procedureTMainForm.Cascade1Click(Sender: TObject);beginCascade;end;4、切换到MainForm窗体,再次为菜单【Windows | Arrange All】创建代码如下:?1 2 3 4 procedureTMainForm.ArrangeAll1Click(Sender: TObject);beginArrangeIcons;end;好,主窗体工作完成了,下面将进行创建MDI子窗体。

四、创建MDI子窗体MDI子窗体非常简单,实际上不必写任何代码,只要操作下列各步即可:1、用工具栏上的New Form按钮或者通过主菜单上的【File | New Form】来创建一个新窗体;2、把它的Name属性设置为Child,Caption属性将被忽略,因为在运行阶段将要动态设置此属性;3、把FormStyle属性设置为fsMDIChild,为了把这个窗体当做MDI子窗体来处理,这是必须的。

为窗体本身要做的就这些,下面就在此窗体上放置一个Image组件,Image组件将显示用户选择的图形文件。

1、点击组件选项板上的Additional标签,点击Image按钮,并把它放置到Child窗体上;2、把它的Name属性设置为Image;3、把它的Stretch属性设置为True;4、把它的Align属性设置为alClient,Image组件将缩放到窗体的客户区大小;5、选择Delphi主菜单的【File | Save】,以MDIChild保存此窗体单元。

6、切换到Code Editor,点击PctViewU标签,然后从Delphi主菜单选择【File | Use Unit】,选择MDIChild单元,点击OK,这样该工程就可以编译了。

此时,整个MDI子窗体看上去如下:我们的程序还没有完成,因为还差一个About框,此时我们更渴望看到程序的运行,先点击Run按钮,就可以运行程序了,选择【File | Open…】就可以打开任何图形文件了。

注意MDI子窗口会自动缩放它所包含的图形,打开几个文件,然后试一试Window菜单的Cascade和Tile选项。

五、建立About对话框到目前为止,我们自己随意建立一个属于自己的About框,我的About对话框效果如下:1、将建立好的About窗体的Name属性设置为AboutBox,BorderStyle属性设置为bsDialog2、以PVAboutU保存此About对话框窗体单元;3、切换到Code Editor中的PctViewU标签,从Delphi主菜单选择【File | Use Unit】将PVAboutU单元包含近来;4、按F12切换到MainForm主窗体,从菜单上选择【Help | About】,这样就产生一个OnClick处理事件;5、为此事件添加代码如下:?1 2 3 4 procedureTMainForm.About1Click(Sender: TObject);beginAboutBox.ShowModal;end;现在运行它,点击Run按钮,试一试Help菜单的About选项,运行效果如下:六、进一步完善程序此时这个程序已经可以运行了,但它不等于就没有值得完善的地方。

相关文档
最新文档