delphi控件使用

 Standard页

1-      Tlistbox控件

重要属性items.*

举例,界面设计如下左,执行结果如下右:

    

代码为

procedure TForm1.Button1Click(Sender: TObject);

begin

edit1.Text := listbox1.Items.CommaText;

edit2.Text := listbox1.Items.Text;

edit3.Text := listbox1.Items.GetNamePath;

edit4.Text := listbox1.Items.Strings[1];

edit5.Text := listbox1.Items.DelimitedText;

edit6.Text := listbox1.Items.Names[1];

end;

由执行结果知,CommaText把各行用逗号隔开,Text获得所有行数字符且不隔开,Strings[i]获得i行的字符。

 

2-      Checkbox控件

Alignment决定文字和框的左右布局;state属性里有个Grayed状态,为灰色选中状态,与Enabled:=false不同的是它可以在程序运行的时候进行操作;AllowGrayed属性为True时候,控件有三种状态:选中、未选中、选中但变灰;

3-      RadioGroup控件

Columns属性设置radobutton的列数;

4-      TmainMenu控件

Action属性;AutoHotKeys属性自动配置快捷键;

birmap属性为某个菜单标签添加图标;

Break属性给菜单分栏:mbBarBreak-分栏有竖线,mbBreak-只分栏无竖线,若要从末各标签开始分栏,则设置该标签的Break属性;

Caption属性设置为短横线时为分隔横线;

Checked属性为True时为标签添加对勾;

ShutCut属性为标签添加快捷键,并在标签右边显示;

模板应用:右击主菜单,Insert..

保存模板:与上类似,Save As..

5-      PopMenu

应用步骤:添加控件,然后设置PopMenu属性指向动作空间;

Additional页

1-Navigator控件:

Flat属性设置3D/2D效果;dragCursors设置拖动是显示的符号,drag mode/dragkind决定是否可以进行拖动操作;

 

2-Additional页的BitBtn控件

Kind属性设置按钮图片类型,layOut设置图片在按钮上的布局;Glyph属性自定义图片,图片路径c:\...Borland shared\Images

 

3- Additional页的SpeedButton控件

Glyph属性自定义图片,图片路径c:\...Borland shared\Images; Flat属性设置3D/2D效果;最大的优势在于鼠标指向它的时候呈立体效果;

 

4.- Additional页的CheckListBox控件

Items属性中写入项目,但是项目前具有CheckBox的形式,可以进行项目选择;

判断第k个项目是否被选择采用如下语句 :if checklistbox.checked[k] = ture  ?,与若干单独的checkbox比较优势在于可以统一编程,不在需要对每一个checkbox单独去编写程序!

 

5. Additional页的橡皮筋控件Spliter

作用是分割窗体,是一自动行为控件,无需任何时间代码。

使用过程为:放置控件,设置Align属性,调整Height或width属性。

 

6. Additional页的静态文本控件StaticText

功能与Text 类似,但通过设置Bevelkind, Bevelinner, Bevelouter和borderstyle属性可以加强外观修饰功能!!

 

7. Additional页的控制棒控件ControlBar

功能:强大的控件修饰功能,是制作加速键面板的有理工具,譬如office中的工具按钮等。

8.Tsahpe 控件

三个主要属性:Pen属性,Brush属性,Shape属性。Pen属性决定边框显示,包括

LabelEdit控件

 Label 和Edit的组合;

 

Win32页

TabControl

重要属性有:Tabs属性创建页数,Font修改字体属性,Style更改页面风格,Tabposition设置按纽方向、布局。

 

TrackBar跟踪条/进程条ProgressBar

对任务的执行状态进行跟踪。

重要属性为:

a.       min,max,设置举例:trackbar1.Min := 0, trackbar1.Max := mediaplayer1.Length;

b.       position 指定跟踪对象,如trackbar1.Position := mediaplayer1.Position;

c.       TickStyle为跟踪类型选择,一般选择tsAuto。

 

日期时间控件 DataTimePicker

功能:拾取系统时间、日期,并以对应格式输出

重要属性:

a.       date,拾取的时间。

b.       Time,拾取的系统时间 举例如:button2.Caption := TimeToStr(DateTimePicker1.Time);

c.       DateFormat:dfShort为短格式,dfLong为中文长格式;

 

MonthCalendar控件

 

功能,直接显示月历,

 

树结构目录查看控件TreeView

重要属性:

Item>>生成树结构,HotTrack实现热追踪;Font属性设置树结构的字体属性;

AutoExpand: Boolean;

HotTrack: Boolean; 实现热追踪

Selected: TTreeNode;

Read Selected to access the selected node of the tree view. If there is no selected node, the value of Selected is nil.Set Selected to set a node in the tree view.

ShowButtons: Boolean;是否显示树结构钱的+、-号

 

具体使用如下

Var

node :Ttreenode;  //定义树节点类型

pnode : ttreenode;

begin

//增加选中节点的子节点,并展开

node := treeview1.Selected;    //支点选择

treeview1.Items.AddChild(node,'增加节点'); //增加子节点

node.Expanded := true;        //展开支点

//增加选中节点的同级节点

pnode := treeview1.Selected.parent;    //指向父节点

treeview1.Items.AddChild(pnode,'增加的同级节点'); //增加子节点(该节点的父节点的子节点为该节点同级节点)

end;

 

 

标题头控件headerControl

制作标题头

重要属性:

a.       setions:输入标题文字;

b.       style:有flat\buttons…等式样,其中Flat式样不接受sectionclick事件。

c.       HotTrack

 

状态条StatusBar

功能:显示系统运行时的提示信息

重要属性:

a.       simleText:当为单栏状态条时,显示信息,应用如:StatusBar1.SimpleText := datetostr(date);

右击StatusBar控件,打开Panel Editor,可以设置多栏状态条和各自的宽度。应用如StatusBar1.panels[2].Text := datetostr(date);(使用Timer控件以保持和系统时间的同步性)

 

ToolBar

功能:开发快捷键

右击生成按钮和分割符;对应的按钮的Style属性选择按钮属性,共5种;按钮的MenuItem属性选择关联的下拉菜单,按钮的PopMenu属性选择关联的右键菜单。Hint和ShowHint配合使用显示提示(Hint输入提示文字,ShowHint设置为true)

 

实际使用步骤:1.在Win32页中拖入imagelist控件,并双击打开添加图片;2.添加toolbar控件,设置hotimages和images属性为imagelist空间,然后在上面添加工具按钮,并设置工具按钮imageIndex属性,下一步就设置menuItem属性选择关联彩单。

 

9 CoolBar

右击生成Bans;

D7的TXPManifest控件

如果你的操作系统是XP,将TXPManifeS加入到窗体上,就可以使窗体以及其他所有孔件实现XP效果。如果不是XP系统就没有任何用处。

 

System页

OLE(对象联结和嵌入容器)

右击控件选择Insert Object 弹出Ole Insert Object对话框,促啊如OLE服务器对象。常见命令如下

OleContainer1.InsertObjectDialog;//弹出Ole Insert Object对话框

OleContainer1.DestroyObject(); //程序关闭的时候保证对象的销毁

 

ActiveX(页)类控件

Chartfx 控件

使用步骤:1.拖放控件;2.把控件的Toolbox属性设置为True,从而打开工具棒;3.右击打开“特性”……,其中label标签中可以添加图标的标题;

重要属性:

Chart3D:是否采用3D绘图方式

ChartType:选择绘图类型,如柱形图,折线图等

PalleteBar:面板工具显示否(用来修改背景颜色和坐标平面颜色),选True或者False;

PatternBar

问题:如何动态地添加数据,把它很好地运用到自己的程序中来?

 

F1book控件(Excel工作表控件)

拖入控件,双击行、列标题可以修改行列标题,右击work designer可以设置属性,其中gernal标签下的Enable Protection可以设置用户是否可以编辑表格中的数据。

Vtchart控件(excel立体图控件)

 

 

Win3.1页

资源管理器的制作(实例)

界面以及运行结果

 

制作步骤,在win3.1页中加入DriveComboBox1,DirectoryListBox1,FileListBox1,FilterComboBox,然后连接各控件(设置DriveComboBox1的DirList属性为DirectoryListBox1,DirectoryListBox1和FilterComboBox对filelist属性为FileListBox1),最后打开FileListBox1的Filter属性设置过滤特性,形式如下

相关控件的重要属性:

Filelistbox控件:

  FileEdit:与Edit控件相关联,显示选中的文件名;

  Mask:屏蔽文件;

  ShowGlphy :显示文件图标。

DirectoryListBox控件:

  DirLabel :与Label控件关联,在Label控件中显示文件夹带路径;

  Filelist :和Filelistbox控件:相关联。

Sample中的Shell Control 控件

,就是ShellTreeView,ShellListView,ShellComboBox和ShellChangeNotifier控件。

 

第三方控件

1.       托盘控件TrayIcon(D:\Delphi第三方控件,安装后位于Samples页中)

步骤:第一步,拖放控件至窗口,然后再添加一个ImageList控件,且添加图标

         第二步,设置Icons属性为Imagelist,Animate属性和AnimateInterval控制动画效果;Visible控制可见性;Hint显示提示信息。

delphi应用

模板应用

1新建窗体file\new\Others…>>Form,如下

各个窗体为:

2新建对话框file\new\Others…>>Dialog,如下

 

可以建立如下对话框:密码输入;标准对话框;带help的对话框,也可以用对话框向导建立需要的对话框。

3 应用程序生成

主要包括多窗体、但窗体应用程序生成,可通过ApplicationWizard来建立个性化的应用程序。如下图

 

技巧

通用知识

快捷菜单的使用

依次为New, Open, Save, Saveall, 打开工程,添加文件(文件已经存在),从工程中移除文件(不删除)

依次为 打开代码/窗口对话框,代码/窗口切换,新建窗体。

代码结构

(紫兰为接口部分,包括use<引用单元>,type<组件、过程、函数,声明?>,var<变量>,use<引用单元>)

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

button1.Caption := 'xyz';

 

 

end;

 

end.

 

窗体属性和事件

a. 窗体透明度设置:Alphablend := true >> AlphablendValue :=k  (k在0到255之间)

b. 右上角按钮有无设置:BorderIcons属性(即关闭、最大、最小、问号等按钮)

c. 边框设置:Borderstyle属性,其中为bsNone时无边框,为bsDialog时只有关闭按钮,其他不可改。

d. OnKeyPress事件:窗体激活状态时的键盘事件,参照“键盘的ASC码”应用如下

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin  //按Enter键窗体变红

   if key = #13 then Form1.Color := clred;

end;

d.       OnMouseMove事件:在组件区域内鼠标移动时发生

 

e.       TabOrder属性可以用来设置组件的(初始)焦点

 

f.        窗体的Onpaint事件,应用见“界面设计技巧”>>窗体背景色渐变

 

窗体重画

在Form的Canvas上画了很多东西,但窗口移动了一下之后画的东西全没了,怎么解决?

>>重画!将你的过程放在OnPaint事件里!一般在Form的OnPaint事件中写画画的代码。 

窗体关闭询问

参见实例047

窗体关闭前会触发ONCloseQuery事件,该事件中的参数canclose是boolean型的

 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

   if application.MessageBox('您将要关闭本窗口!确认是否继续?','询问',MB_YESNO+MB_ICONQUEStION)=ID_NO then

   begin

     CanClose:=false;

   end;

end;

数据类型

1 指针的使用:首先声明指针类型,再声明指针变量

2 变体数据类型Variant和其他数据类型结合使用时自动转换类型

V:variant

则:V:= 10; V:= 12.3;V:=’hello’;都是可以的。

 

Goto 语句的使用

procedure TForm1.Button1Click(Sender: TObject);

label N1;//保留字label声明标号

label N2;

 

begin

  goto  N2;

 

  N1:  begin

       Edit2.Text := Edit1.Text;

       edit2.Color := clred;

       exit;   //程序执行完毕

       end;

  N2: Edit3.Text := edit1.Text;

  goto N1;

end;

使用注意点:语句要在同一过程/函数中使用,不能跨块操作;尽量在同一结构语句中使用;

 

自定义过程编写

三步:首先在单元文件的Type>Private下定义(在关键字 过程名,如:procedure greetings);再声明过程功能,包括参数类型说明;过程调用

应用如下:

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

    procedure greetings;   //定义过程

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

 greetings; //调用过程

end;

 

procedure  TForm1.greetings;   //声明过程(功能)

begin

  form1.Color := clRed;

end;

 

end.

以上为无参过程应用,有参过程如下

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Edit4: TEdit;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

procedure exchange(var a,b :string);  

{ //定义过程,特别注意与声明部分地一行唯一的区别就是没有了“Tform1.”的前缀(声明部分必须有,而定义过程则必须要有参数说明即:(var a,b :string))}

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var

x,y:string;

begin

 x := edit1.text;

 y:=  edit2.text;

 exchange(x,y); //调用过程

 edit3.text := x;

 edit4.text := y;

end;

 

procedure  Tform1.exchange(var a,b :string);   //声明过程(功能)

var temp : string;

begin

  temp := a;

  a:= b;

  b := temp;

end;

 

end.

运行界面如下

自定义函数编写

PART1

和过程编写大致一样,注意的地方:必须指定返回值的类型,且函数调用,只能出现在一个表达式中

应用如下:

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

    function max(var x,y:real):real; //函数定义,必须指定返回值的类型

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

function Tform1.max(var x,y:real):real; //函数声明,必须指定返回值的类型

begin

if x >y then max := x else max := y;  //以函数名或本地变量Result作为返回值变量

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var a,b:real;

begin

a := strtofloat(edit1.Text);

b := strtofloat(edit2.Text);

edit3.Text := floattostr(max(a,b));  //函数调用,只能出现在一个表达式中

end;

 

end.

 

运行界面

 

PART2  函数的返回类型

可以使用Variant类型,

当函数返回类型可以为array时,举例如下:

type  
      TArrayInt   =   array   of   Integer;  
   
  function   f:   TArrayInt;  
  begin  
  end;  

PART2 用二维动态数组做函数或过程的参数

1.普通的情况  
      type  
          TArrAr r= array   of   array   of   Integer;   //假设是Integer类型的    
       
      procdure   proc_name(Arr1:   TArrArr);  
      function   ...  
   
  2.   使用Variant  
   
      procdure   proc_name(Arr1:   Variant);  
      function   ...

Project Options设置

a.       主菜单设置Project>>Options>>Forms页,设置mianform(方法一),也可以在Project代码窗口修改代码,如下设置form2为主窗口:

program Project1;

 

uses

  Forms,

  Unit1 in 'Unit1.pas' {Form1},  //对这部分次序无要求

  Unit2 in 'Unit2.pas' {Form2},

  Unit3 in 'Unit3.pas' {Form3};

 

{$R *.res}

 

begin

  Application.Initialize;

  Application.CreateForm(TForm2, Form2);  //Form2首先出现

  Application.CreateForm(TForm1, Form1);

  Application.CreateForm(TForm3, Form3);

  Application.Run;

end.

 

动态创建组件

例如创建一个按钮,name为button,父体为panel1,

代码如下:

procedure TForm1.Button1Click(Sender: TObject);

var

Button :tbutton;     //组件的类

begin

  Button:=Tbutton.create(self);

  Button.parent:=panel1;    //指定父体

  //位置设置

  Button.left := 20;         //

  Button.top := 30;

  //Caption属性设置

  Button.caption:='OK';

  button.Font.Color := CLPURPLE;

  //大小设置

  button.Width  := panel1.Width div 3 ;

  button.Height := panel1.Height div 5;

end;

 

运行界面

  

几组易混淆的概念

一、Owner和Parent的区别:

  Parent属性是指构件的包容器,构件只能在此范围内显示和移动。举例子如下:

  (1)在Form1的窗体上,放一个Panel1,并将Panel1拉大,

  (2)在Panel1上放一Button1;

  (3)在Form1上放一Button2。

  现在如果移动Panel1,则Button1随着Panel1移动,这是因为Button1的Parent是Panel1。现在将Button2移到Panel1上,再次移动Panel1,Button2并不跟着移动,这是因为Button2的Parent是Form1。除在窗体设计中,应注意构件的Parent是谁外,在动态创建构件时,也应指出构件的Parent,如在上例中继续操作:

  1)Procedure Tform1.Button2click(Sender:Tobjet);

  2)Var

  3) Button:Tbutton;

  4) Begin

  5) Button:Tbutton.cerate(self);

  6) Button.parent=panel1;

  7) Button.lleft=0;

  8) Button.top=0;

  9) Button.caption:=OK;

  10) End;

 

  当按Button2时,将在Panel1上创建一个Button,而如果把第6句改为Button.parent:=self;按Button2时,将在Form1上创建一个Button了。如果将第6句删除,按Button2时,什么都不会发生,这是因为创建方法无法知道应在哪里显示构件。

 

  Owner属性是指构件的所有者,它负责构件的创建和释放。如在上例中,系统默认窗体上所有构件的所有者是窗体,而窗体的所有者是Application。顺便指出,create方法应带有表示构件所有者的参数,如在上例中,构件所有者是窗体,即self。

 

  Parent属性和Owner属性是运行阶段的属性,只能在运行阶段,通过代码设置。  

 

二、Self和Sender的区别:

 

  在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例:

  Procedure Tform1.Buttonclick(Sender:Tobject);

  Begin

  If sender=button1 then

  Label1.caption:=′看庭前花开花落

′   Else Label2.caption:=′望天上云卷云舒′

  End;

 

  在此例中,Button1,Button2共用了Buttonclick事件处理程序。

 

  Self是指所编的程序范围是在哪一个类中,Delphi中大都在窗体范围内编程,因此,self即指窗体,如果在编写一个类或是一个组件,则self指该类或组件。我们在函数或过程的声明中可看出self是代表哪个组件,即self代表‘.’号之前的组件,如在第一个例子中,self代表Tform1。另外应注意,self而不能用在过程或函数中,如下例用法是错的:

Function a1(B:Integer):Integer;

  Begin

  ……

  Button:=tbutton.create(self);……

  End;  

 

三、Clientheight和Height,Clientwidth和Width的区别:

 

  对于一般的构件而言,Height就是Clientheight,Width就是Clientwidth,而对于窗体而言,Height是包括标题条在内的高度,而Clientheight是指窗体工作区的高度。同理,Clientwidth是指定窗体工作区的宽度。

 

从上面陈述可知,理解Ower和Parent,Self和Sender,Clientheight和Height,Clientwidth和Width区别,对于Delphi中正确编程是重要的。

Delphi中动态设置ODBC数据源

在DELPHI数据库应用程序中,我们访问数据库通常有两种方法.一种是通过BDE数据库搜索引擎,即利用DELPHI自带的数据库驱动程序,这种方法的优点是速度快,但应用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库;另一种方法是通过ODBC,这种方法的优点是可以随操作系统(如WINDOWS)提供,作为标准接口能适应多种数据库,缺点是速度慢.在编程时,我们可以根据需要选择其中的一种方法.  
  ODBC管理程序设置DSN的秘密在注册表中,不信可以到HKEY_LOCAL_MACHINE\Software\ODBC去看看,肯定让你感觉已经成功了一半. 
  首先来看看系统中已安装的ODBC数据库驱动程序.在HKEY_LOCAL_MACHINE\Software\ODBC\ ODBCInst.INI中,存放着已经安装了的ODBC数据库驱动程序的信息,从这里可以查到已安装的ODBC数据库驱动程序对应的DLL文件等信息.在ODBCInst.INI\ODBC Drivers的各个键值中,键名是驱动程序名称(如Microsoft Access Driv(*.mdb)),键值为“Installed”,表示驱动程序已安装.在ODBCInst.INI\DriverName(DriverName为一个驱动程序名称,如Microsoft Access Driver(*.mdb))中,有驱动程序的详细信息,我们主要从这里获得ODBC驱动程序对应的DLL文件的路径和文件名,即键名Driver的键值,一般为"C:\WINDOWS\SYSTEM\FileName.DLL". 
  然后来看系统DSN的注册信息,在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中,存放着系统 DSN的注册信息,我们在ODBC管理面板设置的DSN参数就在这里. 
  下面来看 唇ㄒ桓鯫DBC系统DSN的步骤,即我们在ODBC管理面板中完成参数设置后,ODBC管理程序是怎么在注册表中注册DSN信息的.以创建一个名称为MyAccess的Ms Access97类型的系统DSN为例,我们指定的参数主要有数据库类型(Microsoft Access Driver(*.mdb))、数据源名称(MyAccess)、数据源描述(我的ACCESS)、数据库路径(C:\Inetpub\wwwroot\Test.mdb),其它参数如用户名称、用户密码、独占、只读、系统数据库、默认目录、缓冲区大小、扫描行数、页超时等采用系统缺省参数.这时,注册系统DSN一般应有以下几个步骤: 
  1.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Sources中增加一个字符串键值,为MyAccess = Microsoft Access Driver(*.mdb),其中分别为数据源名称和数据库类型.这是在注册表中注册一个系统DSN名称. 
  2.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中创建一个子键(SubKey)MyAccess,即创建一个键为HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess,然后在其下创建一些键值,详细描述一个系统DSN的配置信息,主要信息有([]中的内容为笔者注释): 

DBQ=C:\Inetpub\wwwroot\Test.mdb
[字符串,表示数据库路径]
Description=我的ACCESS
[字符串,表示数据库描述]
Driver=C:\PWIN98\System\odbcjt32.dll
[字符串,表示驱动程序,可见ODBCINST.INI]
DriverId=0x00000019(25)
[数字,表示驱动程序标识,不能改变]
FIL=Ms Access;
[字符串,可能与过滤Filter有关]
SafeTransaction=0x00000000
[数字,可能表示支持事务性操作的个数]
UID=""
[字符串,表示用户名称,此处为空字符串] 
  3.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess中创建一个子键(SubKey)Engines, 再在其下创建子键(SubKey)Jet,即创建一个键为 HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess\Engines\Jet,然后在其下创建一些 键值,详细描述一个系统DSN的数据库引擎配置信息,主要信息有([]中的内容为笔者注释): 

ImplicitCommitSync=Yes
[字符串,可能表示是否立即反映数据修改]
MaxBufferSize=0x00000200(512)
[数字,表示缓冲区大小]
PageTimeout=0x00000005(5)
[数字,表示页超时]
Threads=0x00000003(3)
[数字,可能表示支持的最大线程数目]
UserCommitSync=Yes
[字符串,可能表示是否立即将数据修改反映到用户] 
  以上是建立一个系统DSN的基本信息(其它信息如选项或高级选项等信息也在这里设置,只不过因采用默认信息,注册表里没有列出),我们在程序中按上述步骤操作注册表,同样也能增加一个系统DSN或修改其配置.在下面的例子程序中,将按以上步骤建立一个系统DSN,请注意程序中的注释. 
{*******************************************************
在本程序中,将创建一个ODBC系统数据源(DSN),
数据源名称:MyAccess 数据源描述:我的新数据源
数据库类型:ACCESS97
对应数据库:C:\Inetpub\wwwroot\test.mdb
*******************************************************}

{ 注意应在USES语句中包含Registry }

procedure TForm1.Button1Click(Sender: TObject);
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
begin
registerTemp := TRegistry.Create; 
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//设置根键值为HKEY_LOCAL_MACHINE

//找到Software\ODBC\ODBC.INI\ODBC Data Sources
if OpenKey(Software\ODBC\ODBC.INI
\ODBC Data Sources,True) then
begin //注册一个DSN名称
WriteString( MyAccess, Microsoft Access Driver (*.mdb) );
end
else
begin//创建键值失败
memo1.lines.add(增加ODBC数据源失败);
exit;
end;
CloseKey;

//找到或创建Software\ODBC\ODBC.INI
\MyAccess,写入DSN配置信息
if OpenKey(Software\ODBC\ODBC.INI\MyAccess,True) then
begin
WriteString( DBQ, C:\inetpub\wwwroot\test.mdb );//数据库目录
WriteString( Description, 我的新数据源 );//数据源描述
WriteString( Driver, C:\PWIN98\SYSTEM\odbcjt32.dll );//驱动程序DLL文件
WriteInteger( DriverId, 25 );
//驱动程序标识
WriteString( FIL, Ms Access; );
//Filter依据
WriteInteger( SafeTransaction, 0 );
//支持的事务操作数目
WriteString( UID, );//用户名称bData[0] := 0;
WriteBinaryData( Exclusive, bData, 1 );
//非独占方式
WriteBinaryData( ReadOnly, bData, 1 );
//非只读方式
end
else//创建键值失败
begin
memo1.lines.add(增加ODBC数据源失败);
exit;
end;
CloseKey;

//找到或创建Software\ODBC\ODBC.INI
\MyAccess\Engines\Jet
//写入DSN数据库引擎配置信息
if OpenKey(Software\ODBC\ODBC.INI
\MyAccess\Engines\Jet,True) then
begin
WriteString( ImplicitCommitSync, Yes );
WriteInteger( MaxBufferSize, 512 );//缓冲区大小
WriteInteger( PageTimeout, 10 );//页超时
WriteInteger( Threads, 3 );//支持的线程数目
WriteString( UserCommitSync, Yes );
end
else//创建键值失败
begin
memo1.lines.add(增加ODBC数据源失败);
exit;
end;
CloseKey;

memo1.lines.add(增加新ODBC数据源成功);

Free;
end;
end; 
  以上程序在PWIN98+DELPHI3.0下调试通过. 
  下面是创建常见数据库类型的DSN需要设置的信息([]为注释内容,除特殊注释外,各参数可见前面说明): 
1.Access(Microsoft Access Driver(*.mdb)) 

DBQ、Description、Driver[odbcjt32.dll]、
DriverID[25]、FIL[Ms Access;]、
SafeTransaction[默认为0]、UID[默认为空]、
Engines\Jet\ImplicitCommitSync[默认为Yes]、
Engines\Jet\MaxBufferSize[默认512]、
Engines\Jet\PageTimeout[默认为512]、
Engines\Jet\Threads[默认为3]、
Engines\Jet\UserCommitSync[默认为Yes]
可选设置:SystemDb[字符串,系统数据库的路径]、
ReadOnly[二进制,是否以只读方式打开,1为是,默认为0]、
Exclusive[二进制,是否以独占方式打开,1为是,默认为0]、PWD[字符串,用户密码] 
2.EXCEL(Microsoft Excel Driver(*.xls)) 

DBQ[Excel97(=path\xxx.xls)、5.0/7.0
(=path\xxx.xls)、4.0(=path)、3.0(=path)]、
Description、Driver[odbcjt32.dll]、
DefaultDir[Excel97($#@60; $#@62;DBQ)、5.0/7.0
($#@60; $#@62;DBQ)、4.0(=DBQ)、3.0(=DBQ)]、
DriverID[790(Excel97)、22(5.0/7.0)、278(4.0)、534(3.0)]、
FIL[Excel5.0;]、ReadOnly、SafeTransaction、UID、
Engines\Excel\ImplicitCommitSync、
Engines\Excel\MaxScanRows[数字,扫描行数,默认为8]、
Engines\Excel\Threads、Engines\Excel\UserCommitSync、
Engines\Excel\FirstRowHasName[二进制,第一行是否是域名,1表示是,默认为1] 
   注: Excel97和Excel7.0/5.0的DBQ对应一个XLS文件,而Excel4.0和Excel3.0则对应一个目录;DefaultDir对应一个目录,在Excel97和Excel7.0/5.0中是DBQ所对应的路径,而在Excel4.0和Excel3.0下则与DBQ相同;各个版本的DriverID不同. 
3.dBase(Microsoft dBase Driver(*.dbf)) 

DefaultDir[字符串,数据库文件所在目录]、
Description、Driver[odbcjt32.dll]、
DriverID[277(IV)、533(5.0)]、
FIL[dbase III;]、SafeTransaction、UID、
Engines\Xbase\ImplicitCommitSync、
Engines\Xbase\Collating[字符串,排序依据,可为ASCII、International、Norwegian-Danish、
Swedish-Finnish]、
Engines\Xbase\Deleted[二进制,是否不显示被软删除的记录,0表示显示,默认为1]、
Engines\Xbase\PageTimeout[默认为600]、
Engines\Xbase\UserCommitSync、
Engines\Xbase\Threads、Engines\Xbase
\Statistics[二进制,是否用大约的行数,1为是,默认0]
注:(dBaseIV和dBase5.0两个版本的DriverId有不同)

4.Foxpro(Microsoft Foxpro Driver(*.dbf)) 

DefaultDir[数据库文件所在目录]、
Description、Driver[odbcjt32.dll]、
DriverID[536(2.6)、280(2.5)]、
FIL[Foxpro 2.0;]、SafeTransaction、UID、
Engines\Xbase\Collating[字符串,排序依据,可为ASCII、International]、
Engines\Xbase\Deleted[二进制,是否不显示被软删除的记录,0表示显示,默认为1]、
Engines\Xbase\PageTimeout[默认为600]、
Engines\Xbase\UserCommitSync、
Engines\Xbase\Threads、Engines\Xbase
\Statistics[二进制,是否用大约的行数,1为是,默认0]
注:(Foxpro2.5和Foxpro2.6两个版本的DriverId有不同) 
  把上面程序做成一个COM或ActiveX控件吧,在很多高级程序设计语言如DELPHI、C++Buider、VB、VC、PB中都能用到的.

一些类

A  TCursor

设置它可以使鼠标处于不同的显示状态,如

treeview1.Cursor := crHandPoint; //或 treeview1.Cursor := -21;

即使用的方法为 :控件名.Cursor := TCursor type;可以为字符常数或index,可以参考帮助主题TCursor type

 

B TRegIniFile

TRegIniFile是Delphi提供的一个标准注册表操作类。该类的WriteString方法可以向注册表中添加或修改一个字符串值。

 

 

 

Tapplication类

TApplication类是用于描述Delphi编制的应用程序的一个类。通过对这个类的灵活应用可以编制许多有特点的程序。下面我们就举几个这方面的例子。 

---- 1 检测当前Windows程序是否被激活: 

---- Tapplication类有一个属性——Active,这个属性就可以描述当前运行的程序是否被激活,成为Windows的焦点。检测的代码如下: 

If  Application.Active=False then
ShowMessage(’当前窗口没有被激活’);

---- 2 取得当前程序的名称: 

---- Tapplication类的EXEName属性可以返回这个可执行程序的完整文件名(包含路径)。实现的代码如下所示: 

---- ShowMessage(Application.ExeName); 

---- 3 改变程序极小化时的标题 

---- 如果您细心观察可以发现,一些程序的标题和程序的名称并不一致,尤其是一些英文程序,窗体的标题栏比较长,可以容纳比较多的文字,而在最小化时,往往变成了很少的几个字母。这中间起作用的就是Tapplication类的Title属性。这个属性决定了程序最小化时的标题,而窗口中标题栏的标题是由Form的Caption属性来决定的。其代码如下: 

  Form1.Caption:=’ 窗口的标题’;
  Application.Title:=’程序的标题’;

---- 其实我们也可以在在程序设计时指定Tapplication类的Title属性值。操作的方法是在开发环境中拉下Project菜单,选择Options菜单时弹出如图1 (略)的对话框。在这个对话框中的Title栏中填写程序的标题一样也可以达到这种效果。并且因为一般的工程文件都是以英文命名的,所以程序运行过程中弹出的消息框中的标题是英文。但在指定了这个属性之后,这个程序的所有消息窗口的标题都变为Title的值。这就使得程序看起来更加完整。 

---- 4 指明程序的主窗口 

---- Windows系统中的界面都是窗口,但一般来讲有一个主窗口。Tapplication的MainForm属性(TForm类型数据)就可以返回程序的主窗口。 

---- 5 显示消息框 

---- 6 控制窗口的尺寸 

---- 一般可以用窗口手柄来调整窗口的尺寸,但是也可以用Application的事件来调整。实现的方法是用以下两个过程: 

Application.Minimized;
Application.Restore;

---- 前一个过程用来将程序的主窗口最小化,而后一个过程用来将最小化的窗口恢复到原来的尺寸。 

---- 7 链接联机帮助文件 

---- Application的CurrentHelpFile属性能够指定当前程序所用的联机帮助文件的文件名。这个属性经常与另一个方法联合在一起使用。举例如下:  

Application.HelpFile := '联机帮助文件名';
Application.HelpJump('联机帮助文件的主题’)

---- 通过这一命令组合,我们就能使系统弹出一个显示某主题的联机帮助文件。
 

---- 8 在程序运行时动态地创建窗口 

---- 一般情况下,窗口是在设计时加入到工程项目中的,但是有时也需要我们在程序运行时动态地加入窗口,这就要用到Application 的CreateForm过程,举例如下: 

Form3:Tform3; //声明窗口类
Application.CreateForm(TForm3, Form3); //创建窗口

---- 9 结束程序 

---- 虽然我们可以用关闭主窗口的方法来关闭一个程序,但是更好的办法是用Application的Terminate过程。它能够起到更彻底地关闭程序的效果。 

---- 10 Destroy 属性. 

---- 虽然Delphi提供了这一属性,但是并不提倡使用它,如果要终结程序就要调用Terminate过程,而Destroy过程一般是用来在程序发生悬挂时来退出程序时才调用,有些类似Windows中的结束任务功能。它不仅能关闭程序实例本身,而且还能释放程序所占用的资源,能够达到将程序彻底清除出系统的目的

异常类

》》文件链接

1.       异常类的基类是TObject ,参考帮助主题Exception

2.       主要属性:Message;主要方法:Create,CreateFmt,CreateFmtHelp,CreateHelp,

3.       raise保留字产生异常;

4.       通过try…finally语句和try…except语句嵌套来完成异常处理和资源释放

5.       Delphi提供了一个保留字finally,用于实现资源的保护: 

  {分配资源}

  Try

{资源使用情况}

finally

{释放资源}

  end; 

try…finally…end就形成了一个资源保护块。finally后面的语句是在任何情况下,不论程序是否发生异常,都会执行的。

 比如下面一段程序就会造成1K内存资源的丢失。 

var

APointer : Pointer ;

AInt , ADiv: Integer ;

begin

ADiv := 0;

GetMem ( APointer , 1024 );

AInt := 10 div ADiv ;

FreeMem ( Apointer , 1024 );  //不可能有执行的机会

end; 

由于程序从异常发生点退出从而FreeMem永远没有执行的机会。

如下代码即可确保所分配内存资源的释放: 

var

APointer : Pointer ;

AInt , ADiv : Integer;

begin

ADiv := 0;

GetMem ( APointer , 1024 );

try

AInt := 10 div ADiv ;

finally

FreeMem ( Apointer , 1024 );

end;

end; 

一般的,程序

如何自动配置BDE

如果是单机数据库(如paradox,Xbase)直接在Install   Shield的BDE/IDAPI中设定:  

  点击specify   InstallShield   Objects   for   Delphi   5下的General   Options  

  选择BDE(Borland   Database   Engine)项,然后点击“settings...”按钮,选full   BDE   installation,创建一个别名,设定路径,类型。OK  

  如果是大型数据库(如sql   srever):  

  点击specify   InstallShield   Objects   for   Delphi   5下的General   Options  

  选择BDE(Borland   Database   Engine)和sql   links项,然后点击“settings...”按钮,选full   BDE   installation,创建一个别名,设定路径,类型。OK

 

 

记录类型的使用

界面设计和输出结果如下

 

代码如下

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type Tmyrecord = record   //定义用户的数据类型(记录类型)①

  a:string;

  b:string;

  c :integer;

  end;

type

  TForm1 = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

    function f : Tmyrecord;  //定义函数 ②

  public

    { Public declarations }

  end;

 

 

var

  Form1: TForm1;

  re1 : Tmyrecord;    //声明记录变量③

 

implementation

 

{$R *.dfm}

 

{ TForm1 }

 

function TForm1.f: Tmyrecord;

begin      //给记录变量赋值(对记录变量操作)④

re1.a := 'string';

re1.b := 'string2';

re1.c := 128;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

f;   //调用函数

edit1.Text := re1.a;

edit2.Text := re1.b;

edit3.Text := inttostr(re1.c);

end;

 

end.

 

几点说明:

1. ①必须在②前,否则出错,这是因为要先定义类型再引用类型

2. 声明记录变量在Var部分,是先声明记录变量,然后再对记录变量赋值(或操作)

3.完成了③,在④部分操作时,当输入“记录变量名.”后,系统经自动提示记录,如re1中的abc

 

Ordinal type 的操作

Ordinal types include integer, character, Boolean, enumerated, and subrange types. Several predefined functions operate on ordinal values and type identifiers.

High ,Low,Pred,Succ,Ord ,使用参考Delphi帮助主题“Ordinal types”

使用举例如下

  

<
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Version 1.7 ----------- - ADD: Delphi/CBuilder 10.2 Tokyo now supported. - ADD: Delphi/CBuilder 10.1 Berlin now supported. - ADD: Delphi/CBuilder 10 Seattle now supported. - ADD: Delphi/CBuilder XE8 now supported. - ADD: Delphi/CBuilder XE7 now supported. - ADD: Delphi/CBuilder XE6 now supported. - ADD: Delphi/CBuilder XE5 now supported. - ADD: Delphi/CBuilder XE4 now supported. - ADD: Delphi/CBuilder XE3 now supported. - ADD: Delphi/CBuilder XE2 now supported. - ADD: Delphi/CBuilder XE now supported. - ADD: Delphi/CBuilder 2010 now supported. - ADD: Delphi/CBuilder 2009 now supported. - ADD: New demo project FlexCADImport. - FIX: The height of the TFlexRegularPolygon object incorrectly changes with its rotation. - FIX: Added division by zero protect in method TFlexControl.MovePathSegment. - FIX: The background beyond docuemnt wasn't filled when TFlexPanel.DocClipping=True. - FIX: In "Windows ClearType" font rendering mode (OS Windows mode) the "garbage" pixels can appear from the right and from the bottom sides of the painted rectangle of the TFlexText object. - FIX: The result rectangle incorrectly calculated in the TFlexText.GetRefreshRect method. - FIX: Added FPaintCache.rcPaint cleanup in the TFlexPanel.WMPaint method. Now it is possible to define is the drawing take place via WMPaint or via the PaintTo direct call (if rcPaint contain non-empty rectangle then WMPaint in progress). - FIX: The TFlexPanel.FPaintCache field moved in the protected class section. Added rcPaint field in FPaintCache that represents drawing rectangle. - ADD: In the text prcise mode (TFlexText.Precise=True) takes into account the rotation angle (TFlexText.Angle). - FIX: Removed FG_NEWTEXTROTATE directive (the TFlexText Precise mode should be used instead). - FIX: The TFlexRegularPolygon object clones incorrectly drawed in case when TFlexRegularPolygon have alternative brush (gradient, texture). - ADD: Add TFlexPanel.InvalidateControl virtual method which calls from TFle

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值