delphi制作多文档界面
第6章Delphi教程

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章 菜单、工具栏和多文档的设计

➢选中菜单部件,点动属性中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编程_界面设计

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是一种编程语言和集成开发环境(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

}
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_用户界面设计

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(多⽂档界⾯)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 动态多页面

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
delphi多页组件(TPageControl)使用方法详解实例

? GoForward 参数:取值为Boolean 类型,True 值取下一页,False 值取上一页。
? CheckTabVisible 参数:取值为Boolean 类型,True 值为检查TTabSheet 的TabVisible 属性,如果TabVisible 属性为False,则不显示此页而直接跳至下一页或上一页;如果CheckTabVisible 参数为False,则不检查TTabSheet 的TabVisible 属性,即不管TabVisible 属性为True 还是False,都显示这一页的内容。
TPageControl 组件是一组页面集,用于构造一个多页对话框,它显示多个交互页(TTabSheet 对象),用户通过选择出现在控制上部的标签,可以选择不同的页。在设计时要加入新页,用鼠标右键单击该组件对象,出现一弹出菜单,选择“New Page”菜单项。
此组件用于需要显示大量信息的时候,屏幕上不可能把这些信息同时显示出来,解决的办法之一就是打开多个窗口,但是要管理好这些窗口不是一件很简单的事。最好的解决办法就是把这些信息分门别类,放在同一个窗口的不同页上,这样能够节省大量的屏幕空间,翻阅起来又非常方便,就好比一本书,如果把书的每一页拆下摊在桌子上,要占很大的地方,如果装订成书,就只占一本书的地方。
2.TPageControl 组件的重要属性
·ActivePage 指定或返回当前活动的页
·ActivePageIndex 此属性可以使某个序号的页成为当前活动的页
·Images 此属性用于指定一个图像列表
·PageCount 此属性返回多页组件的页数
·Pages 此属性返回由多页组件上所有页组成的数组
Delphi 第8章 界面设计

Win32选项卡的常用组件
在设置windows应用程序用户界面时,常用到: Tabcontrol组件 Pagecontrol组件 RichEdit组件 StatusBar组件 Toolbar组件
Tabcontrol组件
TabControl是一个标准windows风格的组件,通过它能够给 窗体创建选项卡,其为可视化组件。其运行界面如下:
FontDialog对话框主要属性
FontDialog组件的主要属性如下: Font属性:用来指定所需的字体。 MinFontSize:用来设置最小允许的字体大小,如果设为0则表 示 没有字体尺寸大小的限制。 Device:只有设置了此属性才能知道从哪里可以得到可用的字 体,可选择以下值: fdScreen:来源于屏幕字体(默认值) fdPrinter:来源于打印机字体 fdBoth:既可来源于屏幕字体,也可以来源于打印机字体。
第8章 窗体设计
菜单的创建
菜单界面及主菜单设计
弹出型菜单设计
工具栏的创建
状态栏使用 对话框设计
8.1 菜单设计
•创建主菜单 •创建快捷菜单 •使用菜单模板
主菜单设计
MainMenu控件的设计
方法一:选择standard标签页中的 ,用鼠标 右键单击 MainMenu 控件图标,打开一个 弹出式菜单,从中选择MenuDesigner命令, 将打开设计面板。
SaveDialog对话框
SaveDialog组件对应于“另存为“对话框,它的属性.方法 和事件与OpenDialog完全相同,只是Options属性中有一项 OfOverwritePrompt子属性,如果指定的文件名已存在,那 么选中此项,表示要显示一个警告框让用户选择是否要覆盖 已存在文件。其运行界面如下:
第3章Delphi常用组件

第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界面设计专辑[前言:]界面的美观和用户亲和性是应用软件成功的首要条件,因此界面往往是程序员最费心的地方。
在这个专辑中,将向读者全面介绍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)。
Delphi用户界面设计

Delphi用户界面设计
• 经过小组认真的讨论
– 将管理系统的所有功能分为两大模块
• 客户 • 管理员 对仓库数据库的数据的处理有权限限制
Delphi用户界面设计
• 主要实现的功能
– 查询货物
• 所有人都可以查询货物,无需权限
– 购买
• 需要客户输入帐号和密码
– 允许创建新帐号 – 显示该客户的信息和采购情况,并备份
• 购买后生成出库订单
Delphi用户界面设计
• 主要实现的功能
– 入库
• 需要管理员输入用户名和密码 • 修改后显示仓库入库情况,并备份
– 信息修改
• 客户
– 需要客户输入帐号和密码,然后可以修改自己的信息
• 管理员
– 需要管理员输入用户名和密码,然后可以修改自己和所有 客户的信息
Delphi用户界面设计
• 具体实现方式
– Delphi – 页面1
• 选择类型并 显示商品
• 客户登陆成功 后 可以采购
• 输出该客户的 import表
Delphi用户界面设计
– 页面2
• 可以注册新 用户
• 可以修改原 用户信息
Delphi用户界面设计
– 页面3
• 进行管理员 密码提示
• 密码正确后 可以修改 顾客、供应 商和商品 信息(给出 import表)
Delphi实用教程(第2版)[郑阿奇主编][电子教案]
![Delphi实用教程(第2版)[郑阿奇主编][电子教案]](https://img.taocdn.com/s3/m/c9ffc80cf12d2af90242e601.png)
图5.6 Frame窗体内组件的布局
图5.7 设置组件模板属性
5.2 VCL Form多窗体
(3)选择主菜单的FileSave命令项,保存这个Frame窗体的单元文件,注意 保存该单元文件时要使用自定义的文件名(如Test),而不要使用默认的单元文件名 Unit1,因为这样会在以后的使用中与Form窗体的单元文件名发生冲突。 (4)将所创建的Frame对象加入到组件选项页中。在Frame2窗体区域,在弹出 菜单的快捷菜单中选择Add To Palette菜单命令,就会弹出如图5.7所示的对话框,在 该对话框的Component name编辑框中填入组件名,然后在下拉列表中选择希望加入 的组件选项页,最后可用Change…按钮选择一个合适的组件模板图标。本例将组件 模板命名为test,添加到Templates选项页,并选择了如图5.7所示的图标。按“OK” 按钮,这个Frame对象就被添加到组件选项页中了,见图5.8。
5.2 VCL Form多窗体
5.2.1窗体的创建 新建一个项目时,项目中已包含了一个名为Form1的窗体。若要向项目中加入 新的窗体,有两种方法,一是执行FileNewForm-Delphi For Win32菜单命令, 项目中会增加一个名为Form2的新窗体,按此方法,可以为程序加入多个窗体;另 外一种方法是使用窗体模板,Delphi 的设计思想是代码重用性,所以系统提供了一 些用户可重复应用的窗体模板。使用窗体模板,可以快速地生成多种对话框窗体, 节省了大量的重复工作。例如要为项目增加一个About对话框窗体,可以选择 FileOther菜单命令,在Delphi Projects的Delphi Files中选择About Box对话框,项 目中会增加一个About窗体(图5.1)。
多文档界面设计

《 Delphi 程序设计》
7.2.2 TScreen类 类
1. 2. 3. 4. 5. 6. 7. 8. 9.
DesktopHeight 显示器当前屏幕分辨率的高度 DesktopWidth 显示器当前屏幕分辨率的宽度 Fonts 存储系统支持的所有字体名 ActiveForm只读 只读 在应用程序中当前活动的窗体 ActiveControl只读 当前活动窗口中获得焦点的窗口 只读 控件 Forms 包含着应用程序中显示的所有窗体, 包含着应用程序中显示的所有窗体,包 括对话框 FormCount只读 Forms数组长度 只读 数组长度 CustomForms 包含着应用程序中所有显示的窗体和属 性选项卡 CustomFormCount只读 CustomForm数组长度 只读 数组长度
7.2.1 TApplication类 类 7.2.2 TScreen类 类
《 Delphi 程序设计》
7.2.1 TApplication类 类
1.
TApplication类的属性 类的属性
①
② ③ ④ ⑤
⑥
Active 指明当前程序是否处于活动状态且 获得焦点 ExeName 返回应用程序的文件名和路径 Handle 指明应用程序主窗口的句柄 Icon 当程序最小化时将显示该图标 Title 指定应用程序的标题, 指定应用程序的标题,显示在任 务栏上 MainForm 惟一标识应用程序的主窗体
实验要求: 建立MDI应用程序,每个子窗口处理一个文档, 应用程序, ① 建立 应用程序 每个子窗口处理一个文档, 每个文档可由多张表格组成,添加菜单、 每个文档可由多张表格组成,添加菜单、工具 状态栏、对话框等组件,实现打开、 栏、状态栏、对话框等组件,实现打开、保存 文件,修改文字格式等功能。 文件,修改文字格式等功能。
delphi实验指导书0520

实验一:选择结构程序设计一、实验目的: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实现多语言界面的最简单方法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环境下多文档文本编辑器的设计与实现

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], 董大伟
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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选项,运行效果如下:六、进一步完善程序此时这个程序已经可以运行了,但它不等于就没有值得完善的地方。