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

前八章目录:

第一部分  基础
第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客户窗口
   可视窗体继承
   多态的窗体
   理解框架 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mastering Delphi 7(Delphi7从入门到精通)虽然是英文版的,不过是好书呀,压缩包含配书代码!Introduction(目录): Part I - Foundations (基础) Chapter 1 - Delphi 7 and Its IDE (DELPHI7及集成环境) Chapter 2 - The Delphi Programming Language (DELPHI7编程语言) Chapter 3 - The Run-Time Library (运行库) Chapter 4 - Core Library Classes (核心类库) Chapter 5 - Visual Controls (虚拟组件) Chapter 6 - Building the User Interface (建立用户界面) Chapter 7 - Working with Forms (从窗体开始学习) Part II - Delphi Object-Oriented Architectures (对象向导体系) Chapter 8 - The Architecture of Delphi Applications (应用程序体系) Chapter 9 - Writing Delphi Components (写Delphi组件) Chapter 10 - Libraries and Packages (库和包) Chapter 11 - Modeling and OOP Programming (with ModelMaker) (面向对象程序程序设计建造模块) Chapter 12 - From COM to COM+ (从。。。不用翻译了吧) Part III - Delphi Database-Oriented Architectures (数据库向导体系) Chapter 13 - Delphi's Database Architecture (数据体系) Chapter 14 - Client/Server with dbExpress (dbE.. 的客户/服务模式) Chapter 15 - Working with ADO (应用ADO) Chapter 16 - Multitier DataSnap Applications (多层DataSnap应用) Chapter 17 - Writing Database Components (写数据组件) Chapter 18 - Reporting with Rave (Rave报表) Part IV - Delphi, the Internet, and a .NET Preview (。。。预览) Chapter 19 - Internet Programming: Sockets and Indy (互联网编成。。。) Chapter 20 - Web Programming with WebBroker and WebSnap (。。。) Chapter 21 - Web Programming with IntraWeb (。。。) Chapter 22 - Using XML Technologies (运用XML技术) Chapter 23 - Web Services and SOAP (。。。) Chapter 24 - The Microsoft .NET Architecture from the Delphi Perspective (Delphi的.NET体系) Chapter 25 - Delphi for .NET Preview: The Language and the RTL Appendix A - Extra Delphi Tools by the Author (附录A) Appendix B - Extra Delphi Tools from Other Sources (附录B) Appendix C - Free Companion Books on Delphi (附录C) Index List of Figures List of Tables List of Listings List of Sidebars(我随便翻译的,不准笑,“。。。”表示没得翻。)
Mastering Delphi》是一本关于Delphi编程语言的经典书籍。Delphi是由Embarcadero公司开发的一种可视化、面向对象的编程语言。它是基于Object Pascal语言的,并且集成了许多强大的开发工具和技术。 这本书的主要目的是教授读者如何掌握Delphi编程,并在实践中构建高效、可靠的应用程序。它逐步介绍了Delphi的各个方面,从基本的语法和数据类型开始,到高级主题如多线程编程、数据库连接和用户界面设计等。它还涵盖了Delphi的应用程序框架和库,如VCL(可视化组件库)和FireMonkey(用于跨平台开发的界面库)。 这本书不仅提供了理论知识,也注重实践。每一章都有大量的示例代码和实战项目,可以帮助读者加深对Delphi的理解和运用。通过阅读和实践,读者可以学会如何使用Delphi创建窗体、处理事件、编写自定义组件、编译和调试代码,以及优化应用程序的性能等。 《Mastering Delphi》还介绍了一些企业级应用开发的最佳实践和技巧,如版本控制、错误处理、安全性和性能测试等。这些知识对于那些希望将Delphi应用于商业项目中的开发人员来说尤为重要。 总的来说,《Mastering Delphi》是一本全面而深入的Delphi编程指南。无论是初学者还是有经验的开发人员,都可以通过阅读这本书,掌握Delphi编程的核心原理和技术,并将其应用于实际项目中。它是一本值得推荐的书籍,可以帮助读者在Delphi开发领域中不断进步和成长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值