Delphi中使用比较少的一些语法

本文是为了加强记忆而写,大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要。

1,构造和析构函数:

a,构造函数:

一般基于TComponent组件的派生类,都应该使用overload关键字进行继承,Delphi中的对象没有什么复合的概念,在设计时,从简便的角度出发

一般都设计为耦合性较强,但是使用简单的派生类即可。构造函数不是必写的,除非“复合”这样的对象实现,当省略构造函数时,会由其父类来实现

新对象的建立。下面是几个常用的写法:

constructor TfmBaseScreen.Create(AOwner: TComponent);  //由于参数并没有变化,所以这里在声明的时候可以加override而不是overload
begin
  inherited; // Create(AOwner) ; //这里的Create默认是可以省略的。
  if AOwner is TPanel then
  Self.Width :=TPanel(AOwner).Width;
end;

//-------------------------

constructor TfmHuaPianScan.Create(AOwner: TComponent; AQuery: TADOQuery;
  AZDCode: string; AMvOutBillCode : string; MoveOutQuery : TADOQuery);   //这个声明时需要增加overload说明
begin
  inherited Create(AOwner);
  FQuery := AQuery; 这里实现的仅仅是私有变量的初始化,其实更多的应用是派生类成员对象的初始化,并需要在析构函数中进行释放。
  FZDCode := AZDCode;
  FMvOutBillCode := AMvOutBillCode;
  FMoveOutQuery := MoveOutQuery;
end;

//-------------------------

Constructor TDllLoader.Create(strDLLName : String);  //这是一个基于TObject的类,由于没有任何成员,所以这里Create什么关键字都不需要带。
Begin

FhDLL := LoadLibrary(strDLLName);
   ASSERT(FhDLL <> 0);
End;

b,析构函数

析构函数的使用比构造函数要严格一些,一定要在任何时候都使用override,以保证父类内存空间可以正确的释放。

下面是几个析构函数的写法:

Destructor TDllLoader.Destroy();   //虽然函数体内没有inherited但是声明时一定要加上override.

Begin

If FhDLL <> 0 then

begin

FreeLibrary(FhDLL);

End;

end

//-----------------------------------------

destructor TfmTest.Destroy;  //窗体类的析构,一定也要在声明的时候增加override.
begin
    temp.Free;   //成员的释放应该都安排在inherited之前。
    inherited;
end;

当然,在窗体类的构造和析构当中,有很多成员管理方式,可以直接通过消息-->事件模式来实现,并不需要引用类及对象设计模式。

直接调用窗体的OnCreate和OnDestroy就可以完成很多事情。

2,类方法及引用类

a,类方法

实现模式很简单,只需要在定义过程或函数时,增加一个class关键字就可以了,它的地位跟C语言中的静态方法的地位是一样的。它所处理的信息都是与类相关,

不能引用对象成员。

下面是TObject中的一个标准的类方法,用来返回一个类名:

class function TObject.ClassName: ShortString;

b,类中类(引用类)

普通类的语法规则是:

类名=class(父类名)

成员描述;

end;

而类中类的语法是:

类名=Class of 父类名

成员描述;

end;

类中类的父类似乎是其一个对象成员,它可以直接调用其父类的类方法,而类中类定义出的对象,其实是一个类。

我们可以在用类中类定义的对象中,使用构造和析构方法,构造方法可以调用对象的Create也可以调用其类中类的Create,

但是,析构函数不能使用类中类的类方法,只能使用其创建对象的析构。这种方法常用于将类作为参数的使用上,方便

在某一个方法之中,对其不明类(但明其祖类)的对象,进行类方法调用。

下面是一个标准使用的例子,这是Vcl中TApplication所带的方法,虽然名称是创建Form,其实对于任何基于TComponent的

对象都是可以创建的,其实现手法就是类中类:

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  // Set flag that TCustomForm constructor can read, so it knows if it‘s being
  // created as a main form or not (required when MainFormOnTaskbar is True)
  FCreatingMainForm := (FMainForm = nil) and InstanceClass.InheritsFrom(TForm);
  Instance := nil;
  try
{$IF DEFINED(CLR)}
    Instance := InstanceClass.Create(Self);
    Reference := Instance;
{$ELSE}
    Instance := TComponent(InstanceClass.NewInstance);  //这里是直接用的TComponent对象赋值一个派生类空间,面向对象是允许的
    TComponent(Reference) := Instance;  //这里的Reference是一个实参,这句用于指向创建的对象
    try
      Instance.Create(Self);   //NewInstance创建的空间只是分配一片空白区域,这里将其头部区域格式化成TComponent
    except
      TComponent(Reference) := nil;
      raise;
    end;
{$IFEND}

if (FMainForm = nil) and (Instance is TForm) then  //当系统中还没有明确主窗口时,而创建的对象是窗体对象,则在这里将其自动设置为主窗体。
    begin
      TForm(Instance).HandleNeeded;
      FMainForm := TForm(Instance);
      if MainFormOnTaskBar then
        SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
      ChangeAppWindow(Handle, not MainFormOnTaskBar, not MainFormOnTaskBar);
    end;
  finally
    if (FMainForm = nil) and (Instance is TForm) then
      TForm(Instance).FCreatingMainForm := False;
  end;
end;

类方法中的Self,指的是类本身,而不是对象,所以没办法象普通Self那样使用。

一个类必须创建具有其对象状态的成员,才是有意义的类。在我上一家公司中,见到有人卖弄高深的把全局方法都建立在一个类中,用类实现。

这样的类,既没有其多样的对象,在方法实现时,甚至一点与类相关的东西都没有,还不如建立一个公共方法单元。

一个标准的类,也不能仅仅是对一堆封装成员的Get和Set操作,应该在成员的逻辑处理中,简化其应有的方法,又要保留必要的变化细节。

3,

时间: 2024-08-27 22:20:42

Delphi中使用比较少的一些语法的相关文章

转:Delphi中使用比较少的一些语法

http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类,都应该使用overload关键字进行继承,Delphi中的对象没有什么复合的概念,在设计时,从简便的角度出发 一般都设计为耦合性较强,但是使用简单的派生类即可.构造函数不是必写的,除非“复合”这样的

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll

  调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton;

[转]Delphi中,让程序只运行一次的方法

program onlyRunOne; uses Forms,Windows,SysUtils, Dialogs, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var myMutex:HWND; begin myMutex:=CreateMutex(nil,false,'11111'); //名称只能全系统唯一. if WaitForSingleObject(myMutex,0)<>wait_TimeOut then begin Application.I

DELPHI中的多线程【深入VCL源码】

线程的基础知识 线程的组成.线程有两部分组成. 1.一个是线程的内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 2.另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量. 进程从来不执行任何东西,它只是线程的容器.线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中.这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作.因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空

Delphi中的指针类型

首先讲讲指针类型在delphi中是怎么定义的: 指针类型的定义语法 type <指针类型标识符>=^<基类型>: 指针指向动态变量的类型是由^符后的基类型来标识,^符号也就是指针类型,而C++中是用*符号来表示指针类型. 举例说明 type student = record    //定义个记录类型,与c++中的结构类型类似 name:string[8]; number:integer; sex:(b,g); age:integer; end; per = ^student;  /

Delphi中WebBrowser的使用技巧汇总

1>调用网页中已知对象 src := WebBrowser1.OleObject.document.getElementByIdx(’id1′).src 其实就是javascript中的 getElementByID 的函数 2>获得网页中的某个变量值 Html中的代码 : <script> var userID=123</script> 在delphi程序中这么调用 id := Form1.WebBrowser1.OleObject.Document.script.u

Delphi中使用TXMLDocument控件应注意的问题

今天写了一个类,其中用到了TXMLDocument控件.这个控件我是要动态生成的. 但是却遇到了非常奇怪的问题,下面分享一下 procedure TMainForm.Button1Click(Sender:TObject); Var XML:TXMLDocument; I:Integer; begin XML:=TXMLDocument.Create(nil); XML.LoadFromFile(ExtractFilePath(Application.ExeName)+'demo.xml');

Delphi中JSon SuperObject 使用:数据集与JSON对象互转

在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包含了Delta数据包,其数据格式远比普通的TDataset更复杂. 数据集字段信息,是一个完整的字典信息.因此,我们在JSON必须也建立字典信息,才能创建数据集的字段信息.我们设置其JSON信息如下: COLS:[字段列表信息],如: "Cols":[{"JsonType&quo

delphi中Webbrowser

1.获得网页中变量值 htm中<script> var currID=123</script> 程序中可以这么调用 id := Form1.WebBrowser1.OleObject.Document.script.currID 值得说明的是,变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currID不存在 2.执行网页中的函数 tmp := 'currID = getNextID(cu