delphi制作多文档界面
- 格式:wps
- 大小:830.00 KB
- 文档页数:12
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应用程序,允许用户同时打开多个子窗口,并在主窗口中进行切换和管理。
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);}}。
第3章Delphi常用组件第3章常用组件Delphi 7.0的组件板上含有27个选项卡,总共包括350多个组件,如图所示:3.1 窗体3.1.1 Form组件窗体是应用程序的操作界面,是放置组件的基础。
窗体由标题栏、工作区和边界组成。
Form的主要属性窗体组件(TForm)在运行时表现为一个窗体,窗体是一个容器构件,它可以包含其他种类的构件,并协同完成应用程序的整体功能。
窗体由属性、事件和方法组成。
(1)BorderIcons属性用来制定窗体标题栏上的图标(2)BorderStyle属性Borderstyle属性用来设置窗体的外观和边框(3)Name属性Name属性唯一地标识对象,取值不能为空,若工程中有多个窗体,名称不能相同。
(4)Caption属性用来指定窗体标题栏中说明文字,可以为空。
(5)Font属性Font属性用来设置窗体中文字的字体、颜色和字号等等,其中Font.style属性为集合型。
(6)FormStyle属性FormStyle属性用来指定窗体的类型。
从窗体类型的角度来看,Windows环境中的应用程序可以分为以下三类。
第一类:多文档界面(MDI)应用程序一般这种应用程序具有一个父级窗口和多个子窗口,可以同时打开多个文档,分别在多个子窗口中显示。
第二类:单文档界面(SDI)应用程序这种应用程序同时只能打开一个文档。
第三类:对话框应用程序这种应用程序的主界面基于一个对话框类型的窗体。
(7)Icon属性Icon属性用来指定标题栏中显示的图标。
(8)Position属性Position属性用来描述窗体大小和显示位置。
(9)WindowsState属性WindowsState属性来描述窗体显示状态。
2.TForm 的事件窗体是一个可视化的组件,包括外部事件和内部事件。
3.窗体的方法一些常用方法(过程或函数)有:Create 、Close 、CloseQuery 、release 、Show 、ShowModal 、Print 。
Delphi界面设计专辑[前言:]界面的美观和用户亲和性是应用软件成功的首要条件,因此界面往往是程序员最费心的地方。
在这个专辑中,将向读者全面介绍Delphi中界面设计的原则和技巧窗体设计制作固定大小的Form固定的Form像一个对话框,何不试试下面的语句巧用Delphi制作溅射屏幕精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。
利用一点儿小小的内容,即可给程序的显示添加不少色彩LED数码管仿真显示程序在电子设备上广泛地使用LED数码管显示数据,在许多应用软件中也经常模拟LED数码管显示数据,使程序画面看起来很有特色菜单设计DELPHI中自适应表单的实现我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会走样作非常规程序菜单掌握delphi高级秘籍大家可能见过诸如金山毒霸,瑞星杀毒,以及五笔输入法等等在系统托盘(即右下角有时间和输入法图标的地方)在的控制菜单,而在正常的任务栏(即屏幕最下方的“开始”按钮的右边的各式各样)中却不出现按钮的程序,即我们常说的在后台运行的程序用Delphi制作动态菜单所谓动态菜单是指菜单项随着程序的操作变化而变化。
现在,我们用Delphi来实现这一功能,具体步骤如下工具栏和状态条为Windows窗口标题栏添加新按钮对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮。
你想不想在Windows的窗口标题栏上添加一个新的自定义按钮用Delphi4实现风Word97格的工具栏用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同样IE4.0的工具栏也有类似的风格,Win98的出现,使这种风格的工具栏得到了推广如何隐藏和显示Windows的任务条如果隐藏和显示Windows的任务条?仅仅调用以下的函数就可以.其他技巧Delphi利用Windows GDI实现文字倾斜在Delphi开发环境中,文字的输出效果一般都是头上脚下的"正统"字符,如何输出带有一定倾斜角度的文字以达到特殊的显示效果呢Delphi之三十六计之界面篇设置状态栏面板对象的Style为OwnerDraw,并在状态栏对象的DrawPanel事件中书写以下代码利用COM技术实现外壳扩展的属性页当用户在资源管理器中调用右键菜单时,会显示一个"属性"菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息制作固定大小的Form固定的Form像一个对话框,何不试试下面的语句?C++ Builder请参照Delphi的例子Delphi您可以覆写CreateParams() 这个TWinControl 的虚拟程序, 改变form的wc.Stylee, 将WS_SYSMENU 这个旗标解除, 这样, 就不会有左上角的SystemMenuBox 了.至於不能移动.缩小/放大, 可以自已拦下WM_NCHITTEST, 然後一概回应滑鼠点在视窗Client 区域, 相信这个视窗就呆呆的不会动了.详情可以查一下Win32API Help 的CreateWindow() 与WM_NCHITTEST 的说明.unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;protectedprocedure CreateParams(var Params: TCreateParams); override;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}巧用Delphi制作溅射屏幕精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。
实验一:选择结构程序设计一、实验目的:1、掌握Object Pascal 语言的的数据类型,熟悉定义各种的数据类型的变量的方法。
2、学会正确使用逻辑运算符和逻辑表达式。
3、熟练掌握if语句和Case语句。
二、实验内容:1、编程求分段函数的值。
2、给出百分制的成绩,要求输出其对应的成绩等级“A”,“B”,“C”,“D”,“E”。
其中:90分(包括90分)以上的为“A”,80-89分的为“B”,70-79分为“C”,60-69分为“D”,60分以下为“E”。
三、实验步骤:内容1步骤:1、选择主选单的FILE-NEW-APPLICATION。
2、在窗体上放置2个LABEL组件,1个EDIT组件,2个BUTTON组件。
3、双击“计算”按钮,在TFORM1。
BUTTON1CLICK事件处理器的编辑区输入代码4、双击“关闭”,在TFORM1。
BUTTON2CLICK事件处理器的编辑区输入下列一行代码:CLOSE;5、保存文件,按F9运行。
内容2步骤:1、选择主选单的FILE-NEW-APPLICATION。
2、在窗体上放置2个LABEL组件,1个EDIT组件,2个BUTTON组件。
3、双击“等级”按钮,在TFORM1。
BUTTON1CLICK事件处理器的编辑区输入代码4、双击“关闭”,在TFORM1。
BUTTON2CLICK事件处理器的编辑区输入下列一行代码:CLOSE;5、保存文件,按F9运行。
四、实验仪器及工具软件:微机及WIN98操作系统、DELPHI7五、实验说明及注意事项:如何正确使用逻辑运算符和逻辑表达式六、实验前的准备:1、熟悉DELPHI 6的界面操作2、熟悉Object Pascal 语言的的数据类型七、实验报告要求:1、实验报告必须独立完成,抄袭、复制他人的报告作无效处理。
2、实验报告要注明姓名,学号,实验名称,完成日期,实验日期。
3、要按规定的统一格式书写,包含目的,内容,步骤,结果及分析。
delphi实现多语言界面的最简单方法delphi 实现多语言界面的最简单方法//viewthread.php?tid=636delphi 实现多语言界面的最简单方法--------------------------------------------------------------------------------/php-delphi/delphi/69845.htm基本原理:Delphi 的VCL是通过TReader 类来对控件进行读写的,再加上VCL的源码开放性,通过修改可以它,使界面的资源从ini文件中读取:1、在classes.pas中添加:{!$IFDEF _MULTILANG}function CL(const s: WideString): String;begin{$IFDEF _MULTILANG}Result := ConvertLanguage(s);{$ELSE}Result := s;{$ENDIF}end;{!$ENDIF}2、TReader.ReadString:function TReader.ReadString: string;varL: Integer;beginif NextValue in [vaWString, vaUTF8String] then Result := ReadWideStringelsebeginL := 0;case ReadValue ofvaString:Read(L, SizeOf(Byte));vaLString:Read(L, SizeOf(Integer));elsePropValueError;end;SetLength(Result, L);Read(Pointer(Result)^, L);{$IFDEF _MULTILANG}Result := ConvertLanguage(Result); {$ENDIF}end;end;3、TReader.ReadString:function TReader.ReadWideString: WideString; varL: Integer;Temp: UTF8String;beginif NextValue in [vaString, vaLString] then Result := ReadStringelsebeginL := 0;case ReadValue ofvaWString:beginRead(L, SizeOf(Integer));SetLength(Result, L);Read(Pointer(Result)^, L * 2);end;vaUTF8String:beginRead(L, SizeOf(Integer));SetLength(Temp, L);Read(Pointer(Temp)^, L);Result := Utf8Decode(Temp);end;elsePropValueError;end;{$IFDEF _MULTILANG}Result := ConvertLanguage(Result);{$ENDIF}end;end;4.MultiLanguage.pas代码:{$DEFINE _WRITE_LANGFILE}unit MultiLang;interfaceconstcLangFileName = 'language.ini';function ConvertLanguage(const s: WideString): WideString; implementationuseswindows, SysUtils, classes, IniFiles;constUTF8TextFileTag: string = #$EF#$BB#$BF;varClSrLst: TStringList=nil;ClDtLst: TStringList=nil;ClWrLst: TStringList=nil;FIsModify:Boolean=False;function WideStrPos(const Patt, SearchStr: WideString): integer;varPP, PS, PsBk: PWideChar;isHas: Boolean;beginResult := 0;PP := PWideChar(Patt);PS := PWideChar(SearchStr);PsBk := PS;isHas := False;if (PP<>nil) and (PP^<>#0) and(PS <> nil) and (PS^ <> #0) thenbeginwhile (PS^ <> #0) dobeginif(PS^ = PP^) thenbeginif not isHas thenbeginisHas := True;PsBk := PS;end;inc(PP);if PP^ = #0 thenbeginResult := (PsBk - PWideChar(SearChStr)) + 1;Break;end;endelse if isHas thenbeginisHas := False;PP := PWideChar(Patt);PS := PsBk + 1;end;inc(PS);end;end;end;function WideStrCopy(const s: WideString; Offset, Len: Integer): WideString;varP: PWideChar;aLen: Integer;i: integer;beginResult := '';if s <> '' thenbeginaLen := Length(s) - Offset + 1;if Len < aLen thenaLen := Len;if aLen > 0 thenbeginSetLength(Result, aLen);p := PWideChar(s) + Offset - 1;for i := 1 to aLen dobeginResult[i] := p^;inc(p);end;end;end;end;function WideStrReplace(const S, OldPattern, NewPattern: WideString;Flags: TReplaceFlags): WideString;varSearchStr, Patt, NewStr: WideString;Offset: Integer;beginif rfIgnoreCase in Flags thenbeginSearchStr := WideUpperCase(S);Patt := WideUpperCase(OldPattern);end elsebeginSearchStr := S;Patt := OldPattern;end;NewStr := S;Result := '';while SearchStr <> '' dobeginOffset := WideStrPos(Patt, SearchStr);if Offset = 0 thenbeginResult := Result + NewStr;Break;end;Result := Result + WideStrCopy(NewStr, 1, Offset - 1) + NewPattern;NewStr := WideStrCopy(NewStr, Offset + Length(OldPattern), MaxInt);if not (rfReplaceAll in Flags) thenbeginResult := Result + NewStr;Break;end;SearchStr := WideStrCopy(SearchStr, Offset + Length(Patt), MaxInt);end;end;function ECode(s: WideString): WideString;vartmps: widestring;begintmps := #13#10;s := WideStrReplace(s, tmps, '{#13#10}', [rfReplaceAll]);tmps := #10;s := WideStrReplace(s, tmps, '{#13#10}', [rfReplaceAll]);s := WideStrReplace(s, '=', '{#61}' , [rfReplaceAll]);s := WideStrReplace(s, '"', '{#34}' , [rfReplaceAll]);s := WideStrReplace(s, '''', '{#39}' , [rfReplaceAll]);Result := s;end;function DCode(s: WideString): WideString;vartmps: widestring;begintmps := #13#10;s := WideStrReplace(s, '{#13#10}', tmps, [rfReplaceAll]);s := WideStrReplace(s, '{#61}' , '=', [rfReplaceAll]);s := WideStrReplace(s, '{#34}' , '"', [rfReplaceAll]);s := WideStrReplace(s, '{#39}' , '''', [rfReplaceAll]);Result := s;end;function InternalCl(const Sr: WideString; var Dt: WideString): Boolean;varIndex: Integer;beginResult := False;if ClSrLst.Find(Utf8Encode(ECode(Sr)), Index) thenbeginIndex := Integer(ClSrLst.Objects[Index]);if Index > 0 thenbeginDt := DCode(Utf8Decode(ClDtLst[Index]));Result := True;end;end;end;procedure Addc(s: WideString);varUtf8s: UTF8String;beginUtf8s := Utf8Encode(ECode(s)) + '=';if clWrLst.IndexOf(s) = -1 thenbeginFIsModify := True;ClWrLst.Add(Utf8s);end;end;function ConvertLanguage(const s: WideString): WideString; varDt: WideString;beginif InternalCl(s, Dt) thenbeginif Dt <> '' thenResult := DtelseResult := s;endelsebegin{$IFDEF _WRITE_LANGFILE}Addc(s);{$ENDIF}result := s;end;end;procedure init;vari, ci, Index: integer;beginClDtLst.Add('no use');for i := 0 to ClSrLst.Count - 1 dobeginci := Pos('=', ClSrLst[i]);if ci = 0 thenIndex := ClDtLst.Add('')elseIndex := ClDtLst.Add(Copy(ClSrLst[i], ci + 1, High(Integer)));ClSrLst.Objects[i] := TObject(Index);ClSrLst[i] := Copy(ClSrLst[i], 1, ci - 1);end;end;initializationClSrLst := TStringList.Create;if FileExists(ExtractFilePath(ParamStr(0)) + cLangFileName) thenClSrLst.LoadFromFile(ExtractFilePath(ParamStr(0)) + cLangFileName);if Copy(ClSrLst.T ext, 1, Length(UTF8TextFileTag)) = UTF8TextFileTag thenClSrLst.Text := Copy(ClSrLst.Text, Length(UTF8TextFileT ag) + 1, high(Integer));ClDtLst := TStringList.Create;ClWrLst := TStringList.Create;ClWrLst.Sorted := True;init;ClSrLst.Sorted := True;finalization{$IFDEF _WRITE_LANGFILE}if FIsModify thenbegintryif FileExists(ExtractFilePath(ParamStr(0)) + cLangFileName) thenClSrLst.LoadFromFile(ExtractFilePath(ParamStr(0)) + cLangFileName);exceptOn EFOpenError do;end;ClWrLst.AddStrings(ClSrLst);tryClWrLst.SaveToFile(ExtractFilePath(ParamStr(0)) + cLangFileName);exceptend;end;{$ENDIF}FreeAndNil(ClWrLst);FreeAndNil(ClSrLst);FreeAndNil(ClDtLst);end.。
Delphi环境下多文档文本编辑器的设计与实现
刘晓星;胡畅霞;赵晓博
【期刊名称】《河北省科学院学报》
【年(卷),期】2005(022)0z1
【摘要】本文在分析多文档界面环境机制的基础上,在Delphi7编程环境下开发一个支持多文档界面的文本编辑器,实现了在一个编辑器程序实例中同时编辑不同的文本.文中给出了具体的编程方法和相关程序代码,并通过该编程示例展示出开发支持多文档界面的Windows应用程序的基本编程规范.
【总页数】2页(P174-175)
【作者】刘晓星;胡畅霞;赵晓博
【作者单位】石家庄铁道学院,河北,石家庄,050043;石家庄铁道学院,河北,石家庄,050043;石家庄铁道学院,河北,石家庄,050043
【正文语种】中文
【中图分类】TP3
【相关文献】
1.Delphi环境下模糊动态查询系统的设计与实现 [J], 张守玉;刘洋;眭俊宁
2.Delphi环境下测井曲线滚动显示的设计与实现 [J], 王文珍;熊晓东
3.VC++环境下的多文档多窗口应用程序开发 [J], 郑相锋;王庆;冯砚厅;李中伟;李文彬
4.多文档界面文本编辑器的设计与实现 [J], 袁灏;徐丹
5.Delphi
6.0环境下员工考勤管理系统的设计与实现 [J], 董大伟
因版权原因,仅展示原文概要,查看原文内容请购买。
最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的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选项,运行效果如下:六、进一步完善程序此时这个程序已经可以运行了,但它不等于就没有值得完善的地方。