您的位置:首页 > 编程语言 > Delphi

Mastering Delphi7 阅读笔记(摘要) 前八章

2006-12-26 09:41 459 查看
前八章目录:

第一部分 基础
第1章 Delphi7及其IDE
Delphi的版本
IDE概述
Delphi编辑器
窗体设计器
组件面板的秘密
管理项目
附加及外部Delphif具
系统生成的文件
对象库
Delphi 7中调试器的更新
小结
第2章 Delphi编程语言
核心语言特性
类与对象
封装
构造器
Delphi的对象引用模型
继承已有类型
滞后绑定与多态性
类型安全的转换
使用接口
异常处理
记录错误
类引用
小结
第3章 运行时库
RTL的单元
数据转换
关于货币转换的问题
使用SysUtils来管理文件
TObject类
小结
第4章 核心库类
RTL包、VCL与CLX
TPersistent类
TComponent类
事件
列表与容器类

核心VCL与BaseCLX单元小结
小结
第5章 可视控件
VCL与VisualCLX
TControl与派生类
打开组件工具框
控件相关的技术
ListView与TreeView控件
小结
第6章 建立用户界面
多页面窗体
工具栏控件
主题与样式
ActionList组件
工具栏容器
ActionManager体系结构
小结
第7章 使用窗体
TForm类
窗体直接输入
在窗体中绘图
特殊技巧:字母混合、颜色键和动画API
位置、大小、卷动和缩放比例
建立和关闭窗体
对话框和其他二级窗体
建立对话框
预定义对话框
About框与Splash屏幕
小结
第二部分 Delphi面向对象的体系结构
第8章 Delphi应用程序的结构
Application对象
从事件到线程
检查应用程序以前的实例
建立MDI应用程序
Delphi中的框架与子窗口
带有不同子窗口的MDI应用程序
可视窗体继承
理解框架
基窗体和界面
Delphi的内存管理器
小结

第一部分 基础

第一章 Delphi7及其IDE
相关的文件类型:(原书第38页开始)
.BMP,.ICO,.CUR,.BPG,.BPL,.CAB,.CFG,.DCP,.DCU,.DDP,.DFM,.DFN,.DLL,
.DOF,.DPK,.DPR,.DSK,.DSM,.EXE,.HTM,.LIC,.OBJ,.OCX,.PAS,.RES,.RC,
.RPS,.TLB,.TODO,.UDL
其它IDE相关文件类型
.DCI,.DRO,.DMT,.DBI,.DEM,.DCT,.DST

第二章 Delphi编程语言
本章包括以下主要内容:
类与对象
封装 private和public
使用属性
构造器
对象与内存
继承
虚拟方法与多态性
运行时类型信息
接口
异常
类引用

动态创制组件
procdure TForm1.FormMouseDown(Sender:TObject;....);
var Btn:TButton;
begin
Btn:=TButton.Create(Self);
Btn.Parent:=Self;
Btn.Left=X;
Btn.Top:=Y;
Btn.Width=Btn.Width+50;
Btn.Caption:=Format('Button at %d, %d',[X,Y]);
end;
private,protected,public,published访问标识符
private 专用于某个类的字段和对象方法,在声明的类单元外不能被访问.
protected 用于表示某个类的字段和对象方法有限的可见性,protected元素只能被当前的和它的子类访问.
public 专用于表示某个可以被程序代码中的任意部分访问的某个类的字段和对象方法,当然也包括在定义它们的单元中.
使用属性封装
属性是很有效的OOP机制,或者说非常适合实现封装的思想.
属性的定义示例:
property Month: Integer read FMonth write SetMonth;
property Month: Integer read FMonth write FMonth;
property Month: Integer read GetMonth write SetMonth;
类的高级属性:
只读属性,只写属性.
IDE对"设计时"属性,需用公布的访问标识符published关键字.
另一种使用公共的访问标识符声明的属性通常为"运行时".
可以定义基于数组的属性
属性中一些特殊指令,stored,default.
注意:通常可以修改一个属性或读它,也可以在表达中使用它,但不能将属性作为参数传递给过程或对象方法,因为因为属性不是一个内存位置,所以它不能用做var或Out参数;也不过能通过引用传递.
封将与窗体
构造器
构造器使用constructor关键字,一般使用标准名称Create,Create构造器会将新实例的所有数据初始化为零.还可以覆盖一个虚拟的构造器.
示例:
type
TDate=class
public
constructor Create; overload;
constructor Create(y,m,d: Integer); overload;
析构器与Free方法
析构器使用destructor关键字,一般使用未准名称Destory.就像构造器为一个对象分配内存一样,析构器调用将会释放内存,你可以覆盖默认的Destory析构器.
Free是TObject类的一个对象方法,可以由所有的类继承,Free对象方法会在调用 Destory虚拟析构器之前检查当前对象Self是否为nil,Free不会将对象自动设置为nil,这个工作需要我们自己来做.Delphi5中还有一个FreeAndNil用以用来释放一个对象并设置其它同时引用nil.
Delphi的对象模型
赋值对象
VCL的一些类有Assign对象方法,它可以执行这种复制操作.(继承TPersistent),如TDate);
继承已有类型(inherited)
保护字段与封装
继承与类型的兼容性
滞后绑定与多态性
覆盖,重定义方法(override)
虚拟方法与动态方法(virtual,dynamic)
抽象方法(abstract) 完整定义对象的方法,但不能被直接调用,用个子类要重定义它,(如Paint);
类型的安全转换
使用接口
当定义一个抽象的类表示带层次结构的基类时,会发现抽象类是如此抽象,以至于它只列出了一系列虚拟函数,并没有提供任何实际的实现代码,这种纯抽象的类还可以用一种特殊技术:接口来实定义.

技术上,接口不是一个类.
接口定义:
type
ICanFly = interface
['{XXXXXX-XXX-XXX-XXX-XXXXXXX}']
fucntion Fly:string;
end;
实现代码:
type
TAirplane = class (TInterfacedObject,ICanFlay)
fucntion Fly:string;
end;
异常处理:(try,except,finally,raise)
异常类Exception
类引用
暗示代码是对类本身(而不是实例)进行处理,类引用不是一个对象,只是对类的类型的引用,一个类的引用类型可以确定一个类引用变量的类型.
type
TMyClassRef = class of TMyClass;

var
AnObject:TMyClass;
AClassRef:TmyClassRef;
begin
AnObject:= TMyClass.Create;
AClassRef:= TMyClass;
类引用可以让用户在运行时处理类数据类型,上面的代码还可以写成
AnObject:= AClass.Create
Delphi在"运行时库"和VCL中声明了许多类的引用
包括:
TClass= class of TObject;
TComponentClass = class of TComponent;
TFormClass = class of TForm;
如Application.CreateForm(TForm1,Form1);第一个参数是类引用,第二个参数是变量
使用类引用创建组件
在IDE中,当用户从ComponentPlalette上选择一个新组件并将其添加到窗体时,实际上选择了一个数据类型,并建立该数据类型的一个对象.(示例ClassRef)

第三章 运行时库
System Unit包括以下Class
TObject
IInterFace,IInvokable,IUnkown,IDispatch,TInterfacedObject
TVarData,TVariantManger
TDateTime
TMemoryManager
包(Package)与模块支持代码,包括PackageInfo指针类型
一个更长的全局变量列表
线程支持代码
SysUtils Unit很大程度上是一个与操作系统有关的单元
包括字符串管理,多字节字符的本地化支持,从Excapion类及其它派生导常类,大量的字符串格式化常量,文件管理等
Match Unit 数学单元
SysConsts Unit
ConvUtils Unit 转换单元
StdConvs Unit 转换常量定义
DateUntils Unit 时间和日期单凶

TObject类
ClassName,ClassType,ClassParentInstanceSize,InheritsFrom与IS操作符类似

第四章 核心库类

RTL包,VCL与CLX

1.VCL

控件(子类) |----TWinControl子类(视窗控件)
组件类 |----TControl-------|
|----TComponent----| |----TGraphicCOntrol子类(非视窗控件)
| |----TComponent
TObject--| 其它(子类)
|
|----TPersistent

非组件类不能在组件板上使用,也不能直接拖入窗体中,担可以通过对象检验器对他们采取可视管理,作为其它属性的子属性或不同类型集合的项.所以,非组件类也可以与Form Designer交互.
组件类可以进一步划分为两人组:控件与非可视组件,控件组所有类派生于TCtonrol
控件在屏幕上有位置与大小,并设计时在窗体上显示的位置与运行时相同,控件有两个不同的子规格,基于窗口和图形化.
非可视组件 都不是控件(所有的类派生于TComponent),在设计时,其中有些组件可以显示(如:标准对话框),有些刚不能显示(如数据库表格组件).

2.CLX的结构
BaseCLX 库的核心,其中包括最顶级类(TComponent),以及一些通用的工具类(包括列表,容器,集合,流)
VisualCLX 可视组件的集合,通常称做控件,这部分更紧密地与操作系统有关.
DataCLX 所有与数据库相关的组件组成.实现是Delphi 6与KyliX所含新dbexpress数据库引擎的前端.
DataCLX还包括了ClientDataSet组件,现在叫MyBase.
NetCLX 所有与Interent相关的组件,从WebBroker框架到HTML生成器,从Indy(Internet Direct )到Internet Express.从新的Site Express到XML支持.
库的CLX专用部分
Delphi ActiveX(DAX) 框架为COM,OLE Automation,ActiveX以及其它与COM相关的技术提供了支持.
Decision Cube组件提供了在线分析操作(OLAP)的支持.但与BDE有关.

最后,Delphi安装包含了一些第三方组件,如设备图形的TeeChart,用于报表与打印的RAVE,以及用于Internet开发的IntraWeb. RAVE与IntraWeb也可以用于Kylix.

TPersistent类(继承自TObject)

源码:
{$M+}
TPersistent=Class(TObject)
private
procedure AssignError(Source:TPersistent);
protected
procedure AssignTo(Dest:TPersistent); virtual;
procedure DefineProperties(Filter:TFilter); virtual;
fucntion GetOwner:TPersistent; dynamic;
public
destructor Destory; override;
procedure Assign(Source:TPersistent); virtual;
fucntion GetNamePath:string; dynamic;
end;

像暗示的一样该类处理的是持续性;也就是说,将对象的值保存到文件中.
可以用Delphi默认的Streaming-Only对象(继续自TPersistent)实现"挂续性",因类这个类用{$M+}来编译的,标记会为类的分岂有此理部分生成护的RTL1信息.
Assign过程可以用于复制一个对象的实现值.DefindeProperties用于定制流系统并添加额外的信息(伪属性);GetOwner与GetNamePath对象方法由集合与其它特殊类使用,用于向对象检验器标识自己.
在设计时,Delphi使用窗体的一个假版本(代理"Proxy"),而不是真正的窗体. published关键字
通过名称访问属性.(Uses TypInfo)
if IsPublishedProp(Button1,'Caption') then
ShowMessage(GetPropValue(Button1,'Caption'));

TComponent类(继承自TPersistent)

所有权:当建立一个组件时,它可能赋给一个所有者组件,同时也要负责消除这个组件,所以每个组件都有一个所有者,并还可以做为其它组件的所有者.
看下面的源码:
Type
TComponent=class(Tersistent,IInterface,IInterFaceComponentReference)
pbulic
constructor Create(AOwner:TComponent); virtual;
procedure DestoryComponents;
fucntion FindComponent(const ANmae:string):TComponent;
procedure InsertCmponent(AComponent: TComponent);
procedure RemoveCmponent(AComponent: TComponent);

property Components[Index: Integer]:TComponent read GetComponent;
property ComponentCountIndex: Integer
read GetComponentIndex write SetComponentIndex;
property Owner: TComponent read FOwner;

组件数组: Components[index]

改变所有者(Owner):
Button1.parent:=tmpfrm;
Button1.Owner.RemoveComponent(Button1);
tmpfrm.InsertComponent(Button1);

名称属性(Name):有一部分和名称相关的属性.
如果改变控件的Caption属性或Text属性之前设置它的Name属性,新名称会自动复制给标题.

Delphi利用组件名来建立与事件相关的对象方法的默认名称,(如Button1扣OnClick事件默认为Button1CLick).
对于一个含组件名称的字符串,可以通过调用其所有者的FindComponent来获得其实例.如果没有发现,则返回nil.
如:
var Comp: TComponent;
Comp:=FindComponents('Button1');
另外,Delphi还包含一个FindGlobalComponet函数,用于查找顶级组件,基本上是窗体或数据连接志,具有给定的名称.
删除窗体字段
当向窗体中添加组件时,Delphi会向DFM文件添加其完整描述,包括其所有属性,产向Pascal文件的窗体类声明中添加相应的元素.当建立窗体时,Delphi会装载DFM文件,并使用它得建所有组件而且还有设置他们的属性.然后它会使用与其Name属性相应的窗体元素连接新对象.
因此,拥有一个没有名称的组件是可以的,如果应用程序运行时不处理组件名改动它,见分见可以从对象检验器中删除组件的名称,如固定文本的静态标签...
这样会减小窗体对象的大小,减小DFM的大小,最终减小EXE的大小.
注意:如果删除组件名,要确保窗体上使用的用个类至少保留一个有名称的组件,这样链接器才会将它链接到所需的代码中.如:如果删除所有TLable的组件名称,Delphi链接器会从可执行文件中删除TLable类的现实,这样运行时会显示错误消息说明该类型能使用,可以通过RegisterClass或RegisterClasses来避免这样的错误.
隐藏窗体字段
由于published原因,可以通过将组件移动类声明的专用部分中.
TForm1=class(TForm)
procedure Button1CLick(Sender:TObject);
procedure FormCreate(Sender:TObject);
priavete
Button1:TButton;
Edit1:TEdit;
现在,运行程序,窗体会正常装载,但因为专用元素没有初始化,所以上面的事件将使用nil对象引用 .
如果使用下面的代码,会出现另一个错误,虽然专用声明会使链接器与类的现实相连接 ,但流系统需要知道类名称来确定类引用的位置,而类引用用来在装载DFM文件时建立组件,也就是注册组件类的问题.
procdure TForm1.FormCreate(Sender:TObject);
begin
Button1:=FindComponent('Button1') AS TButton;
Edit1:=FindComponent('Edit1') AS TEdit;
end;

注册组件类的代码如下:
initialization
RegisterClasses([TButton,TEdit]);
上面这样的努力使我们得到了高度的封装特性,使窗体的组件与其它窗体隔离开来.
可定制的Tag属性
Tag属性根本没有什么效果,它只是一个附加内存地址,用于存储专用值.可以存储指针,对象或任何四个字节宽的值.
事件
理论上事件是向一个组件或者控件发送请求的结果,并且该组件或控件可以响应该消息.
实践中,组件的事件处理程序一般是控制组件所在的窗体的对象方法,而不是组件自己.也就是说,组件依赖于它的所有者来处理它的事件,这项技术叫授权(Delegation)
说明:Delphi的事件方法和Java不同,它使用某个系列事件带有方法的监听器类,由这些监听器方法调用事件处理程序,C#和.NET使用类似的类授权思想.
对象方法指针
事件要依赖于Delphi语言的一定特定性质:对象方法指针.它就像一种过程类型,但他引用的是对象方法.技术上对象方法指针就是具有隐含Self参数的过程类型.
对象方法指针变量存储了两个地址:对象方法代码的地址与对象实例的地址,当调用对象方法代码时,对象实例的地址将显示为对象方法体中的Self.
对象方法指针的声明:
type
IntProceduralType= procedure (Num:Integer);
IntMethodPointerType= procdure (Num:Integer) of Object;
下面是Delphi用来定义事件处理程序的代码框架,以及一个窗体的相关方法;
type
TNotifyEvent= procedure (Sender:TObject) of object;
MyButton=class
OnClick:TNotifyEvent;
end;
TForm1= class(TForm)
procedure Button1Click(Sender:TObject);
Button1: MyButton;
end;
var
Form1:TForm1;
在过程中可以编写以下代码:
MyButton.OnClick:= Form1.Button1Click;
这个代码与VCL的真正区别是OnClick是一个属性名称.
事件就是属性
这意味着,要处理组件的事件,可以赋予对象方法相应的事件发慌.同时,多个事件可以共享一个事件处理程序,或者在运行中变化事件处理程序.
列表与容器类
除了使用标准数组与动态数组外,还有三组:简单列表.集合与容器.
列表与字符器列表
列表类TList及两个字符串列表TStrings与TStringList.
TList定义指针列表,可存储任意类的对象,与动态数组不同的时,动态数组为所含对象指定了特定的类型,并在编译时执行了相应的检查.
TStrings是一个代表所有字符串列表形式的抽象类.只用做可存储字符串自身的组件属性,如列表框.
TStringList是TStrings的子类,用自己的存储器定义字符串列表.用户可以在程序中用该类定义自己的它符串列表.
TStrings和TStringList还有一些备份用的对象方法,如SaveToFile,LoadFromFile等.
可以通过Count属性,IndexOf查找以及排序支持.TList类具有Assign对象方法,除可以拷贝源代码外,还可以在两个列表上完成集合操作,包括逻辑与,或,导或操作.
示例代码
var
s1: TStringList;
idx: integer;
begin
sl:= TStringList.Create;
try
sl.Add('One');
sl.Add('two');
sl.Add('three');
//later
idx:=sl.IndexOf('two');
if(idx>=0) then
ShowMessage('String found');
finally
sl.Free;
end;
end; 名称值匹配
如果我们在一个列表中加入"Lastname=John",就可以通过Indexofname或Values数组属性来搜索这个匹配,检查是否存在,如通用Values['LastName']来获得'John'这个值.
Delphi7允许自己定制分割符.
集合:
两个VCL类,TCollection与TCollectionItem,TCollection定义了一个同类对象的列表,都归集合类所有,集合中的对象必须派生自TCollectionItem类.
容器类:
TObjectList类:TObject对象的列表,OwnsObjects属性.
TComponentList类:代表一个组件列表,完全支持解除通知.
TClassList类:一个类引用列表,继承自(TList),不要求解除.
TStack类与TObjectStack类:代表指针与对象的列表,并符合堆栈的LIFO规则(后进先出).
TQueue类与TObjectQueue类:代表指针与对象的列表,符合FIFO规则(先入先出).
哈希相关列表:
TBucketList与TObjectBucketList
类型安全容器与列表:
容器与列表存在一个类型安全的问题.为了解决这个瓿,可以为给定的数据类型和形式建立具体的列表类.有两种方法现实:
1.从列表类中派生新类,并定制Add对象方法和Items访问对象方法.
2.建立包含一个TList对象的全新类,并使用适当的类型检查将新类的对象方法与内部列表对象起来,该方法定义了一个包装类,它"包装"了一个已有对象.
流:包括文件管理.内存,套接字与其它按序列排列的信息源.源的理念是在读取数据的同时进行数据的传递.
TStream类:
Size和Position属性.所有的流对象都有一个特定的大小,并且必须在流中为进行读或写信息操作指定一个位置.TStream类中包含在部分虚拟与抽象的对象方法操作,派生类要负责现实它们.
可以使用特定的组件与流之间进行交互的操作,很多VCL类定义了LoadFromStream,SaveToStream方法,包括TStrings,TStringList,TBlobField,TMemoField,TIcon与TBitmap.
特定的流类:
THandleStream:用来处理Window文件句柄代表的磁盘文件.
TFileStream:用来处理同文件名肛表的磁盘文件,它继承自THandleStream.
TCustomMemoryStream:是存储在内存中的流的基类,不能直接使用.
TMemoryStream:用来处理内存的一系列字节,它继承自TCustomMemoryStream.
TStringStream:提供简单的方法,用来将流与内存中的字符串联系起来,这样就可以用TStream接口访问字符串,还可以与另一个流相互复制字符串.
TResourceStream:用来处理内存中的一系列字节,并对应用程序可执行文件相连的资源数据提供只读访问(DFM就是一例),它继承自TCustomMemoryStream.
TBlobStream:用来为数据库Blob字段提供简单的访问.除了BDE,还有TSQLBlobStream,TClientBlobStream.对于Blob字段,用一个类型的数据集合都使用一个特定的流类,所有这些类都派生自TMemoryStream.
TOleStream:用于通过OLE对象提供的流的接口进行读写信息的操作.
TWinStocketStream:为套接字连接提供流支持.

TReader与TWriter类:为根据流数据的类型简化其装载与保存操作.它们派生自通用的TFiler类.
如:stream:=TFileStream.Create('C:/test.txt',fmCreate);
w:= TWriter.Create(stream,1024);
w.WriteInteger(10);
w.WriteString('str');
w.Free;
stream.Free;

流与持继性:
将窗体保存在一个流中的代码:stream.WriteComponent(From1);
流类提供了两个对象方法,用于读写这种定制的组件资源数据:
WriteComponentRes,ReadComponentRes
使用ZLib压缩流
Delphi7还定义了一些流类:TCompressStream,TDecompressStream
Classes单元
很多枚举类型(如TNotifyEvent),很多导常类
核心库类(TPersistent,TComponent等)
列表类, 集合类,(TList,TrhxeadList,TInterfaceList,TCollection,TCollectionItem,TOwnedCollection,TStrings,TStringList.
流类,还有TFiler,TReader,TWriter,以及内部用于DFM分析的DParser类
工具类(如二进制处理的TBits,一些工具子例程,),还有很多注册类,通知系统存在着一些可替换的组件,类,特殊工具函数等.
TDataModule类,窗体可以选择的一个简单的对象容器.数据模块只能包含非可视组件,常用于数据库和Web应用程序中.
与接口相关的类,如TInterfacedPersistent.
TRecall类,用于维护一个对象的临时拷贝,对于基于图形的资源特别有用.
TClassFinder类,用于发现一个注册过的类,代替了FindClass对象方法.
TThread类,为多线程应用程序提供了独立于操作系统的核心支持.
其它核心单元
TypInfo单元,包括对分布属性的用于访问RTTI信息的支持.
SyncObjs单元,为线程同步化包含了一些通用的类.
ZLib单元,包括压缩和解压缩流.
ObjAUto单元,包含代码可以通过名称秋调用对象发布的方法.
RTL还包括了一些函数和过程单元,如Math,SysUtils,Variants,VarUtils,StrUtils,DateUtlis等.

第五章 可视组件
本章包括以下内容:
VCL与VisualCLX
TControl,TWinControl,TWidgetControl
标准组件综述
基础与高级菜单的构造
修改系统菜单
菜单中的图形与列表框
自绘制与式样

VCL与VisaulCLX
Delphi6双重的库支持
相同的类不同的单元
DFM与XFM
uses语句
{$ *.dfm}与{$ *.xfm}
禁止双重的库帮助支持
选择一个可视库
在Liunx上运行它
库的条件编译$IFDEF LINUX
转换已有的应用程序
DFM->XFM {$R *.DFM}->{$R *.XFM}
更新所有uses语句
TControl与派生类
可视组件TControl继承自TComponent为,它在CLX与VCL中使用,并定义了通用的概念,如控件的位置,大小,父控件控制它否,在实际执行时,必须引用它的两个子类,在VCL中是TWinControl,TGraphicControl,在CLX中是TWidgetControl,TGraphicCOntrol.
基于Windows的控件(窗口化控件).VCL中的TWinControl有一个窗口句柄,引用内部Window结构的数值.CLX中的TWidgetControl有一个Qt句柄,对内部的Qt对象引用.控件可以检索输入焦点,有些还可以包其他控件.
图形控件(非窗口化控件) 它们没有句柄,不能检索焦点,不能包含其它控件,这些控件继承自TGraphicControl,并由其父窗口来绘制,向它们发送与Mouse相关的事件和其它事件.(如Label,SpeedButton)
Parent与控件
控件的Parent属性说明了哪一个控件负责显示它.与Owner属性一样,可以对Parent属性采用逆向操作,Controls数组事实上列出了当前控件的甩有子控件,从0-Controlscount-1.
与组件大小及位置有关的属性
位置:Left,Top
大小:Height,Width
当改变一些位置或大小属性性,最终会调用SetBounds方法.直接调用可加速.另一个方法是:BoundsRect,返回控件的矩形边界,并访问访问:Left,Top,Height,Width.
组件的位置总医院与其父组件的客户区有关.对窗体,客户区就是框内的区域(但不包括边框本身).另外,控件的坐标总是与父控件有关,父控件通常是窗体,也可能是面板或其它容器组件.
激活和可见属性
Enabled禁止属性.
Hide方法或将Visible属性设置为False隐藏组件.
如果组件的父组件被隐藏,即使该组件设置为Visible,用户也看不到它.
因些,还有另一个属性,Showing,是一个运行时只读属性,表示组件是否真的可见.也就是说,如果组件是可见的,哪么父组件是也见的,父组件的父组件也是可见的....
字体
Color,Font属性.
ParentColor,ParentFont用来说明控件是否使用与父组件相同的字体和颜色.
颜色
类型TColor可以使用常量ClBule,clSilver,clWhite,clGreen,clRed,clMoneyGreen,clSkyBlue,clCream,clMedGray.
VCL包括预先确定的Windows的系统颜色,如clWindow,clActiveCaption等.
另外,使用数值(四字节16进制数)指定TColor.
如:$00FF0000代表蓝色,$0000FF00代表绿色,$000000FF代表红色
还可以使用RGB函数.
function RGB(red,green,blue:Byte):Cardinal;
begin
Result:=blue+green*256+red*256*256;
end;

TWinControl类(VCL)
在Delphi中,任何TWinControl类都可以覆盖WndProc方法,工为WindowProc属性定义一个新值.然而,Windows消息可以通过提供的专门的消息处理程序进行跟踪.VCL甚至可以将这些低级消息转换为事件.
TWidgetControl类(CLX)
在CLX中,每个TWidgetContol都有一个内部Qt对象.可通过Handle属性引用 它.虽然属性与Windows中的同名,但实质不同.
TWidgetControl对象通常包含相应的Qt/C++对象.CLX类使用了迟滞构造.
实际上每个VisualCLX组件都有两个相连的C++对象:Qt Handle,Qt Hook.
与Windows不同,Qt定义了两种不同类型的事件
事件(Events) 是输入的转换或系统事件(如按键,Mouse移动,绘图)
信号(Signals) 是内部组件事件(对应VCL内部抽象操作,如OnCLick,OnChange)
打开组件工具框
文本输入组件
Edit组件(CLX的Edit没有Undo机制,另外PasswordChar属性被EchoMode属性取代)
LabeldEdit控件
MaskEdit组件
Memo与RichEdit组件
TextViewer CLX控件
选择具体选项
CheckBox与RadioButton组件
GroupBox组件
RadioGroup组件
列表
ListBox组件 Items,ItemIdnex,ExtendedSelect,SelCount,Columns
ComboBox组件 Style[csDropDown,csDropDownList,csSImple]
CheckListBox组件
ComboxBoxEx与ColorBox组件
ListView与TreeView组件
ValueListEdit组件
范围
ScrollBar组件
TrackBar组件与ProgressBar组件
UpDown组件
PageScroller组件
ScrollBox组件
命令
最后一类,与命令有关,该组中的基本组件是TButton(或push按钮)
Commands
State-setters
Radio Items
Dialog Openrs
命令与动作
ActionList,ActionManger
菜单设计器
MainMenu,PopupMenu
控件的相关技术
处理输入焦点 TabStop,TabOrder, OnEnter,OnExit
控件的锚标志 Anchors,Constraints
窗体分割技术 Splitter组件,Algin属性
加速键 &XXXX,AutoHotkeys属性
使用浮动提示 Tooltip,ShowHint属性,HintColor,HintPause,HintHidePause,HintShortPause属性
定制提示 OnShowHint事件
自制控件与样式
自绘制菜单项 OwnerDraw属性
颜色列表框
图形索引列表 ImageList
DragTree的可移植版本

第6章 建立用户界面
本章包括下列内容
多页面窗体
页与页标
ToolBars与StatusBars
主题与样式
Actions与ActionList
Delphi6中的预定认动作
ControlBar与CoolBar组件
工具栏与其他控件的停放
Action Manager的体系结构

多页面窗体
PageControl(TabSheet)
TabControl
向导用户界面
工具栏控件
工具栏中的菜单与组合框
简单的状态栏
主题与样式
CLX样式
WIndowsXP 主题
ActionList组件 基类TBasicAction,派生类TContainedAction能使干什么展现在动作列表或动作管理顺路上,派生类TCustomAction链接动作对象上的菜单项和控件属性与对象方法.最后一个是备用的TAction源类.
每个动作对象都是通过ActionLink对象与一个或多个客户对象连接.
最后,动作对象是由于ActionList或ActionManger组件拥有的.这是该机制中唯一显示在组件面板上的类.动作列表组件会接收指定动作,对象没有处理的可执行动作,解发OnExecuteAction事件.
Delphi中预定义动作
文件:Open,Save as,Open with,Run,Print Setup,Exit
编辑:Cut,Copy,Paste,Select All,Undo,Delete
RichEdit:Blod,itaic,underline,strikeout,bullets...
MDI: Arrange,Casecade,Close,Title,Minimize...
DataSet:apply,revert,undo...
Help:
Search:Find,Find Fist,Find Next,Replace
Tab与Page:向前一页,下一页导航
Dialog:激活颜色,字体,打开,保存,打印对话.
List:Clear,Copy,Move,Delete,Select All
Internet:浏览URL,下载URL,发信
Tools:定制动作框对话.
ControlBar与CoolBar组件
工具栏与其他控件的停放
Action Manager的体系结构
ActionManager组件是ActionList的替代器
ActionMainMenuBar控件是一个工具栏用于显示基于ActionManager组件动作的应用程序菜单.
ActionToolBar控件是一个基于ActionManger组件动作的,用来放置按钮的工具栏.
CustomizeDlg组件包括能让用户基于ActionManger组件定制应用程序用户界面的对话框.
PopupActionBarEx组件是应该使用的特殊组件,它使弹出菜单与主菜单等用户界面保持一致.(Delphi7不包括该项组件,但可能单独下载)
移植现有程序
使用列表操作(List Actions)

第7章 使用窗体
本章包括以下内容:
窗体样式,边框样式和边框图标
鼠标和键盘输入
窗体绘图和特殊效果
定位,缩放和滚动窗体
创建与关闭窗体
模态与非模态对话框和窗体
动态创建二级窗体
预定认对话框
建立Splash屏幕

TForm类
使用简单窗体
窗体的类型(FromStyle属性[fsNormal,fsMDIForm,fsMDIChild,fsStatOnTop])
边框类型(BorderStyle[bsSizeable,bsSingle,bsNone,bsToolWindow,bsSieToolWin])
边框图标(BorderICons[biSystemMenu,biMinimize,biMaximaize,biHelp])
设置其它窗口样式:
可以通过覆盖CreateParams虚拟函数来自己修改样式(FormStyle及BorderStyle等)
public
procedure CreateParams (var Params: TCreateParams); override;

procedure TForm1.CreateParams (var Params : TCreateParams);
begin
inherited CreateParms(Parmas);
Params.Style := (Params.Style or ws_Popup) and not WS_Caption;
end;
通过以上代码建立一个没有Caption的窗体.使用Label代替了窗体的Title
为了使伪造的标题正常使用,需要截取WM_NCHitTest,把对Label区域的操作转到窗体的Title上.
procudure TForm1.WMNCHitTest(var Msg: TWMNCHitTest)
begin
inherited;
if (msg.Result=htClient) and
(Msg.YPos<Label1.Hieght+Top+GetSystemMetrics(sm_cyFrame)) then
msg.Result:=htCaption;
end;
窗体直接输入:
键盘直接输入(KeyPreview属性,OnKeyPress事件)
获得鼠标输入(OnClick,OnMouseMove,OnMouseDown,OnMouseUp,OnMouseWheelDown,OnMouseWheelUp)
标事件的参数,Button[mbRgiht,mbLeft,mbCenter],Shift[Alt,Ctrl,Shift],x,y
在窗体上绘图:(OnPaint事件)
位置,大小,卷动和缩放比例
窗体位置Position,Left,Top,Width,Height,WidnowState属性,
Position[oDesgigned,poDefault,poDefaultPosOnly,poDefaultSizeOnly,poScreenCenter]
WidnowState[wsNomral,wsMinimized,wsMaximized]
抓取屏幕(ScreenSnap,SnapBuffer)
ClientHeigth,ClientWidth属性
限制窗口大小(Constraints属性,OnCanResize,OnCanContrainedResize事件)
滚动窗体(AutoScroll,HorScrollBar对象,VertScrollBar对象)
设置窗体比例(窗体的ScaleBy方法,PixelsPerInch属性,Scaled属性)
AutoScroll:=false;
ScaleBy(50,100);

建立和关闭窗体
窗体建立事件 OnCreate,OnShow,OnActive,OnResize,OnPaint
关闭窗体 OnCloseQuery,OnClose,OnDestory
TCloseAction[caNone,caHide,caTree,caMinimize]
对话框及其它二级窗体
向程序添加二级窗体
在运行时建立二级窗体(Show,ShowModal)
with TForm3.Create(Applicaton) do
show;
建立对话框(BoderStyle属性为bsDialog)
预定义对话框
Windows通用对话框(Open Dialog,Save Dialog,OpenPictureDialog,FontDialog,ColorDialog,Find,Replace)
消息框(MessageDlg,MessageDlgPos,ShowMessage,ShowMessagePos,MessageBox,InputBox,InputQuery
Abount框与Splash屏幕

第二部分 Delphi面向对象的体系结构

第八章 Delphi应用程序的结构
本章包括以下内容:
Application和Screen全局对象
Windows消息和多任务处理
后台进程和多线程
查找应用程序的上一个实例
MDI应用程序
可视窗体继承
框架
基窗休和界面
Delphi的内存管理器

Aplication对象
TApplication类的一个全局对象,在TForm单元定义,并在Control单元中创建,一些属性可以通过Project Options对话框的Appication页设置.
Hints,帮助系统,应用程序激活,最小化,恢复,全局异常处理,通用应用程序信息
显示应用程序窗口(Appication也有息的窗体的)
激活应用程序与窗体
使用Screen对象跟踪窗体
从事件到线程(计时器Timer组件,后台计算,Application全局对象的ProcessMessage方法)
事件驱动的编程(Delphi的工具WinSight)
Window消息发送
后台处理与多任务
Delphi中的多线程(TThread类)
检查应用程序以前的实例
搜索主窗口的一个副本(FindWindow,SetForegrundWindow)
使用互斥对象(WaitForSingleObject)
查找Window列表(EnumWindows)
处理用户定义的Window消息
if FoundWnd<>0 then
begin
if not IsWidnowVisible(FoundWnd) then
postMessage (FoundWnd,WM_App,0,0);
setForegroundWindow(FoundWnd);
end;

public
procedure WMApp(var msg:TMesasge); message WM_App;

procdeure TForm1.WMAp(var msg:TMessage);
begin
Application.Resotre;
end;
建立MDI应用程序
Delphi中的框架与子窗口
带有不同子窗口的MDI应用程序
子窗体与合并菜单
主窗体
子类化MDI客户窗口
可视窗体继承
多态的窗体
理解框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: