用Delphi进行数据库之间转换

用Delphi进行数据库之间转换
用Delphi进行数据库之间转换

用Delphi进行数据库之间转换 

在实际应用中,可能会遇到将一种数据库转为另一种数据库的情况,而Delphi可以完成这种功能。尤其是需要将以前的dbase数据库结构及内容转换成其它数据库结构时,采用此方法简单、快速且安全。 

Delphi是一种Windows应用程序开发软件。它速度快,具有强大且容易使用的可视化开发环境,并采用了具有弹性和可重用的完整的面向对象程序语言。 

由于以上的这些特点,Delphi可以让我们快速地建立起主从结构的应用程序,可产生单一可执行文件与动态链接库以及从单机、网络到主从结构的应用程序。 

使用Delhpi可以方便而快速地建立强大的数据库应用程序,可以和Paradox、dbase、Lo cal InterBase Server、Foxpro及ODBC数据源等多种桌面型数据库直接配合使用。 

数据库转换方法 

1.所使用的控件 

2.TBatchMove控件的使用 

TBatchMove允许在一组记录或是整个数据表中执行特种作业,这个控件的主要用途在于把数据从服务器中卸到本地的数据源供分析或进行其他操作。TBatchMove可以在目的地建立对应于原数据表内容的数据表,自动将列名及数据类型进行适当的对应操作。 

TBatchMove两个特性指明批量移动(Batch Move)操作的源表及目的表。Source指定一个对应于已有的源数据表的数据集(一个Tquery或Ttable控件),Destination指明对应于一个数据库数据表的Ttable控件,目的数据表可以是已经存在的也可以是不存在的。 

Mode特性指明TBatchMove对象所要做的事情: 

我们可以根据batCopy模式,对数据库类型进行适当的转换,以下是从dBASE类型到其它类型之间的转换结果: 

数据库转换举例 

现有用Foxbase开发的财务程序中的会计科目数据库(kjkmk.dbf),系统将升级到Window s环境下开发,数据库将采用Paradox语言。为了沿用该库结构和数据,可采用如下方法进行转换。 

1.Datasource1控件: 

AutoEdit True 

DataSet Table1 

Enabled True 

Name DataSorce1 

2.Table1控件: 

DatabaseName cw 

Name Table1 

Readonly False 

TableName KJKMK 

TableType udBase 

Datasource1控件和Table1控件共同定义被转换的源文件,该文件是

在别名为cw里的kjk mk,文件类型为Dbase。 

3.BatchMove1控件: 

Destination Table2 

Mode balCopy 

Name BatchMove1 

Sorce Table1 

MatchMovel控件定义转换类型为Copy以及源文件、目标文件。 

4.Datasource2控件: 

AutoEdit True 

DataSet Table2 

Enabled True 

Name DataSorce2 

.Table2控件: 

DatabaseName cwdb 

Name Table2 

Readonly False 

TableName KJKMK 

TableType uParadox 

Datasource2控件和Table2控件共同定义转换后的目标文件,该文件是在别名为cwdb里的 kjkmk,文件类型为Paradox。 

6.DbGrid1控件: 

Datasorce Datasorce1 

Name DbGridl 

DbGridl网格控件先定义源文件,执行转换后再定义目标文件,主要用于方便查看。 

7.Button1控件: 

OnClck ButtonClck 

OndragDrop 

Ondragover 

OnEnddrag 

该控件有一个OnClick事件,表示执行文件类型转换。其代码如下: procedure TForm1.Button1Click(Sender:TObject); 

begin 

BatchMove1.execute; 

end; 

经上述方法定义,编译执行后,即可将kjkmk.dbf文件转换成kjkmk.db文件,然后就可以用 Database Desktop工具对其进行修改调整。 

用此方法还可进行其它任意文件的转换。 

ODBC中的同步与异步执行模式 

1.引言 

近年来,随着计算机局域网技术的不断发展,计算机体系结构已经发展到复杂而开放的客户机/服务器模式。对于客户机/服务器应用的开发,现在常用的前端开发工具有:VisualBasic、Delphi、PowerBuilder等。它们可通过ODBC接口访问服务器的SQLServer数据库服务器。 

VisualBasic、Delphi、PowerBuilder等开发工具在使用ODBC2.0来编写程序时,通常会提供三种方法来进行数据库应用程序的方案设计:?使用数据控制项?使用数据库对象变量进行编程?直接调用ODBC2.0API 

在客户机/服务器模式下进行数据库应用程序设计时,仅用前两种方法往往是不够的。因为采用前两种方法,其执行模式对于程序员是透明的,而ODBC2.0访问数据库时存在同步与异步执行模式之分,故容易因设计不当,发生系统死锁。因此,在实际编程序时,我们需要采用第三种方法来解决由同步和异步执行模式所造成的问题。 

2.同步和异步执行模式ODBC2.0访问数据库时,有同步执行模式与异步执行模式之分。 

所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至程序结束。例如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将一直等待服务器将查询结果返回客户机端后,才继续进行下一步操作,如图1所示。 

图1同步执行模式 

所谓异步执行模式,是指语句在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同。例如查询操作,客户机上的应用程序在向服务器发出了查询操作的指令后,将立刻执行查询语句的下一条语句,而不需要等到服务器将查询结果返回客户机端后,才继续进行下一步操作。如图2所示。 

图2异步执行模式 

在一些应用程序开发工具中,在其提供使用数据控制项和数据库对象变量进行编程的同时,并没有很好地考虑到同步执行模式与异步执行模式的重要区别。为了使程序运行速度更快,其语句执行的缺省模式为异步模式。对于一般程序员来说,如果他对同步执行模式与异步执行模式不了解的话,他往往会在对服务器发出一个操作语句(查询或读取一条记录等操作)后,立刻引用服务器返回的执行结果,或者对该结果进行下一步操作;在异步执行模式下,客户机上的后续语句是在该操作语句发出后接着执行的,但由于各种原因,服务器不一定能执行完该操作语句,并在后续语句执行前将结果返回客户机。因此,后续语句在引用前一操作语句的执行结果时,往往会因为该执行结果并不存在而引用了错误的值,造成系统错误或死锁。 

3.解决方案 

解决上面所提到的问题,可以采取以下两种方案:①利用ODBC2.0API,将语句执行状态设置为同步执行模式。ODBC2.0API中,函数SQLSetStmtOption()的功能是设置同步或异步执行模式。我们可

以采用以下语句,将语句执行状态设置为同步执行模式:iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-EN2ABLE,0)其中,hStmt是一有效的语句句柄,常数SQL-ASYNC-ENABLE是所要设置的选项,参数0表示该选项(即异步执行模式)关闭。如果iRetCode返回SQL-SUCCESS,则表示语句执行状态已被设置为同步执行模式。 

②利用ODBC2.0API,将语句执行状态设置为异步执行模式,然后在程序中不断查询一个操作语句是否已经执行完毕。 

ODBC2.0API中共有20多个函数支持异步执行,如上页表所示。 

这些函数第一次调用后,将返回值SQL-STILL-EXE2CUTING,这时应用程序将继续执行后续语句。过了一段时间后,应该再次调用原函数,而且要注意:实参数应传入与第一次调用时相同的语句句柄,其他参数也应一样(但会被忽略)。如果函数返回值为SQL-SUCCESS,则表明该语句已经执行完毕;如果函数返回SQL-STILL-EXECUTING,则表明该语句仍在执行中。 

我们可以用一个简单的例子说明如下:iRetCodeΚSQLSetStmtOption(hStmt,SQL-ASYNC-ENABLE,1)′置语句执行模式为异步执行模式iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23)......′执行其他操作iRetCodeΚSQLExecDirect(hStmt,″SELECT*FROMemployees″,23)′判断SQLExecDirect()是否已执行完毕If(iRetCodeΚSQL-STILL-EXECUTING)Then......′该语句未执行完,继续执行其他操作ElseIf(iRetCodeΚSQL-SUCCESS)Then......′该语句已执行完,可对语句操作结果进行处理EndIfEndIf同步执行模式可以简化程序编制的复杂性,对ODBC2.0API不十分熟悉的程序员,可以不用过多地了解比较复杂的ODBC2.0API,而只需使用数据控制项和数据库对象变量来编写应用程序,使开发效率大大提高,但程序运行速度比不上异步执行模式的速度。 

异步执行模式虽然在编程序时十分复杂,但在这种模式下可以进行多任务并行执行,使执行效率大大提高。 

我们在编制应用程序时,应根据自身的情况,对这两种模式的使用进行划分,以便既提高程序运行的安全可靠性,又提高程序执行的效率。 

Delphi数据库应用程序开发中图像数据的存取技术 

Delphi提供了数据访问(DataAccess)和数据控制(DataControls)的可视化控件,能够方便快捷地产生具有良好界面且功能强大的数据库应用程序。对于涉及图像数据(含Graphic字段)的数据库应用程序,如人事管理信息系统等,图像数据的存取技术是一个关键。然而,有关Delphi下图象的存取,特别是图像的保存方面的技术各种资料上很少提及。下面,笔者结合一个简单的例子来说明。 

一、图像数据的保存 

1.创建一个含有Graphic字段的数据库列表。 

在WindowsISQ(或Databasedesktop)下createdatabasemydb.gdbcreatetablemyfrieds(namevarchar(15)notnull,telephonevarchar(12),addressvarchar(30),zipvarchar(8),picturevarchar(15),imageblob); 

其中,picture字段用于保存图像的名称(包括路径),image(Graphic字符)则用于存储图像,其数据类型为“blob”。 

2.建立窗体(如图1所示),设置窗体中各控件的属性。 

该窗体的主要功能是将某人信息进行编辑和保存。需要注意的图像保存所用的图像框必须用TImage而不能用TDBIm2age,编辑框宜用Tedit而不宜用TDBEdit,这一点与图像的读取恰好相反。 

其中,各主要控件的属性设置如下: 

Datasource1.Dataset:=table1; 

Table1.Databasename:=mydb.gdb; 

Table1.Tablename:=myfriends; 

Table1.active:=true; 

其他诸如Caption之类的属性设置不再叙述。 

3.数据处理程序的建立。 

(1)图像( .bmp文件)打开的处理。 

procedureTForm1.pictopenbtnClick(Sender:TObject); 

beginopendialog1.execute; 

image1.picture.loadfromfile(opendialog1.filename); 

end; 

(2)图像保存的处理。 

图像保存的处理程序完成把在窗体1所编辑的信息包括图像保存到相应的数据库中,其关键是要定义一个Graphic类型的变量且该变量要用assing()函数传递到相应数据库中保存。具体程序如下: procedureTform1.Savebtnclick(sender:TObject); 

vargraphic1:TGraphic; 

begin 

graphic1:=TGraphic.Create; 

graphic1.loadfromfile(opendialog1.filename); 

table1.insert; 

table1.fieldbyname(′name′).asstring:=edit1.text; 

table1.fieldbyname(′telephon′).asstring:=edit2.text; 

table1.fieldbyname(′address′).asfloat:=(edit3.text); 

table1.fieldbyname(′zip′).asfloat:=(edit4.text); 

table1.fields[4].assign(graphic1); 

table1.post; 

graphic1.free; 

end; 

 二、图像数据的读取 

在数据库数据(包括Graphic字段的数据)的读取和浏览方面,Delphi这一具有强大代码自动生成功能的面向对象的开发工具的优越性得到淋漓尽致的体现。毫不夸张地说,不需要一条语句即可完成这一功能! 

建立窗体(如下图所示),设置各控件的属性。 

图中Table1和Datasource1的属性的设置与数据的保存部分(图1)相同,所不同的是数据库数据的读取时用TDBEdit和TD2BImage控件而不用TEdit和TImage。控件TDBEdit和TDBImage只要将datafield属性设置为其相对应的域;TDBNavigator的datasouce属性设置为datasource1即可。 

通过编写代码来设置数据库的别名 

1.在窗体中放置TABLE、DATA2SOURSE和BUTTON控件; 

 2.为BUTTON控件的ONCLICK事件添加如下代码: 

procedureTForm1.Button1Click(Sender:TObject); 

varNewString:string;ClickedOK:Boolean; 

begin 

NewString:=′C:\′; 

ClickedOK:=InputQuery(′DatabasePath′,′Path:--ΛC:\DELPHI\DEMOS\DATA′,NewString); 

ifClickedOKthen 

begin 

Database1.DatabaseName:=′MyNewAlias′; 

Database1.DriverName:=′STANDARD′; 

Database1.Params.Clear; 

Database1.Params.Add(′Path=′+NewString); 

Table1.DatabaseName:=′MyNewAlias′; 

Table1.TableName:=′CUSTOMER′; 

Table1.Active:=True; 

DataSource1.DataSet:=Table1; 

DBGrid1.DataSource:=DataSource1; 

end; 

end; 

用Delphi实现不同数据库系统之间的数据转移 

----在计算机应用系统的软件升级改造过程中,我们经常遇到这样一个问题:老系统的数据库平台与新系统不同。例如,老系统的数据库平台是Foxpro,而新系统的平台是SQLServer。 

而且,我们需要把旧的数据库应用系统中的一些数据转移到新系统来。但是因为新老系统在定义数据类型、数据格式等方面的差异,就很难用人工录入的方法来实现。因此,需要有一个能实现这种功能的程序。 

----本文利用BorlandDelphi实现了这个转移过程。 

----基本思想是:在一个Form中,分别用两个TDatabase控件连接新老数据库。 

并采用TTable、TDbGrid作为数据转移的中心,根据DbGrid中的数据生成标准的SQL插入语句。这样,就实现了从一个数据库系统到另一个数据库系统的数据转移。在这里,采用TTable、TDbGrid作为数据转移的中心是一个技巧,因为:TTable的Fields属性能指示出某字段的字段名称、数据类型等,这为数据转移过程中的Insert语句的生成及数据类型转换提供了依据。 

----下面的例子展示了从Foxpro到SQLServer的数据转移方法。至于其他系统间的数据转移,只要根据目标系统的数据定义要求,修改相应的Insert语句。 

----程序代码如下: 

unit ConvertDBF; 

interface 

uses 

Windows, Messages, SysUtils, Classes, 

Graphics, Controls, Forms, Dialogs, 

StdCtrls, DBTables, Db, Grids, DBGrids; 

type 

TfrmConvertDB = class(TForm) 

btnOK: TButton; 

Label1: TLabel; 

db1: TDatabase;{用于连接老数据库系统} 

db2: TDatabase;{用于连接新数据库系统} 

dbg: TDBGrid; 

tblSource: TTable; {dbg的Datasource} 

qryInsert: TQuery; 

{用于存放生成的SQL Insert语句} 

srcSource: TDataSource; 

tblDest: TTable; {DBGrid1的Datasource} 

DBGrid1: TDBGrid; 

srcDest: TDataSource; 

edFromtbl: TEdit; 

Label2: TLabel; 

Label3: TLabel; 

edToTbl: TEdit; 

procedure btnOKClick(Sender: TObject); 

private 

{ Private declarations } 

public 

{ Public declarations } 

end; 

var 

frmConvertDB: TfrmConvertDB; 

implementation 

{¥R *.DFM} 

procedure TfrmConvertDB.btnOKClick 

(Sender: TObject); 

var iField :integer; 

begin 

if ((edTotbl.text<>'') and 

(edFromtbl.text<>''))then begin 

tblSource.TableName:=edFromtbl.text; 

{指定TableName} 

tblDest.TableName:=edTotbl.text; 

with tblSource do begin 

Open; {打开老系统的表} 

while EOF=FALSE do begin 

{逐条记录处理} 

qryInsert.SQL.Clear; 

qryInsert.sql.Add 

('Insert into '+edTotbl.text + '('); 

for iField:=0 to dbg.FieldCount-1 do begin 

qryInsert.sql.add 

(dbg.Fields[iField].DisplayLabel); 

if iField<>dbg.FieldCount-1 then 

qryInsert.sql.add(','); 

end; 

qryInsert.sql.add(') values('); 

for iField:=0 to dbg.FieldCount-1 do begin {进行数据类型转换} 

if dbg.fields[iField].DataType=ftInteger then qryInsert.sql.add(inttostr 

(dbg.fields[iField].asInteger)); 

if dbg.fields[iField].DataType=ftFloat then qryInsert.sql.add(floattostr 

(dbg.fields[iField].asFloat)); 

if dbg.fields[iField].DataType=ftDate then 

qryInsert.sql.add(''''+datetostr 

(dbg.fields[iField].asDateTime)+''''); 

if dbg.fields[iField].DataType=ftString then begin if dbg.fields[iField].asString<>'' then 

qryInsert.sql.add(''''+dbg.fields 

[iField].asString+'''') 

else 

qryInsert.sql.add('NULL'); 

end; 

if iField<>dbg.FieldCount-1 

then qryInsert.sql.add(','); 

end; 

qryInsert.sql.add(')'); 

qryInsert.ExecSQL; 

{把数据插入到新系统的表中} 

next; 

end; 

end; 

tblDest.Close; 

tblDest.Open;; 

ShowMessage('转换完毕! '); 

end 

else 

ShowMessage 

('请输入要插入数据的表的名称 '); 

end; 

end. 

用Delphi4的QReport部件生成报表 

----用户在使用数据库应用程序时经常要生成报表,利用Delphi 4的QReport部件,可以帮助我们快速方便地生成报表。这里以一个设备管理报表为例说明如何用QReport部件与Query部件设计从多个数据表中生成报表。 

----一、所用数据库 

---- 这里用到三个Foxpro数据表,DLBMK(设备大类编码)、SBXHK(设备型号及配置)、BMSBK(设备所在部门),存放在D:\SB目录下。其库结构如下: 

---- (一) DLBMK 

 字段名称字段类型解释 

1.DLBHN3设备大类的编号 

2.DLMC C20 设备大类的名称 

(二)SBXHK 

字段名称字段类型解释 

1.XHBM N3 设备型号的编码 

2.DLBHN3 同DLBMK中的DLBH字段 

3.SBXH C30设备型号 

4.SBPZC30设备配置 

5.SBSLN3 设备数量 

(三)BMSBK 

字段名称字段类型解释 

1.BMMCC20部门名称 

2.XHBM N3 同SBXHK中的XHBM字段 

3.SLN3 数量 

---- 利用这三个数据表,要生成一个只有电脑部有而其他部门没有的设备型号的情况。 

---- 二、程序中的部件及属性 

---- 程序中有两个窗体:主窗体mainForm与报表窗体repForm。 

---- 主窗体mainForm中有两个TButton部件,设置如下: 

部件 属性及属性值 

PreviewBtn:TButton Caption:预览 

PrintBtn: TButton Caption:打印 

---- 报表窗体repForm中的部件及属性设置如下: 

部件 属性及属性值 

Query1: TQuery DatabaseName:d:\sb 

Active: True 

Qrep1: TQuickrep Dataset:query1 

TitleBand1: TQRBand BandType:rbTitle 

HeadBand1: TQRBand BandType:rbColumnHeader 

DrawLeft : True 

DrawRight: True 

DrawTop : True 

DrawBottom : True 

DetailBand1: TQRBand BandType:rbDetail 

DrawLeft : True 

DrawRight: True 

DrawTop : True 

DrawBottom : True 

ChildBand1: TQRChildBand

 ParentBand:DetailBand1 

DrawLeft : True 

DrawRight: True 

DrawTop : True 

DrawBottom : True 

TitleLabel: TQRLabel Caption:设备统计表 

DlmcLabel: TQRLabel Caption:类别 

SbxhLabel: TQRLabel Caption:型号 

SbpzLabel: TQRLabel Caption:配置 

SbslLabel: TQRLabel Caption:数量 

DlmcDBText: TQRDBText Dataset:Query1 

Datafield: dlmc 

SbxhDBText: TQRDBText Dataset:Query1 

Datafield: sbxh 

SbpzDBText: TQRDBText Dataset:Query1 

Datafield: sbpz 

SbslDBText: TQRDBtext Dataset:Query1 

Datafield: sbsl 

Shape1~9: TQRShape Shape:qrsVertline 

Top:0 

Width:1 

Query1的SQL属性设置为: 

select a.dlbh,a.dlmc,b.sbxh,b.sbpz,b.sbsl 

from dlbmk a,sbxhk b 

where a.dlbh=b.dlbh and b.xhbm not in 

(select xhbm from bmsbk where trim(bmmc)<>’电脑部’) 

order by a.dlbh 

---- 设置几个TQRband部件的DrawLeft、DrawRight、DrawTop、DrawBottom属性值为True,是为了打印表格边框及横线。利用TQRShape部件,是为了打印出表格竖线。DlmcDBText放置在DetailBand1上,其它几个TQRDBText部件放置在ChildBand1上,Shape1~3放置在HeadBand1上,Shape4~6放置在DetailBand1上, Shape7~9放置在ChildBand1上。 

---- 三、为程序增加代码 

---- 1.mainForm窗体中的两个按钮事件 

procedureTmainForm.PreviewBtnClick(Sender : TObject) 

begin 

repForm.Qrep1.Preview; 

end; 

procedureTmainFormPrintBtnClick(Sender : TObject) 

begin 

repForm.Qrep1.Print; 

end; 

---- 2.HeadBand1、DetailBand1及ChildBand1的BeforePrint事件 procedureTrepForm.HeadBand1Before 

Print(Sender : TQRCustomBand; 

VarPrintBand : Boolean) 

Begin 

Shape1.Height:=HeadBand1.Height; 

Shape2.Height:=HeadBand1.Height; 

Shape3.Height:=HeadBand1.Height; 

End; 

procedureTrepForm.DetailBand1Before 

Print(Sender : TQRCustomBand; 

VarPrintBand : Boolean) 

begin 

PrintBand:=bh< >Query1[‘dlbh’]; 

if PrintBandthen 

begin 

bh:=Query1[‘dlbh’]; 

Shape4.Height:=DetailBand1.Height; 

Shape5.Height:=DetailBand1.Height; 

Shape6.Height:=DetailBand1.Height; 

end 

end; 

procedureTrepForm.ChildBand1Before 

Print(Sender : TQRCustomBand; 

VarPrintBand : Boolean) 

Begin 

Shape7.Height:=ChildBand1.Height; 

Shape8.Height:=ChildBand1.Height; 

Shape9.Height:=ChildBand1.Height; 

End; 

bh应在变量定义部分定义: 

Var bh : shortint=0; 

---- 几个TQRShape部件的高度(Height)与所在TQRBand部件保持一致,使竖线打印得整齐。如果在设计阶段调整了TQRBand部件的高度,也不会出现竖线断线或过长的情况。 

---- 在DetailBand1的BeforePrint事件中用PrintBand进行控制,可使每个设备大类名称只需打印一次,而不是每个型号都对应打印一次大类名称。因为dlbh字段的值都大于0,bh初值设为0使它与任一记录的dlbh字段的值都不同,以确保第一个大类名称被打印。这样就生成了一

个从多个数据表中提取数据,并带有表格线的数据报表。 

----注:本例工程文件为sbgl.dpr,原程序文件为main.pas和sbrep.pas,若要测试请将dlbmk.dbf、sbxhk.dbf、bmsbk.dbf三个文件放在d:\sb目录下。 

在Delphi编制的程序运行中动态制作报表 

上海陈春曦---- Delphi中的quickreport是挪威的QuSoft AS公司专门为Delphi设计的用于制作报表的组件,具有很强的访问数据库的能力。但是,从我个人的使用经验来看,这个组件的帮助写的不够详尽,例程也不多。因而一般编程人员都是在设计期间设计好报表的所有格式,并在运行时连上数据源(即delphi中的dataset)运行程序的。显然,这种方法不具备很强的灵活性。在这里我想向大家介绍一种在程序运行时如何动态制作报表的方法。 

---- 首先,建立form1;unit1(调用窗体),其中放入button1:caption为‘预览’,用以查看报表,再加入label1:caption为‘报表标题’;edit1用以接收用户输入的标题。再建立form2(放置quickreport元件的窗体),其中放入quickrep元件和三个qrband元件,其bandtype分别为rbTitle,rbColumnHeader,rbDetail.但其中无须放入qrlabel和qrdbtext元件,由程序中自动生成。再在form2;unit2中放入table1,table2。在databasename属性中填入数据库所在的AliasName.在tablename中分别填入Goods,TableInformation.其中Goods中存放商品信息,可以设置以下字段:ID;Name;Unit;Price。TableInformation中的字段为TableName;FieldsName; DisplayName数据库中填入以下信息。 

Goods ID 商品编号 

Goods Name 商品名称 

Goods Price 商品单价 

---- 好了,准备工作完成了一半,现在写入代码。在unit1的implementation下写入uses Unit2;在button1的click事件中写入以下代码: 

begin 

PreparePrint; 

withForm2do 

begin 

Preview; 

Table1.Close; 

Table2.Close; 

end; 

end; 

在unit1中添加一个过程PreparePrint; 

procedureTForm1.PreparePrint; 

varLeftValue:integer; 

aLabel:TQRLabel; 

aText:TQRDBText; 

begin 

LeftValue:=100; 

withForm2do 

begin 

aLabel:=TQRLabel.Create(Form2);'设置标题 

aLabel.Parent:=TitleBand1; 

withaLabeldo 

begin 

Width:=300; 

Height:=TitleBand1.Height; 

Alignment:=taCenter; 

Caption:=Edit1.Text; 

end; 

Table1.Open; 

Table2.Open; 

Table2.First; 

whilenotTable2.EOFdo 

begin 

aLabel:=TQRLabel.Create(Form2); ’设置显示字段标题 

aLabel.Parent:=HeaderBand1; 

withaLabeldo 

begin 

AutoSize:=False; 

AutoStretch:=True; 

Left:=LeftValue; 

Top:=0; 

Width:=80; 

Height:=HeaderBand1.Height; 

Alignment:=taCenter; 

Caption:=''+table2.FieldbyName( 'DisplayName').AsString+''; 

end; 

aText:=TQRDBText.Create(Form2); '设置显示字段内容 

aText.Parent:=DetailBand1; 

withaTextdo 

begin 

AutoSize:=False; 

AutoStretch:=True; 

Height:=DetailBand1.Height; 

DataSet:=Table1; 

DataField:=Table2.FieldbyName( 'FieldsName').AsString; 

Alignment:=taCenter; 

end; 

LeftValue:=LeftValue+80; 

Table2.Next; 

end; 

end; 

end; 

----好了,运行程序可以看到报表预览的效果,显示了Goods中的ID,Name,Price。在运行时完全可以控制table1和table2中的数据内容。显示不同数据库的不同信息,改变table2中的记录顺序可改变报表中的显示顺序。而且,由于报表的各部分,甚至包括各band和systemdata均可在程序运行时依据上述方法动态生成。其属性也可动态设置。所以我们完全可以制作一个类似于Dephi中FormWizard一样的报表精灵,还可提供一个灵活而且强大的打印设置功能。 

----以上代码在delphi3中运行通过。 

通过DELPHI实现JAVA调用ORACLE数据库数据 

大庆采油六厂采油工艺研究所王兵---- 在开发WWW网络浏览软件中,时常要用到JAVA画一些生产管理图形,而且大量的图形数据存于网络数据库ORACLE中,现在常用的方法是使用JDBC来实现对数据库的操作,但是,如果手头没有它驱动程序,则就无法对数据库进行操作。其实,我们可以使用DELPHI开发JAVA的ORACLE数据接口软件,就具体实现方法简述如下。 

----一、系统设置: 

---- 1.用SQL NET 设置ORACLE数据库所在服务器的IP地址别名,这里假设名字是oracle1; 

---- 2.建立ORACLE ODBC数据源; 

---- 进入控制面板的ODBC数据源,然后点击SystenDSN,再点击Add按钮选择Microsoft ODBC Driver Oracle,在Data Source Name框中输入数据源名(test),在UserName框中输入ORACLE数据用户名(假设为user1)最后在Connect String框中输入在SQLNET中建立的ORACLE数据库别名oracle1; 

----建立好以上两步后,则DELPHI的BDE Administrator中自动生成一个test数据接口,如下图: 

----二、用DELPHI开发读取ORACLE数据库数据的CGI程序 

---- 进入DELPHI编程环境,去掉FORM页及其它控件,然后输入以下程序。 

program testcgi; 

{¥apptype console} 

uses 

SysUtils, DBtables; 

var 

Table1: TTable;//用于读ORACLE数据库数据 

Database1: TDatabase;//用于定义ORACLE别名及用户名和口令 

i,ss,code:integer; 

my,cc:string; 

begin 

writeln('CONTENT-TYPE: TEXT/HTML');//CGI程序要求的数据头信息 

writeln;//保留一行空格 

my:=paramstr(1);//读入JAVA传来的信息 

Table1:=TTable.Create(nil);//创建Table控件 

Database1:=TDatabase.Create(nil);//创建Database控件 

try 

Database1.aliasname:='test';//ORACLE别名 

Database1.databasename:='test'; 

Database1.Params.Clear; 

Database1.Params.add('USER NAME=user1');//用户名 

Database1.Params.add('PASSWORD=userpassword');//口令 

Database1.loginprompt:=false; 

Database1.connected:=true; 

Database1.open; //打开数据库通道 

Table1.databasename:='test'; 

Table1.tablename:='cbkt';//ORACLE表名 

table1.Active := True; 

Table1.open;//打开ORACLE表 

Table1.first; 

//计算满足条件井数 

i:=0; 

while (not table1.eof) do 

begin 

if (Table1.FieldByName('ny').asstring=my) then begin 

write(Table1.FieldByName('jh').asstring+','); val(Table1.Fields[2].asstring,ss,code); 

if ss>0 then 

write(ss*100) 

else 

write('0.0'); 

write(','); 

val(Table1.Fields[3].asstring,ss,code); 

if ss >0 then 

write(ss*100) 

else 

write('0.0'); 

end; 

table1.next 

end; 

finally 

table1.close; 

table1.free; 

end; 

end. 

---- 把以上程序编译后拷入服务器的CGI目录。 

---- 三、JAVA部分程序 

//test.java编写:王兵1999/11/30 

import java.awt.*; 

import java.io.*; 

import java.net.*; 

import java.util.*; 

import java.applet.*; 

public class test extends Applet { 。。。。。。。。 

手把手教你Oracle数据库转换SQL Server

手把手教你Oracle数据库转换SQL Server 2010年11月26日14:33IT168 字号:T|T 近期为公司的一个项目数据库进行了转换,将Oracle的Db转换为SqlServer(2000或2005均可),一开始在网上找了一些资料,发现有个工具叫SwisSql的,尝试了一下,没成功,继续查找.后来经同事提醒,使用SqlServer的导入和导出工具,尝试一下,确实可以转换.操作步骤如下所述. 所需要的环境比较简单,就是本机可以同时连接Oracle和SqlServer即就,注意:这里不必为Oracle数据库建立ODBC,采用直连方式即可,需要新建一个SqlServer数据库,用于加载Oracle的数据.下面以SqlServer2005为例 l 步骤1 打开Sqlserver,如图-1,选中目标数据库,右键->任务->导入数据 转播到腾讯微博

图-1 l 步骤2: 选择”导入数据”菜单,会出现向导,点击下一步,出现如图-2所示界面 转播到腾讯微博

图-2 这里要说明下,最好选择”MicroSoft OLE DB Provider for Oracle方式,选择另外一种方式导入数据时会报错. 输入服务器名称和用户密码,测试成功后,一定要勾选”允许保存密码” l 步骤3 此步骤就是选择目标数据库,如图-3所示 转播到腾讯微博

图-3 步骤4 导入数据有两种方式,一种方式是可视化选择Db表或视图;另一种方式是通过sql语句实现,一般批量导入选择第一种方式 转播到腾讯微博

图-4 l 步骤5 此步骤就是选择我们需要导入的Db对象,如图-5所示 转播到腾讯微博

不确定有限状态自动机的确定化

编译原理实验报告 实验名称不确定有限状态自动机的确定化 实验时间 院系计算机科学与技术学院 班级 学号 姓名

1.试验目的 输入:非确定有限(穷)状态自动机。 输出:确定化的有限(穷)状态自动机 2.实验原理 一个确定的有限自动机(DFA)M可以定义为一个五元组,M=(K,∑,F,S,Z),其中: (1)K是一个有穷非空集,集合中的每个元素称为一个状态; (2)∑是一个有穷字母表,∑中的每个元素称为一个输入符号; (3)F是一个从K×∑→K的单值转换函数,即F(R,a)=Q,(R,Q∈K)表示当前状态为R,如果输入字符a,则转到状态Q,状态Q称为状态R的后继状态; (4)S∈K,是惟一的初态; (5)Z?K,是一个终态集。 由定义可见,确定有限自动机只有惟一的一个初态,但可以有多个终态,每个状态对字母表中的任一输入符号,最多只有一个后继状态。 对于DFA M,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记符连接形成的字符串可为DFA M所接受。若M的初态结点同时又是终态结点,则称ε可为M所接受(或识别),DFA M所能接受的全部字符串(字)组成的集合记作L(M)。 一个不确定有限自动机(NFA)M可以定义为一个五元组,M=(K,∑,F,S,Z),其中: (1)k是一个有穷非空集,集合中的每个元素称为一个状态; (2)∑是一个有穷字母表,∑中的每个元素称为一个输入符号; (3)F是一个从K×∑→K的子集的转换函数; (4)S?K,是一个非空的初态集; (5)Z?K,是一个终态集。 由定义可见,不确定有限自动机NFA与确定有限自动机DFA的主要区别是: (1)NFA的初始状态S为一个状态集,即允许有多个初始状态; (2)NFA中允许状态在某输出边上有相同的符号,即对同一个输入符号可以有多个后继状态。即DFA中的F是单值函数,而NFA中的F是多值函数。 因此,可以将确定有限自动机DFA看作是不确定有限自动机NFA的特例。和DFA一样,NFA也可以用矩阵和状态转换图来表示。 对于NFA M,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记(ε除外)连接形成的字符串可为M所接受。NFA M所能接受的全部字符串(字)组成的集合记作L(M)。 由于DFA是NFA的特例,所以能被DFA所接受的符号串必能被NFA所接受。 设M 1和M 2 是同一个字母集∑上的有限自动机,若L(M 1 )=L(M 2 ),则称有 限自动机M 1和M 2 等价。

delphi数学模块函数、过程大全

function ArcCos(const X : Extended) : Extended; overload; function ArcCos(const X : Double) : Double; overload; function ArcCos(const X : Single) : Single; overload; function ArcSin(const X : Extended) : Extended; overload; function ArcSin(const X : Double) : Double; overload; function ArcSin(const X : Single) : Single; overload; function ArcTan2(const Y, X: Extended): Extended; procedure SinCos(const Theta: Extended; var Sin, Cos: Extended) register; function Tan(const X: Extended): Extended; function Cotan(const X: Extended): Extended; { 1 / tan(X), X <> 0 } function Secant(const X: Extended): Extended; { 1 / cos(X) } function Cosecant(const X: Extended): Extended; { 1 / sin(X) } function Hypot(const X, Y: Extended): Extended; { Sqrt(X**2 + Y**2) } function RadToDeg(const Radians: Extended): Extended; inline; { Degrees := Radians * 180 / PI } function RadToGrad(const Radians: Extended): Extended; inline; { Grads := Radians * 200 / PI } function RadToCycle(const Radians: Extended): Extended; inline; { Cycles := Radians / 2PI } function DegToRad(const Degrees: Extended): Extended; inline; { Radians := Degrees * PI / 180} function DegToGrad(const Degrees: Extended): Extended; function DegToCycle(const Degrees: Extended): Extended; function GradToRad(const Grads: Extended): Extended; inline; { Radians := Grads * PI / 200 } function GradToDeg(const Grads: Extended): Extended; function GradToCycle(const Grads: Extended): Extended; function CycleToRad(const Cycles: Extended): Extended; inline; { Radians := Cycles * 2PI } function CycleToDeg(const Cycles: Extended): Extended; function CycleToGrad(const Cycles: Extended): Extended; { Hyperbolic functions and inverses } function Cot(const X: Extended): Extended; inline; { alias for Cotan } function Sec(const X: Extended): Extended; inline; { alias for Secant } function Csc(const X: Extended): Extended; inline; { alias for Cosecant } function Cosh(const X: Extended): Extended; function Sinh(const X: Extended): Extended; function Tanh(const X: Extended): Extended; function CotH(const X: Extended): Extended; inline; function SecH(const X: Extended): Extended; inline; function CscH(const X: Extended): Extended; inline; function ArcCot(const X: Extended): Extended; { IN: X <> 0 } function ArcSec(const X: Extended): Extended; { IN: X <> 0 } function ArcCsc(const X: Extended): Extended; { IN: X <> 0 } function ArcCosh(const X: Extended): Extended; { IN: X >= 1 } function ArcSinh(const X: Extended): Extended;

Delphi如何使用基本的绘图函数绘制统计图

一个windows自带的画图工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的工具中来实现。这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?这里我们以绘制统计图来说明这些问题。 解决思路―― 这里,我们暂且先撇开具体的问题,综合地一下讨论画图的问题。 画图工具是基本元素的具体实现,对于我们初学者来说,还是有很好的参考价值的,在delphi 5中有一个自带的工程例子“……Borland\Delphi5\Demos\Doc\Graphex”,这个例子可以实现一些基本的绘图功能。对这个例子多加修改,一定会有所收获的。这里就不列出它的详细代码了,有心的读者可以自己找到这个例子。我这里只是想综合地讨论这方面的问题。使用DELPHI编写绘图软件的灵魂就在于操作画布,画笔和刷子,尽可能地挖掘它们的属性和相关参数的设置。 (一)画布 画布,画笔和刷子之间的关系很明了.其实,画笔和刷子都是画布的一个属性.而画布也只是TForm,TImage,TShape等组件对象的一个属性,专门负责与图象相关的信息打交道.它的主要作用可以概括如下几点: 1.指定使用画笔,刷子和字体的使用类型; 2.绘制和填充指定形状的线或图形; 3.修饰和改变图象; 画布的主要属性有: Brush--指定填充图形和背景的样式 CanvasOrientation--指定画布的定位类型,有coLeftToRight, coRightToLeft两个属性; ClipRect--指定剪切矩形的边界; CopyMode--指定图形图象的复制模式; Font--指定画布上使用的字体; Handle--为画布指定窗口GDI对象的设备描述表; LockCount--指定画布被别的线程锁定的次数; Pen--指定画布上使用的画笔,具体见下面描述; PenPos--指定画笔当前的位置; Pixels--指定当前剪切矩形的象素颜色; TextFlags--指定字体在画布上的显示方式,有ETO_CLIPPED,ETO_OPAQUE,ETO_RTLREADING,ETO_GL YPH_INDEX,ETO_IGNORELANGUAGE,ETO_NUMERICSLOCALETO_NUMERIC SLATIN等值可选; 画布相关的API函数及其注释如下: Arc--按指定方式画一条弧; BrushCopy--把位图复制到指定的画布的矩形中,用画布刷子颜色替换位图的颜色; Chord--按指定方式画弦; CopyRect--从一个矩形区域复制部分图象到另一个矩形区域; Draw--用指定参数在指定位置画图; DrawFocusRect--按指定焦点风格,通过异或操作来绘制一焦点矩形; Ellipse--按指定参数画一椭圆; FillRect--按指定的刷子填充一矩形; FloodFill--使用当前选定的刷子填充指定设备描述表中的一块区域;

DELPHI常用函数说明

一、数据类型转换函数1 在我们编写程序当中,根据不同情况,会使用到多种数据类型。当要对不同的类型进行操作时,必须要将不同的类型转换成同样的类型。因此熟练地掌握数据类型的转换是非常重要的。 1.FloatToStr 功能说明:该函数用于将“浮点型”转换成“字符型”。 参考实例: Edit1.Text := FloatToStr(1.981); 2.IntToStr 功能说明:该函数用于将“整数型”转换成“字符型”。 参考实例: S := IntToStr(10);(注:S为String类型变量。) 3.IntToHex 功能说明:该函数用于将“十进制”转换成“十进制”。该函数有二个参数1。第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据。 参考实例: Edit1.Text := IntToHex('100', 2);

执行结果,Edit1.Text等于64。 注意:Delphi没有提供专门的“十六进制”转换为“十进制”的函数。使用StrToInt函数可以实现这个功能。具体代码是:I := StrToInt('S\' + '64'); 这时I等于100。加上一个'S\'即可将“十六进制”转换为“十进制”。 4.StrToInt 功能说明:该函数用于将“字符型”转换成“整数型”。 参考实例: I := StrToInt('100'); 注意:不能转换如StrToInt('ab')或StrToInt('好')这样的类型,因为他们并不存在数字型。 5.StrToFloat 功能说明:该函数用于将“字符型”转换成“浮点型”。 参考实例: N := StrToFloat(Edit1.Text); 注意:Edit1.Text中的内容为1.981(凡在Edit 控件中显示的文本均为字符串)。N为Double类型,用于保存转换后的浮点型数据。

access与SQL数据库之间的转换

用Access将XLS与MDB文件格式互相转换 最近,网络管理员在服务器上分给我一块空间,用来展示一些资料。为了方便大家在网络上查询,便作了一个简单的ASP查询系统,其中所链接的是MDB格式的Access数据库,而在建网之前,资料是用Excel表格 将ACCESS转化成SQL2000要注意的问题 很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS 的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---将ACCESS 转化成SQL2000的方法和注意事项一,首先,我说的是在ACCESS2000,SQL2000之间转换,其他的我也还没有尝试过,希望大家多多试验,肯定是有办法的; MicrosoftAccess秘密技巧和陷阱 不正确地调用Windows应用程序接口可能会产生一些意想不到的副作用,以及潜在地对一个应用程序的代码及数据段的破坏。正确地使用一个空的32位指针在MicrosoftAccess中是十分必要的。当对表格和报表进行操作时,MicrosoftAccess有一个无正式文本的特性。这个特性允许你从设计视窗性质sheetwindow中进行过程调用,调用的方法时同时按下shift和F2键 在ASP程序中访问Access数据库 在基于微软IIS/PWS的网络平台上,通过服务器端运行的ASP程序来访问后台数据库,是一种最常见的模式了。而对于小型的数据库应用需求,微软的Access数据库,应该是与ASP程序配套使用的首选。由于Access数据库的ODBC驱动程序支持的SQL指令全,执行效率高,所以Access后台数据库+ASP 服务器端程序+客户端IE浏览器,是一个精练实用高效的组合模式。 建立Access 数据库的安全门 在Office 2000下,Access数据库的安全机制已经更为完善。除了对数据库设置密码保护,对数据库进行编码压缩,还可以启用用户级的安全机制,在用户级别上控制对数据库的访问。一、数据库设置密码对于单机使用的数据库或者是需要工作组共享的数据库,仅设置密码保护较为合适。知道密码的组成员,都有数据库的完全操作权限,彼此之间的使用权限没有什么区别。 以独占方式打开Access数据库 在默认情况下,Access 2000/2002数据库是以“共享”的方式打开的,这样可以保证多人能够同时使用同一个数据库。不过,在共享方式打开数据库的情况下,有些功能比如压缩和修复数据库是不可用的。此外,当系统管理员要对数据库进行维护时,也不希望他人打开数据库。以下的方法可以让你以独占的方式打开Access数据库。 给你的数据库文件减肥 在数据库的设计过程中经常要添加、删除数据库对象,这会使数据库内部留有许多碎片,不能有效地利用磁盘空间,文件会逐渐增大。

Delphi函数大全

Delphi函数大全 首部function Languages: TLanguages; $[ 功能返回系统语言对象 说明通过此函数可以得到系统的语言环境 参考type 例子 12a12c12a12c. 参考 例子:= IsValidIdent; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToStr(Value: Integer): string; overload; $[ 首部function IntToStr(Value: Int64): string; overload; $[ 功能返回整数Value转换成字符串 说明Format('%d', [Value]) 参考function 例子:= IntToStr; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToHex(V alue: Integer; Digits: Integer): string; overload; $[ 首部function IntToHex(V alue: Int64; Digits: Integer): string; overload; $[ 功能返回整数Value转换成十六进制表现结果;Format('%.*x', [Digits, Value]) 说明参数Digits指定字符最小宽度;最小宽度不足时将用0填充 参考function 例子:= IntToHex, ; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToInt(const S: string): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时将引起异常 参考procedure 例子:= StrToInt; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToIntDef(const S: string; Default: Integer): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时则返回默认值Default 参考procedure 例子:= StrToIntDef, 0); ━━━━━━━━━━━━━━━━━━━━━ 首部function TryStrToInt(const S: string; out Value: Integer): Boolean; $[ 功能返回字符串S转换成整数V alue是否成功 说明字符串非整数表达时返回False并且Value将输出为0 参考procedure 例子 ..);打开失败则返回负数 参考function

利用KEGG数据库进行ID转换

利用KEGG 数据库进行ID 转换 clusterProfiler can convert biological IDs using OrgDb object via the bitr function. Now I implemented another function, bitr_kegg for converting IDs through KEGG API.library(clusterProfiler) data(gcSample) hg head(hg)## [1] '4597' '7111' '5266' '2175' '755' '23046' eg2np ## Warning in bitr_kegg(hg, fromType = 'kegg', toType = 'ncbi-proteinid', ## organism = 'hsa'): 3.7% of input gene IDs are fail to map... head(eg2np)## kegg ncbi-proteinid ## 1 8326 NP_003499 ## 2 58487 NP_001034707 ## 3 139081 NP_619647 ## 4 59272 NP_068576 ## 5 993 NP_001780 ## 6 2676 NP_001487 np2up head(np2up)## ncbi-proteinid uniprot ## 1 NP_005457 O75586 ## 2 NP_005792 P41567 ## 3 NP_005792 Q6IAV3 ## 4 NP_037536 Q13421

DELPHI常用组件

Delphi常用组件的使用 目录 1.按钮类组件 1.1Button组件

Button组件位于Standard页。 Button组件的常用属性表 属性描述 Cation用于在按钮上显示文本内容 Cancel用来指定按钮是否为取消按钮 Default用于指定按钮是否为默认按钮,在按Enter键时也选中命令按钮Hint设置鼠标在组件上短暂停时在组件旁显示的提示小窗口的内容ShowHint确定是否显示提示文本,默认值是FALSE 1.2Bitbtn组件 Bitbtn组件(位图组件)位于Additional,与Button很相似,只是多了一个位图符号在按钮上(如带有对号的OK,问好的Help等),其某些属性与Button类似,下表为其独有的的特性。(注:此组件不需编写代码) Bitbtn组件的常用属性表 属性描述 Kind Kind属性的值就是位图按钮上显示的图标。Kind属性后的下拉列表中有一组默认图标的属性值,有bkCancel(取消)、bkAbort(终止)、bkAll(所有)、 bkClose(关闭)等。 Glyph用于在位图按钮上显示加载后的位图图形 NumGlyphs用于指明位图按钮所能使用位图的个数。在delphi中,最多允许向一个位图按钮提供4个图像文件,用于表示4中不停状态 Layout用于指出位图图形在位图组件上的放置位置 1.3SpeedButton组件 SpeedButton组件(加速按钮)位于Additional,常放置在Panel组件上,用于设计工具栏。它与Bitbtn相似,也可以显示图像和文本,但通常只用于显示图像。 SpeedButton组件的常用属性表 属性描述 AllowAllUp用于设置同一组的加速按钮是否具有同时弹起的状态。若设置为FALSE,则当同一组加速按钮中的一个被按下时,其他加速按钮都处于弹起状态,即这 组按钮必须有且只有一个处于按下状态 Down用于设置该加速按钮是否处于按下状态,若设置为TRUE,则表示按钮处于按下状态 Flat用于设置在鼠标移动到该按钮上时,按钮是否显示三维效果。为FLASE则不出现 GroupIndex用于将数个加速按钮设置成一组,只需将其值设置成不等于0的数值即可1.4RadioButton组件

有限状态自动机的确定化

有限状态自动机的确定化 姓名:翟彦清学号:E10914127 一、实验目的 设计并实现将 NFA确定化为DFA的子集构造算法,从而更好地理解有限自动机之间的等价性,掌握词法分析器自动产生器的构造技术。该算法也是构造LR分析器的基础。 输入:非确定有限(穷)状态自动机。 输出:确定化的有限(穷)状态自动机二、实验原理 一个确定的有限自动机(DFA M可以定义为一个五元组,M k( K,E, F, S, Z),其中: (1)K是一个有穷非空集,集合中的每个元素称为一个状态; (2)刀是一个有穷字母表,刀中的每个元素称为一个输入符号; (3)F是一个从K XE^ K的单值转换函数,即 F (R, a)= Q ( R, Q€ K)表示当前状态为R,如 果输入字符 a,则转到状态 Q,状态Q称为状态R的后继状态; (4)S€ K,是惟一的初态; (5)Z K,是一个终态集。 由定义可见,确定有限自动机只有惟一的一个初态,但可以有多个终态,每个状态对字母表中的任一输入符号,最多只有一个后继状态。 对于DFAM,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记符连接形成的字符串可为DFAM所接受。若M的初态结点同时又是终态结点,则称&可为 M所接受(或识别),DFA M所能接受的全部字符串(字)组成的集合记作 L(M)。 一个不确定有限自动机(NFA M可以定义为一个五元组,M=(K, E, F, S, Z), 其中:( 1) k 是一个有穷非空集,集合中的每个元素称为一个状态; (2)E是一个有穷字母表,E中的每个元素称为一个输入符号; (3)F是一个从K xE^ K的子集的转换函数; (4)S K,是一个非空的初态集; (5)Z K,是一个终态集。 由定义可见,不确定有限自动机 NFA与确定有限自动机DFA的主要区别是: (1)NFA的初始状态S为一个状态集,即允许有多个初始状态; (2)NFA中允许状态在某输出边上有相同的符号,即对同一个输入符号可以有多个后继状态。即DFA中的F是单值函数,而NFA中的F是多值函数。 因此,可以将确定有限自动机DFA看作是不确定有限自动机NFA的特例。和DFA—样,NFA也可以用矩阵和状态转换图来表示。 对于NFAM,若存在一条从某个初态结点到某一个终态结点的通路,则称这条通路上的所有弧的标记(&除外)连接形成的字符串可为M所接受。NFAM所 能接受的全部字符串(字)组成的集合记作 L(M)。 由于DFA是 NFA的特例,所以能被DFA所接受的符号串必能被NFA所接受。 设M和M是同一个字母集E上的有限自动机,若 L (M)= L (M),贝U称有限自动机M和M等价。 由以上定义可知,若两个自动机能够接受相同的语言,则称这两个自动机等价。DFA是 NFA的特例,因此对于每一个 NFAM总存在一个DFAM,使得L (M) 二L (M)。即一个不确定有限自动机能接受的语言总可以找到一个等价的确定有限自动机来接受该

(DELPHI)API函数大全

(DELPHI)API函数大全 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件

数据库时间格式转化

数据库时间格式转化? 1 2 3 4 5 6 7 8 9 10 11 12 select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ','') 20040912110608 select CONVERT(varchar(12) , getdate(), 23 ) 2008-04-01 select CONVERT(varchar(12) , getdate(), 111 ) 2004/09/12 select CONVERT(varchar(12) , getdate(), 112 ) 20040912 select CONVERT(varchar(12) , getdate(), 102 ) 2004.09.12 其它不常用的日期格式转换方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 select CONVERT(varchar(12) , getdate(), 101 ) 09/12/2004 select CONVERT(varchar(12) , getdate(), 103 ) 12/09/2004 select CONVERT(varchar(12) , getdate(), 104 ) 12.09.2004 select CONVERT(varchar(12) , getdate(), 105 ) 12-09-2004 select CONVERT(varchar(12) , getdate(), 106 ) 12 09 2004 select CONVERT(varchar(12) , getdate(), 107 ) 09 12, 2004 select CONVERT(varchar(12) , getdate(), 108 ) 11:06:08 select CONVERT(varchar(12) , getdate(), 109 ) 09 12 2004 1 select CONVERT(varchar(12) , getdate(), 110 ) 09-12-2004 select CONVERT(varchar(12) , getdate(), 113 ) 12 09 2004 1 select CONVERT(varchar(12) , getdate(), 114 )

delphi常用函数大全

delphi常用函数大全(转) Abort函数引起放弃的意外处理 Abs函数绝对值函数 AddExitProc函数将一过程添加到运行时库的结束过程表中 Addr函数返回指定对象的地址 AdjustLineBreaks函数将给定字符串的行分隔符调整为CR/LF序列Align属性使控件位于窗口某部分 Alignment属性控件标签的文字位置 AllocMem函数在堆栈上分配给定大小的块 AllowGrayed属性允许一个灰度选择 AnsiCompareStr函数比较字符串(区分大小写) AnsiCompareText函数比较字符串(不区分大小写) AnsiLowerCase函数将字符转换为小写 AnsiUpperCase函数将字符转换为大写 Append函数以附加的方式打开已有的文件 ArcTan函数余切函数 AssignFile函数给文件变量赋一外部文件名 Assigned函数测试函数或过程变量是否为空 AutoSize属性自动控制标签的大小 BackgroundColor属性背景色 BeginThread函数以适当的方式建立用于内存管理的线程 BevelInner属性控件方框的内框方式 BevelOuter属性控件方框的外框方式 BevelWidth属性控件方框的外框宽度 BlockRead函数读一个或多个记录到变量中 BlockWrite函数从变量中写一个或多个记录 BorderStyle属性边界类型 BorderWidth属性边界宽度 Break命令终止for、while、repeat循环语句 Brush属性画刷 Caption属性标签文字的内容 ChangeFileExt函数改变文件的后缀 ChDir函数改变当前目录 Checked属性确定复选框选中状态 Chr函数返回指定序数的字符 CloseFile命令关闭打开的文件 Color属性标签的颜色 Columns属性显示的列数 CompareStr函数比较字符串(区分大小写) Concat函数合并字符串 Continue命令继续for、while、repeat的下一个循环 Copy函数返回一字符串的子串 Cos函数余弦函数 Ctl3D属性是否具有3D效果 Cursor属性鼠标指针移入后的形状 Date函数返回当前的日期 DateTimeToFileDate函数将DELPHI的日期格式转换为DOS的日期格式DateTimeToStr函数将日期时间格式转换为字符串DateTimeToString函数将日期时间格式转换为字符串 DateToStr函数将日期格式转换为字符串

delphi函数参考手册

delphi函数参考手册 名称类型说明 abort 函数引起放弃的意外处理 abs 函数绝对值函数 addexitproc 函数将一过程添加到运行时库的结束过程表中addr 函数返回指定对象的地址 adjustlinebreaks 函数将给定字符串的行分隔符调整为cr/lf序列align 属性使控件位于窗口某部分 alignment 属性控件标签的文字位置 allocmem 函数在堆栈上分配给定大小的块 allowgrayed 属性允许一个灰度选择 ansicomparestr 函数比较字符串(区分大小写)ansicomparetext 函数比较字符串(不区分大小写)ansilowercase 函数将字符转换为小写 ansiuppercase 函数将字符转换为大写 append 函数以附加的方式打开已有的文件 arctan 函数余切函数 assignfile 函数给文件变量赋一外部文件名 assigned 函数测试函数或过程变量是否为空 autosize 属性自动控制标签的大小 backgrounddi2001.jpg 属性背景色 beginthread 函数以适当的方式建立用于内存管理的线程bevelinner 属性控件方框的内框方式

bevelouter 属性控件方框的外框方式 bevelwidth 属性控件方框的外框宽度 blockread 函数读一个或多个记录到变量中blockwrite 函数从变量中写一个或多个记录borderstyle 属性边界类型 borderwidth 属性边界宽度 break 命令终止for、while、repeat循环语句 brush 属性画刷 caption 属性标签文字的内容 change 函数改变文件的后缀 chdir 函数改变当前目录 checked 属性确定复选框选中状态 chr 函数返回指定序数的字符 closefile 命令关闭打开的文件 color 属性标签的颜色 columns 属性显示的列数 comparestr 函数比较字符串(区分大小写)concat 函数合并字符串 continue 命令继续for、while、repeat的下一个循环copy 函数返回一字符串的子串 cos 函数余弦函数 ctl3d 属性是否具有3d效果

Delphi字符串处理函数

【字符串函数大全】 首部function AnsiResemblesText(const AText, AOther: string): Boolean; $[StrUtils.pas 功能返回两个字符串是否相似 说明ANSI(American National Standards Institute)美国国家标准协会;不区分大小写参考function StrUtils.SoundexProc; var StrUtils.AnsiResemblesProc 例子CheckBox1.Checked := AnsiResemblesText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━ 首部function AnsiContainsText(const AText, ASubText: string): Boolean; $[StrUtils.pas 功能返回字符串AText是否包含子串ASubText 说明不区分大小写 参考function StrUtils.AnsiUppercase; function StrUtils.AnsiPos 例子CheckBox1.Checked := AnsiContainsText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━ 首部function AnsiStartsText(const ASubText, AText: string): Boolean; $[StrUtils.pas 功能返回字符串AText是否以子串ASubText开头 说明不区分大小写 参考function https://www.360docs.net/doc/502881592.html,pareString 例子CheckBox1.Checked := AnsiStartsText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━ 首部function AnsiEndsText(const ASubText, AText: string): Boolean; $[StrUtils.pas 功能返回字符串AText是否以子串ASubText结尾 说明不区分大小写 参考function https://www.360docs.net/doc/502881592.html,pareString 例子CheckBox1.Checked := AnsiEndsText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━ 首部function AnsiReplaceText(const AText, AFromText, AToText: string): string; $[StrUtils.pas 功能返回字符串AText中用子串AFromText替换成子串AToText的结果 说明不区分大小写 参考function SysUtils.StringReplace; type SysUtils.TReplaceFlags 例子Edit4.Text := AnsiReplaceText(Edit1.Text, Edit2.Text, Edit3.Text);

有限自动机ATM机状态转换

有限自动机ATM机状态转换 0引言 有限自动机源于20世纪40年代,是一种用于研究离散事件动态系统的数学模型,1943年麦克卡赛(McCulloch)与皮特斯(Pitts)建立了模拟神经网络的自动机。1956年莫尔(Moore)建立了描述计算机的时序机的概念。此后,自动机理论迅速发展,与计算机技术密切结合,在人工智能、自动控制等领域有广泛应用。有限自动机是计算机科学的重要基石,它可以用来研究时序线路与计算机的构造,是计算机硬件的理论基础。由于计算机中的数以二进制形式表示,所以计算机基本的加法器功能可以用有限自动机来实现。计算机的操作系统在信息处理进程中需要一定资源。在不同资源条件下,进程处于不同的状态。进程活动中要不断提出申请资源和归还资源的请求,这些请求与进程的状态和资源的条件有关。操作系统的这些活动体现了一个有限自动机的功能特征,因此操作系统的信息处理过程可以用有限自动机来刻画。 1 ATM机状态分析 ATM机是当前银行较为常用的一种用户自助操作的机器,它是以实时操作系统软件基础实现的强实时系统。ATM机具有事务的基本特性,即:原子性、一致性、隔离性、持久性。其中,原子性保证了事务的操作是一个完整的过程,要么做,要么不做;一致性:保证事务从一个一致性状态转换到另外一个一致性状态,此特性与原子性密切相关;隔离性:即一个事务的执行不被其他事务所干扰,各事务之间执行互不干扰;持久性:即一个事务一旦提交,它对数据库中的数据改变就是永久性的。从插卡到某个动作操作成功为一个原子操作,要么成功,提交事务,更新数据库;要么失败,退回到插卡前的操作,数据库中数据仍为原来的数据,不发生改变。本文从ATM机的基本状态出发来讨论ATM机中的状态迁移。 ATM机的基本状态包含了插卡,输入密码,余额查询,取款,存款,转账,退出这几个基本状态。其中初始阶段为等待插卡阶段,此阶段等待磁卡的插入;插入以后则系统状态变为插卡状态,此状态判断插入的磁卡是否有效,有效则跳转到输入密码状态,系统状态变为登录状态,此时可以根据需要进行查询、取款、存款、转账等状态的转换;若输入密码错误则继续保持插卡状态等待正确的用户

相关文档
最新文档