delphi精要之(二)

delphi精要之(二),第1张

概述Ctrl+Shift+方向键:将所选组件的位置移动一个栅格。  Shift+TAB:选择当前组件的上一个组件。 Esc:选择当前组件的容器(通常是 TPanel、TGroupBox、TForm等)。 Ctrl+J:插入标准语法代码。 Ctrl+Y:删除光标所在行。 Ctrl+BackSpace:向前删除一个单词。 Ctrl+Shift+G:插入 GUID 号。  Ctrl+Shift+C:完成已声

Ctrl+Shift+方向键:将所选组件的位置移动一个栅格。 

Shift+TAB:选择当前组件的上一个组件。

Esc:选择当前组件的容器(通常是 TPanel、TGroupBox、TForm等)。

Ctrl+J:插入标准语法代码。

Ctrl+Y:删除光标所在行。

Ctrl+BackSpace:向前删除一个单词。

Ctrl+Shift+G:插入 GUID 号。 
Ctrl+Shift+C:完成已声明类的实现。

F11:在Form/Unit 和 Object Inspector(对象检查器)之间切换。 

Ctrl+Alt+F11:d出Project Options(工程管理器)。

Delphi的真正精髓乃是Object Pascal, Object Pascal是VCL架构的基础和Delphi开发的原理所在。
因此,如果把 Delphi 爱好者比作厨师,那么 Object Pascal 就可以看做《食经》


老实讲,我也是在使用 Delphi 一段时间后才系统学习 Object Pascal 的。之所以下决心系统学习
Object Pascal,是因为在使用 Delphi 一段时间后,我发现: 
(1)虽然可以用Delphi做各种各样的界面,但是它们没有灵活性,好像手脚被捆,总是被死气笼罩
着。因为都是通过设计时放置组、控件来实现的,对程序运行时怎么用程序去控制它们,我就感到茫然。  
(2)写的代码老是编译时提示“Incompatible types”、运行时出现“raised exception、access 
violation”。 
(3)不知道如何使用指针、记录。 
…… 
在郁闷和困惑中折腾了一段时间,我感觉到自己最根本的问题是贫血,而不是练习的招数太少。
贫血的习武人练习的招数再多,出击也是无力的,因此必须首先补血,加强对 Delphi 的基础——Object 
Pascal 的学习。 
根据我的经验和理解,Object Pascal 的重点内容(或者说 Object Pascal 精要)有以下几方面:  
(1)数据类型及其兼容、转化关系。 
(2)过程和函数。 
(3)类和类成员。

一般地,声明变量时使用 Double和 Single,而在过程或者函数中需要定义可以传递任意实数的参
时,常使用 Extended,因为它的取值范围最大,可以兼容其他所有实数类型。 


var 
  ShortStr: ShortString; 
  ShorterStr: String[100]; 
begin 
  ShowMessage(IntToStr(SizeOf(ShortStr)));   {显示 256} 
  ShowMessage(IntToStr(SizeOf(ShorterStr)));  {显示 101} 

end; 


var 
  S: AnsiString;
  WS: WIDeString
begin 

 S := ’罗小平’; 
  WS := S; 
  ShowMessage(S[1]);    {显示的是乱码,因为S[1]取出的是’罗’的一半} 
  ShowMessage(WS[1]);   {显示’罗’} 
end


AnsiString 包含的字符是用单字节存储的,而 WIDeString 包含的字符则是用多个字节存储的。在
目前的 Delphi 版本中,WIDeString被实现为用 2 个字节存储一个字符。因此,使用 WIDeString来处理
多字节字符是十分方便的。


长字符串和宽字符串的内存是动态分配的,最大可至 2GB,因此,可以近似认为它们是无限长
的。


对于一个长字符串来说,可以将它看做是一个容纳字符的动态数组,因此,下面讲的动态数组的
一些特性,对长字符串来说也是适用的。而一个短字符串相当于一个容纳字符的静态数组,它占用的
内存大小是固定的。



讲字符串类型,不得不说到 PChar 类型。PChar 并不是 Pascal 的标准类型,而是为了与 *** 作系统
和其他语言兼容而专门设立的一个字符串类型。比如 API 函数 MessageBox 中有两个参数都要求是
PChar 类型。 PChar 声明一个以空字符(NulL 字符)结尾的字符串的指针



Oneset := [A]; 
  Oneset := Oneset + [A];  
{或者 Include(Oneset,A);  不要以为此时 Oneset 中有两个 A 元素,就好像我已经吃 
        饱了,再给我一碗饭但是我吃不下去} 



 Oneset := Oneset - [A];  
{或者 Exclude(Oneset,A);  此时 Oneset=[]了,不包含任何元素} 
  if Oneset = [] then 
    ShowMessage(’OK’); 


Array(数组)是我们再熟悉不过的数据类型了,数组有两种形式:静态数组和动态数组。动态数
组要首先使用 SetLength 分配用来存放元素的空间后才能使用。值得一提的是,如果使用 SetLength 给
动态数组重新分配空间,那么已有元素可以得到保留。如:

type 
  TOneArray = Array of Integer; 
procedure AddArrayItem(A: TOneArray; I: Integer);  {给动态数组增加一个元素
begin 
  SetLength(A,Length(A)+1);   {可以使已有元素得到保留} 
  A[High(A)] := I; 
end; 


file(文件)类型用来读写文件。不过在面向对象编程中,我们更倾向于使用TfileStream类和一些
类(如TStrings、TPicture、TBlobFIEld、TTreeVIEw等)的LoadFromfile、Savetofile方法来 *** 作文件。 


大多数数据类型(包括指针自己)都可以有对应的指针类型。如 PInteger、PBoolean、PString、
PVariant、PPointer 等等都是 Object Pascal 预定义的指针类型。在 Delphi 中定义一个指针类型的典型语
法是下面这个样子的: 

我们可以用一个简单的方法来判断某个类型或者变量实际上是否是一个指针:如果 SizeOf(一个类
型或者变量)返回(返回值是该数据类型要占据的内存大小,以字节为单位)4,而这个类型或者变量
的实际数据又并不是 4 个字节空间可以完全存储的,那么此时它很可能是一个指针。


其实我们和过程类型打交道的时候很多,是面熟而不知其名罢了。我们在 Object Inspector中随便
看一个按钮的 OnClick。OnClick是什么,是一个单击事件,后面的章节我们会讲,事件其实是一种特
殊的属性。那么 OnClick 既然是属性,它肯定是属于某种数据类型的,这个数据类型是什么呢?在
OnClick上按 F1 键,我们在帮助里看到: 
property OnClick: TNotifyEvent; 
也就是说,OnClick是 TNotifyEvent 类型的数据。再看 TNotifyEvent,发现是这样一种类型: 
type TNotifyEvent = procedure (Sender: TObject) of object; 


看起来像个怪胎。怪胎的真实名字叫做过程类型。因为 TNotifyEvent 后面加了“of object”关键
字,所以更准确地讲,TNotifyEvent 是一个方法类型。 

过程类型的变量可以当作普通变量一样使用,但更重要的用途是实现一个过程调用,或者作为参
数传递,从而实现回调函数功能。看下面一段代码: 

type   
  TOneFun = function(X: Integer): Integer;   {声明一个过程类型} 
 
function SomeFunction(X: Integer): Integer;  
{实现一个和 TOneFun 兼容的过程} 
begin 
  Result := X*2; 
end; 
 
function SomeCallBack(X: Integer; OneFun: TOneFun): Integer; 
{SomeCallBack 被调用时,回调函数 OneFun,并返回 OneFun 的执行结果} 
begin 
  Result := OneFun(X); 
end; 
 
procedure TForm1.button1Click(Sender: TObject); 
var 
  F: TOneFun;  
{声明过程类型变量,也可以直接声明:F: function(X: Integer): Integer;} 
  I,J: Integer; 
begin 
  F := SomeFunction;   {用过程类型变量 F 引用一个实际过程} 
  I := F(4);     {通过过程类型变量 F 直接调用函数 SomeFunction} 
  J := SomeCallBack(4,F);  {通过过程类型变量 F 回调函数 SomeFunction} 
  if I = J then 
    ShowMessage(’F(4)和 SomeCallBack 功能相同’); 
end; 
 

方法类型在 VCL中大 量使用,一个事件实际上就是一个方法类型的属性,也就是说是一个方法指针。

总结

以上是内存溢出为你收集整理的delphi精要之(二)全部内容,希望文章能够帮你解决delphi精要之(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1275367.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存