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事件中写画画的代码。
窗体关闭询问
窗体关闭前会触发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”
使用举例如下
<