Delphi程序设计之--惯用法

Delphi --技巧探索:  
{ No. 1 }
创建模式窗体的句子:
class procedure TMyForm.RunForm(AObj1, AObj2: TObject);
var
vForm: TMyForm;
begin
vForm := TMyForm.Create(Application);
with vForm do
Try
 InitForm(AObj1, AObj2);
 ShowModal;
Finally
 Free;
end;
end;
//*说明:
通过class声明的函数,类似与VC中的静态函数;使用语句:TMyForm.RunForm(vObj1, vObj2);
其他具体的,参考:Delphi 帮助中的,class 类说明。
强调这个惯用法,就是为了:
1、如果此窗体在多处被使用,那么可以保证统一都调用此段代码;
2、如果功能上有所修改,比如:根据ShowModal的返回值不同进行处理,那么只修改此函数就行了。
3、程序封装性好,易于维护和工作交接。*//

{ No. 2 }//Tag 的使用
窗体工具栏按钮事件的响应
procedure TMyForm.RunOperate(ATag: Integer);
begin
 Case ATag of
 1: MyButton.Color := clRed;
 2: MyButton.Color := clGreen;
 3: MyButton.Color := clBlack;
 end;
end;

procedure TMyForm.ToolBtnClick(Sender: TObject);
begin
 RunOperate(TControl(Sender).Tag);
end;

如果你在某下拉菜单中,也需要执行类似功能则
procedure TMyForm.MenuItemClick(Sender: TObject);
begin
 RunOperate(TMenuItem(Sender).Tag);
end;

//*说明:
1、结构清晰
2、相关的信息集中,比较容易查错、修改和维护
3、提高程序的适应、扩展能力;比如现在要求不在工具栏按钮中实现,而要求在不同按钮中实现,则修改容易。
建议:每个分类后面只跟一行或不多的几行代码,如果代码比较多,使用过程函数替代。
比较有意思的是,我经常如下写:
Case btnMyButton.Visible of
{ 显示 } True: ...
{不显示} False: ...
end;    *//

 

{ No. 3 }//事件指针做参数
//对于列表等的读取使用事件指针的方式
type
 TDataSetEvent = procedure (DataSet: TDataSet; AIndex, ACount: Integer) of Object;
//从 TADOQuery派生而来的类
procedure TMyADOQuery.EnumRecord(AWhereStr: String; APro: TDataSetEvent);
begin
 Close;
 SQL.Clear;
 SQL.Add('Select * From Table1');
 if AWhereStr <> '' then
   SQL.Add('Where ' + AWhereStr);
 Open;
 While Not Eof do
 begin
   if Assigned(APro) then APro(Self, RecNo, RecordCount);
   Next;
 end;  
 Close;
end;

//*说明:
此方法来自与Window中,枚举当前所有子窗体的API函数,EnumChildWindow
1、原则:尽量将数据读取与数据显示、数据处理等分离;如:MVC等都是此目的。
2、程序扩展性增强,如果您原来希望在列表中显示或处理某列信息,后来改为用ComboBox,则在修改程序时,不在阅读数据读取部分,只需要修改信息显示等即可。又比如,现在要求您在读取记录时,用进度条显示读取进度等。
*//

 

{ No. 4 }//常量数组

{ 在 No.2 中,实现了如下的内容
procedure TMyForm.RunOperate(ATag: Integer);
begin
Case ATag of
1: MyButton.Color := clRed;
2: MyButton.Color := clGreen;
3: MyButton.Color := clBlack;
end;
end;
}
//那么用数组方式实现,则就比较理想了
procedure TMyForm.RunOperate(ATag: Integer);
const
 MyButtonColorMax := 3;
 MyButtonColor: array [1..MyButtonColorMax] of TColor = (clRed, clGreen, clBlack);
begin
Case ATag of
1..MyButtonColorMax:  MyButton.Color := MyButtonColor[ATag];
101:....
end;
end;

//*说明:
对于数组方式使用,只要注意数组的上限或下限使用常量来实现,然后在以后使用中都尽量使用此常量进行数组循环读取就行了。
*//

 

{ No. 5 }消息机制 减少类公共函数
//如何让一个窗体中,尽量减少公共函数的定义;
{ 比如:要实现一个当前窗体控件的属性列表窗体,当需要刷新属性窗体;改变某属性值;添加新的属性等;会有很多需要交互的信息。如果我们使用类公共函数,则需要定义很多的公共函数。同时,如果需要进行窗体类型转换,转换为目标窗体类型才可以使用公共函数。所以,会遇到两个单元需要互相包含的情况 }
//解决方案:
TfrmMyForm = class(TForm)
 FfrmProperty: TForm;
end;

...
 FfrmProperty := TfrmProperty.MyCreate(Application, Self);
...

//当需要刷新属性窗体时
 FfrmProperty.Perform(WD_REFRESHPROPERTYLIST, 0, 0);

TfrmProperty = class(TForm)
private
 FMyForm: TForm;
 procedure WDREFRESHPROPERTYLIST(var Message: TMessage); message WD_REFRESHPROPERTYLIST;
public
 constructor MyCreate(Owner: TComponent; AForm: TForm);
end;

constructor TfrmProperty.MyCreate(Owner: TComponent; AForm: TForm);
begin
 inherited Create(Owner);
 FMyForm := AForm;
end;

//* 对于使用消息的方式,可以减少窗体公共函数的定义。同时,提高程序的可扩充性。如果,使用他的窗体替代时,则可以比较轻松的转换,因为如果最多也就是您的窗体,对当前的消息没有进行处理而已 *)// 

 

 

{ No. 6 }使用注册列表管理可能扩充的模块
//项目:要求你对一个数据集支持多种输出显示方式

...例子,以后给出

//* 说明:
1、“多种输出方式”,说明输出方式在今后的应用中可能会经常扩充,因此要在程序设计时考虑到输出方式的易扩充性。
2、参考VCL中,控件注册(RegisterComponents)的机制,可以发现VCL中大量的使用到了注册机制;其中比较经典的就是控件属性编辑器的注册了。
*//

{ No. 7 }使用预定义控制程序版本

//如果您做的是一个二次开发平台的程序,则必须涉及到产品版本控制和项目版本控制问题
//通常使用预定义的方式控制

//语句比较简单了就是:
{$DEFINE JOYYUAN97}
{$IFDEF JOYYUAN97} {ELSE} {ENDIF}
{$UNDEF JOYYUAN97}

*说明:
1、将预定义划分在多个单独的文件中。
2、在每个单元的最前头但在Unit 后,使用{$I ...} 将文件包含(Include)进当前单元
3、根据预定义情况控制当前单元所能包含的单元文件
4、尽量单独划分一个针对项目的预定义文件在包含所有预定义文件后,包含此文件,则在此文件中,可以针对项目的需要,将取消部分预定义{$UNDEF JOYYUAN97}
*//

{ No. 8 } 使用函数指针,减少单元项目包含

//我经常的认为减少单元的包含,是做公共单元的第一步,所以在如何尽量减少单元包含
//也就是如何减少程序单元的耦合性上,应多下工夫。

{ 情景描述:
TMyFormManager: 窗体管理类
TMyForm:数据窗体基础类
TMyFormAccess:窗体信息保存和读取类。将窗体信息保存到数据库或其他什么类型的结构中
分析:
1、窗体基础类(TMyForm) 和 窗体管理类(TMyFormManager)需要在一个单元 uManagers中实现。
2、窗体具体实现类(TMyImageForm)单元 fMyImange 需要包含单元uManagers,进行窗体继承,和窗体管理。
3、窗体数据读取类(TMyFormAccess)单元 uMyAccess 需要包含单元uManagers和单元fMyImange
问题:
 如果我希望实现窗体保存,那么应该在窗体的某个按钮事件中实现。则涉及到窗体单元需要包含窗体数据访问类单元,而如果放在窗体基础类中,则单元uManager又必须包含单元uMyAccess。
 当数据访问,即数据存储格式会根据要求而改变并要求可扩充时,则单元包含必定是一个隐患。
解决办法:使用函数指针变量。
1、在单元uManagers中定义一个,保存数据信息的函数指针变量。
2、在应用程序初始化的时候给这个函数指针变量赋值。
3、在需要保存窗体信息时,判断如果指针不为空,则执行函数保存窗体信息。

{ No. 9 } 常量,认识常量,使用常量
有很多书都都介绍了常量定义的重要性,我也会经常想到,但是看看VCL源码才知道,自己忽略了,别人对常量的使用情况。

1、我们经常使用的消息的定义就是:声明一个常量,然后在适当的时候使用之。
 通常定义和使用:
 const
   WD_MyMessage = WM_User + 101;
 type
 TMyForm = class(TForm)
 ...
   procedure WDMyMessage(var message: TMessage); message WD_MyMessage; {响应消息位置}
 end;
 但是,如果您将{响应消息位置}语句改写为:
   procedure WDMyMessage(var message: TMessage); message WM_User + 101;
 同样,编译可以成功,使用也正常。所以,常量定义在Window系统处理和接口中应用非常普遍。

2、在Delphi中,我们定义了颜色变量,clRed, clGreen等,也都是定义的常量,便于以后的使用。通过这个观察我发现,常量的定义应该是在项目中,可部分复用的,所以,可以定义一个标准常量单元,以便在个项目中,复用定义的常量。

 

 { No. 10 }一个Delphi中,常用到的数组

对TIdentMapEntryd类型的数组定义和使用,Delphi中,有比较完善的实现。
 TIdentMapEntry = record
   Value: Integer;
   Name: String;
 end;

1、数组定义:array[0..ArrMax] of TIdentMapEntry
 可参考:Controls单元中:
 Cursors: array[0..21] of TIdentMapEntry = (
 ...
 );
2、两个互相求值得函数: IntToIdent(由Value求Name)和 IdentToInt(由Name求Value);
 具体应用可以参考:IdentToCursor 和 CursorToIdent。

3、应用:a、直接应用此树组定义方式和数组操纵函数;b、学习函数中,对数组访问和操纵的方式。c、学习标准的信息访问函数定义: function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean; 具体返回的信息由参数方式返回回来,至于访问是否有效,则通过函数的布尔返回值加以判断。

 

{ No. 11 } 由特例到普通的发现
我通过对 Cursors 的定义和操作函数的跟踪发现:
1、如 { No. 10 }中介绍的,将Cursors的定义和一般操作通用化。
2、提供 Int 和 Ident互转化的函数。
3、提供数组列表信息循读取的函数: GetCursorValues;其中,使用了 { No. 3 } 中介绍的“事件指针 做参数”读取列表信息的方法。

{ No. 6 } 的补充:
例子:
procedure RegisterComponents(const Page: string;
 ComponentClasses: array of TComponentClass);
begin
 if Assigned(RegisterComponentsProc) then
   RegisterComponentsProc(Page, ComponentClasses)
 else
   raise EComponentError.CreateRes(@SRegisterError);
end;

解读:
1、使用注册的方式,记录可使用的控件的类型等。
3、对于 RegisterComponentsProc 使用了{ No. 8 } 中“使用函数指针,减少单元项目包含”的方法,便于将来程序的扩充,版本的升级等。

 

 { No. 11 }只定义一个公共函数
//项目描述:现在要实现一个CAD画图或Visio系统,要求有好的扩展性和易维护性;
//并且要求耦合性低,便于,将来系统的部分或扩展后的系统封装后,直接在今后的项目中使用

设计:
1、设计一个图形对象抽象类,在此类中,定义一个抽象函数 CadPerform,函数的参数参照function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
2、在图形管理类中,实现一个图形对象列表的管理,列表中保存的是抽象对象的指针。
3、对于要对具体类对象进行操纵控制时,只需通过条用CanPerform函数,然后根据当前操作的类别传入 Msg, 并传入相应的参数信息。

实现: TCad 为由抽象类继承下来的第一层控件类
function TCad.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
begin
 Case Msg of
 My_Message1: Result := MyMessage1(WParam, LParam);
 My_Message2: Result := MyMessage2(WParam, LParam);
 end;
end;
对于,TPoint继承自 TCad, CadPerform函数实现如下。
function TPoint.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
begin
 Case Msg of
 My_Message1: Result := MyMessage1(WParam, LParam); //屏蔽了TCad中此操作类型的处理
 My_Message3: Result := MyMessage3(WParam, LParam);
 else Result := inherited CadPerform(Msg, WParam, LParam);
 end;
end;

*说明:
因为,我们对图形对象的操作会非常频繁,所以我们通过定义一个公共开放的接口函数来实现,类的高封装性和程序的易维护性、好扩展等性能。
*//

 

{ No. 12 }

以下是我编程时的要求:(部分信息没有语言限制)
//以下的解决方案,几乎都可以在上面的方法中,找到
1、减少程序的复杂度。a、减少函数个数,使用Case、Tag方式,学习实现Perform定义方式;b、减少单元嵌套关系,使用消息传递方式,减少窗体单元的互相包含。
2、减少

 

{ No. 13 }使用广播,实现管理类对管理列表对象的通知

//对于{ No. 12 } 项目描述中,当画图的窗体控件属性或状态改变时,经常会需要通知所有的图形对象,进行相应的改变。
//则如果只定义一个广播函数,就可以实现父子通知的话,也会提高程序的可重用性、扩展性、易维护性等,使类结构清晰。

//比如:1、在Visio和MapInfo中,如果当前窗体的比例尺(缩放比例)改变时,需要用新的比例尺重画当前所有的显示图形对象。2、当当前窗体默认窗体字体改变后,对于默认使用窗体字体显示文字信息的图形对象,他们的文字字体也应该相应的改变。

//解决方案,参考TWinControl中,属性或状态改变时,通知所有子Controls的处理机制:
procedure TWinControl.NotifyControls(Msg: Word);
var
 Message: TMessage;
begin
 Message.Msg := Msg;
 Message.WParam := 0;
 Message.LParam := 0;
 Message.Result := 0;
 Broadcast(Message);//广播当前的变更消息
end;
其中:
procedure TWinControl.Broadcast(var Message);
var
 I: Integer;
begin
 for I := 0 to ControlCount - 1 do
 begin
   Controls[I].WindowProc(TMessage(Message));
//改为:with TMessage(Message) do Cads[I].CadPerform(msg, WParam, LParam);
   if TMessage(Message).Result <> 0 then Exit;
 end;
end;
但是,我们处理图形对象时,可能会直接调用 Cads 的CanPerform公共函数即可

{ No. 14 }需要时,动态创建你的对象

比如:http://www.delphibbs.com/keylife/iblog_show.asp?xid=824 中的
//*******方案二  当需要的时候在创建属性窗体
uses
...
fProperty;
type
TfrmMyMap = class
  ...
  procedure OnfrmMyMapDestroy(Sender: TObject);
  procedure OnMapGeoSelected(AGeo: TGeometry);
private
  FfrmProperty: TfrmProperty;
  procedure ShowPropertyForm(aVisible: Boolean);
public
end;

procedure TfrmMyMap.ShowPropertyForm(aVisible: Boolean);
begin
if Not Assigned(FfrmProperty) then FfrmProperty := TfrmProperty.Create(Application);
FfrmProperty.Visible := aVisible;
end;

procedure TfrmMyMap.OnfrmMyMapDestroy(Sender: TObject);
begin
if Assigned(FfrmProperty) then FfrmProperty.Free;
end;

procedure TfrmMyMap.OnMapGeoSelected(AGeo: TGeometry);
begin
if Assigned(FfrmProperty) then FfrmProperty.MyRefresh(AGeo);
end;

这里说明了:
1、需要时,动态创建你的对象 FfrmProperty
2、当前对象释放时,判断你的对象的合法性,然后释放动态创建的对象。

 

 { No. 15 }创建接口还是创建结构

//项目描述:我开发一个表格控件时,如果我将单元格设置为一个Com,则如果表格现实的信息过多的话,则装载速度无法保证,甚至于有死机的可能。我之所以用Com是为了将来每个单元格的处理和信息都可以在控件外扩展。

我的解决办法是:对于每个从Cell派生来的控件创建一个实例,通过动态创建若干个结构对象Record来记录个单元格的信息,如果需要对单元格进行操作,则将结构对象指针赋值给Cell组件,测试结果很令人满意。

所以,如果需要使用某个Com大量实例的话,尽量管理和维护一个实例,而对于其中的数据可以实行动态创建管理,速度上会有很好的效果。
另外,尽量声明一个 pMyInterface = ^IMyInterface 借口指针,参数传递或使用时,直接使用接口指针,这样可以减少调用计数函数_AddInft等,如果操作平凡也可以提高速度的。

注:此文作者笔名:JoyYuan97。(自己很菜,写不出来什么,找到好的东西希望大家一起分享,也感谢作者给我带来的经验和技巧)

希望看过的人留下意见,下面为作者的话:
“另外,最好请将您转贴位置的连接给我一份。我向定期看看别人的建议。谢谢!
有好经验大家分享!”

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。  1.1 Delphi基本概念介绍  1.1.1 Delphi的基本形式  Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础。Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。 在空白窗口的背后,应用程序的框架正在等待用户的输入。由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本操作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。Delphi把Windows编程的回调、句柄处理等繁复过程都放在一个不可见的Romulam覆盖物下面,这样您可以不为它们所困扰,轻松从容地对可视部件进行编程。 1.1.2 面向对象编程的概念  面向对象的程序设计(Object-Oriented Programming,简记为OOP)是Delphi诞生的基础。OOP立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。它通过给程序中加入扩展语句,把函数“封装”进Windows编程所必需的“对象”中。面向对象的编程语言使得复杂的工作条理清晰、编写容易。说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。对象并不与传统程序设计和编程方兼容,只是部分面向对象反而会使情形更糟。除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。而Delphi是完全面向对象的,这就使得Delphi成为一种触手可及的促进软件重用的开发工具,从而具有强大的吸引力。 一些早期的具有OOP性能的程序语言如C++,Pascal,Smalltalk等,虽然具有面向对象的特征,但不能轻松地画出可视化对象,与用户交互能力较差,程序员仍然要编写大量的代码。Delphi的推出,填补了这项空白。您不必自己建立对象,只要在提供的程序框架中加入完成功能的代码,其余的都交给Delphi去做。欲生成漂亮的界面和结构良好的程序丝毫不必绞尽脑汁,Delphi将帮助您轻松地完成。它允许在一个具有真正OOP扩展的可视化编程环境中,使用它的Object Pascal语言。这种革命性的组合,使得可视化编程与面向对象的开发框架紧密地结合起来。 1.2 Delphi 快速入门  在这一节中,我们来开发一个小程序。随着开发的过程,逐步介绍Delphi的主要部件及其操作方。建议读者按照本书介绍的过程,在您的电脑上直接操作。您将对Delphi的可视化编程有一个直观、快捷的了解,必将起到事半功倍的效果。  1.2.1 进入Delphi的可视化编程环境 1.2.1.1 安装Delphi  Delphi的安装与其它应用软件并无不同。2.0版必须在Windows 95以上的操作系统中使用。启动Windows 95或Windows NT后,将Delphi的光盘放入光驱(CD-ROM)中,运行光盘上的\INSTALL\SETUP.EXE文件,它的安装程序会提示您正确地装入Delphi。如果您是在微软中文Windows环境中安装Delphi,请参照附录A来设置您的BDE环境,以便于处理中文数据。  1.2.1.2 进入Delphi 环境 为避免隐藏在Delphi后的Program Manager和曾经运行过的其它程序扰乱版面,分散您的注意力,不妨在启动Delphi前关掉其它应用程序;启动Delphi后,再最小化隐藏在后面的Delphi 2.0程序组。这样屏幕上就只留下Delphi窗口可见了。 首次加载Delphi,屏幕上会出现四个窗口: ● 标题为“Delphi-Project1”的Delphi主窗口 ● Object Inspector窗口 ● 标题为“Form1”的窗体(Form)窗口 ● 标题为“Unit1.PAS”的代码编辑窗口。刚启动时这一窗口的大部分被“Form1”窗体所掩盖。将“Form1”窗体移开,或单击Form1窗体下方的状态行,可以使其全部可见。在“Form1”窗体的任意可见位置单击鼠标,可以恢复主窗体可见 以下我们将对这四个窗口分别进行介绍。  1.2.2 Delphi可视化编程环境介绍  1.2.2.1 主窗口(Main Form)  Delphi的主窗口位于屏幕的上端,包括Menu(菜单)、Speed Bar(加速条)和Component Panel(部件选项板)。Menu是下拉式主菜单。Speed Bar位于主窗口的左下端,由两排共14个加速按钮组成。这些按钮是菜单功能的快捷方式,各种图标直观地表示了它能执行的动作。Component Panel由一行、若干页对象按钮所组成,利用它来选择需要的部件并将它放到窗体中去。  1.2.2.2 Object Inspector(对象检视器)  Object Inspector窗口含有两页:Properties页显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;Events页列出了当前部件可以响应的事件。按动Object Inspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作。首次启动时,Object Inspector窗口显示的是当前窗体Form1的属性。Object Inspector根据对象属性的多少,决定是否有滚行显示。移动滚行条,可以查看当前对象的全部属性。 此外,Object Inspector上还有Object Selector(对象选择器),位于Object Inspector上方的下拉式菜单中。它显示了窗体上所有部件的名称和类型,也包含窗体本身。您可以用Object Selector很容易地在窗体的各个部件之间切换,也可以快速地回到窗体本身。当窗体中含有较多的对象时,您会发现这是切换对象尤其是回到窗体的最快捷途径。 想使Object Inspector一直可见,可将鼠标移到Object Inspector上,按动右键,以启动Object Inspector的弹出式菜单,将其设置为Stay On Top。这对初学者常是一个很重要的设置方式。  1.2.2.3 窗体窗口  Forms窗口是开展大部分设计的工作区域。首次启动Delphi 2.0时显示的是窗体Form1。可以把部件放在窗体中,通过移动位置、改变尺寸等操作随心所欲地安排它们,以此来开发应用程序的用户界面。您可以把窗体想象成一个可以放置其它部件的容器。窗体上有栅格(Grids),供放置部件时对齐位置用,在程序运行时Grids是不可见的。 一个真正的应用程序可能有不止一个窗口,您可以选用不同的窗体进行设计。其它窗体可以是对话框(Dialog Box)、数据录入框等。  1.2.2.4 代码窗口  代码窗口一开始处于窗体窗口之下。因为在Delphi中,设计用户界面直接在窗体中进行,运行结果和设计样板完全一致。当部件被放到窗体上时,Delphi会自动生成大部分的用户界面代码。您所应做的只是在它为您生成的框架中加入完成所需功能的程序段而已。点动Form1的状态行使代码窗口可见。 这个窗口中是代码编辑器。可以在其中书写Delphi应用程序的源代码。当程序中含有不止一个窗口时,会有几个库单元的源程序出现在代码编辑器中。代码编辑器的标题条中显示了当前正在编辑的库单元文件名。要查看某一特定程序的源代码,只需用鼠标点动写有该库单元文件名的页标签,就可以对该库单元进行编辑了。
目录清单:  01界面设计           制作一个屏幕保护程序           制作一个漂亮的VCD播放器           制作几何形状的窗体           制作桌面小精灵           制作相框           实现带阴影效果的画框           给Memo组件的显示区域加边框  02系统设置           一个托盘程序           如何实现目录的复制、删除和移动           如何改换壁纸和启动、关闭屏保           文件管理器           格式化磁盘           获取Windows、System和Temp目录           获取文件日期信息           获取驱动器信息           重启或关闭计算机           隐藏任务栏和桌面图标  03硬件访问与控制           实例1-获取和设置显示器模式           实例10 两种不同的方获取端口信息           实例2-电源电池信息           实例3-内存状态信息           实例4-CPU型号信息           实例5-硬盘和光盘的操作           实例6-获取不同的声音播放设备           实例7-键盘相关设置           实例8-鼠标相关设置           实例9-从注册表中读取各类硬件信息  04控件应用           LISTBOX控件的折行显示           在控件中添加消息处理           将系统中的com接口包装为控件           带背景图的标签           我的资源管理器           打造自己的文件分割器           编写一个滚动提示控件           自制邮件发送客户端  05文件操作           Delphi中的INI文件编程           删除或移动正在使用的文件           如何在Delphi中操作Excel           实现应用程序的文件拖放功能           将EXE文件转换成SWF文件           将SWF文件转换成EXE文件           文件捆绑           统计中英文字个数  06图形图像多媒体           实例一--艺术字效果           实例七---photoshop图层效果           实例三---图象效果处理           实例九---在IntraWeb中显示图片数据           实例二--渐变色和动画矩形效果           实例五--编织带           实例八--动画屏保           实例六--镜框效果           实例十--matlab结合           实例十--电子地图开发之GIS组件--Mapobject深入开发           实例四---scanline属性  07数据库应用           实例1  Session获取BDE信息           实例10   决策图的使用           实例11  ThreadedIBX           实例2  可视化创建数据表格           实例3  SQL语句的使用           实例4  “一对多表”的设计           实例5   文本和数据记录的转换           实例6 利用ADO的从SQL Server 2000中读取数据           实例7  多媒体数据库的使用           实例8  IntraWeb技术的实现           实例9  Rave报表的数据库使用  08网络与通讯           实例一 用DELPHI实现网络信使服务           实例七 NetClock           实例三 断点续传           实例二 升级精灵           实例五 网络文件传输           实例六 Ping           实例四 邮件群发  09趣味游戏           实例1--小狗过桥游戏           实例10--深入opengl游戏           实例2--键盘练习           实例3--字母拼图游戏           实例4--乒乓球           实例5-6--打地鼠---2个部分           实例7-8--扫雷--2个部分           实例9--一个简单的opengl游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

l_xiaofeng

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值