DELPHI8操作符重载的例子_第1页
DELPHI8操作符重载的例子_第2页
DELPHI8操作符重载的例子_第3页
DELPHI8操作符重载的例子_第4页
DELPHI8操作符重载的例子_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DELPHI8操作符重载的例子

unitWinForm;

interface

uses

System.Drawing,System.Collections,System.ComponentModel,

System.Windows.Forms,System.Data;

type

TWinForm=class(System.Windows.Forms.Form)

{$REGIONVDesignerManagedCode\'}

strictprivate

///

IIIRequireddesignervariable.

Ill

Components:System.ComponentModel.Container;

Buttonl:System.Windows.Forms.Button;

III

IIIRequiredmethodforDesignersupport-donotmodify

///thecontentsofthismethodwiththecodeeditor.

///

procedureInitializeComponent;

procedureButtonl_Click(sender:System.Object;e:System.EventArgs);

{$ENDREGION}

strictprotected

III

IIICleanupanyresourcesbeingused.

Ill

procedureDispose(Disposing:Boolean);override;

private

{PrivateDeclarations}

public

constructorCreate;

end;

〃写成类也可以,这里我用了记录。由于记录是值类型省去了创建实例的麻烦

TCIassTest=record

public

FA:Integer;

〃重载了操作符

classoperatoradd(A,B:TCIassIest):TCIassTest;

end;

[assembly:RuntimeRequiredAttribute(TypeOf(TWinForm))]

implementation

{$REGIONVWindowsFormDesignergeneratedcode\'}

///

IIIRequiredmethodforDesignersupport-donotmodify

///thecontentsofthismethodwiththecodeeditor.

///

procedureTWinForm.InitializeComponent;

begin

Self.Buttonl:=System.Windows.Forms.Button.Create;

Self.SuspendLayout;

//

//Buttonl

//

Self.Buttonl.Location:=System.Drawing.Point.Create(96,88);

Self.Buttonl.Name:=\'Buttonl\';

Self.Buttonl.Size:=System.Drawing.Size.Create(392,112);

Self.Buttonl.Tablndex:=0;

Self.Buttonl.Text:=\'Buttonl\';

lnclude(Self.Buttonl.Click,Self.Buttonl_Click);

//

//TWinForm

//

Self.AutoScaleBaseSize:=System.Drawing.Size.Create(6,14);

Self.ClientSize:=System.Drawing.Size.Create(560,357);

Self.Controls.Add(Self.Buttonl);

Self.Name:=\'TWinForm\';

Self.Text:=\'WinForm\';

Self.ResumeLayout(False);

end;

{$ENDREGION}

procedureTWinForm.Dispose(Disposing:Boolean);

begin

ifDisposingthen

begin

ifComponents<>nilthen

Components.Dispose();

end;

inheritedDispose(Disposing);

end;

constructorTWinForm.Create;

begin

inheritedCreate;

//

//RequiredforWindowsFormDesignersupport

//

InitializeComponent;

//

//TODO:AddanyconstructorcodeafterInitializeComponentcall

//

end;

procedureTWinForm.Buttonl_Click(sender:System.Object;e:System.EventArgs);

var

A,B,C.TCIassIest;

begin

A.FA:=1;

B.FA:=2;

C:=A+B;〃两个结构(或者类)用+操作,在DELHI8以前是不可想象的

system.Windows.Forms.MessageBox.Show(System.Convert.TDString(C.FA));

end;

{TCIassTest}

〃重载“+”操作符的实现

classoperatorTCIassTest.add(A,B:TCIassTest):TCIassTest;

begin

Result.FA:=A.FA+B.FA;

end;

end.

delphitree从一个表复制到另一个表

由于TREE从源表复制到目标表的ID号与PARENT会变化,故不能单纯的复制数据,还要将

ID与PARENT的结构关系复制到目标表。

因此我们用递归操作。

由于myquery的数据会变动,全国计算机等级考试网,加入收藏我们要实时创建

myquery。

下面是delphitree从一个表复制到另一个表的递归源码:

ProcedureTfrm_SysDepasManager.CopyTree(socParent,desParent:integer);〃树递归复制

过程

Var

myquery:TADOQuery;

mysoc,mydes:integer;

Begin

myquery:=Tadoquery.Create(Nil);

Try

myquery.Connection:=frmdata.ADOConnectionl;

myquery.Active:=false;

myquery.SQL.CIear;

myquery.SQL.Add('select*fromLCConstDepawhereparent='+inttostr(socParent));

myquery.Active:=true;

〃插记录

WhileNotmyquery.EofDo

Begin

mysoc:=myquery.FieldByName('ID').Aslnteger;

ReDataSet2.Append;

ReDataSetZ.FieldByNameCshlid'J.AsInteger:=Syspublic.LoginSchoollD;

ReDataSetZ.FieldByNameCnameyAsString:=myquery.FieldByName(*name').AsString;

ReDataSet2.FieldByName('pinyin)AsString:=myquery.FieldByName('pinyin').AsString;

ReDataSet2.FieldByName('parent').Aslnteger:=desParent;

ReDataSet2.Post;

mydes:=ReDataSet2.FieldByName('ID').Aslnteger;

CopyTree(mysoc,mydes);

myquery.Next;

End;

Finally

myquery.Free;

End;

End;

Delphi实现对注册表的监视和扫描

Delphi自带的TRegistry类只能实现注册表的基本操作,如果我们要实时监视注册表的变化

或者扫描注册表特定项下的所有子项,TRegistry类就无能为力了。我啃了半天SDK,终于实

现了Delphi对注册表的监视与扫描,不敢独享,拿来献给广大的Delphi爱好者。

监视注册表相关项的改变要用到一个API:RegNotifyChangeKeyValue,

LONGRegNotifyChangeKeyValue(

HKEYhKey,//要监视的一个项的句柄

BOOLbWatchSubtree,//是否监视此项的子键

DWORDdwNotifyFilter;//监视哪些变化

HANDLEhEvent,//接受注册表变化事件的事件对象句柄

BOOLfAsynchronous//注册表变化前报告还是注册表变化后才报告

);

注意上面的hEvent是接受注册表变化事件的事件对象句柄,我们要用API:CreateEvent

来创建一个系统事件对象。

HANDLECreateEvent(

LPSECURITY_ATTR1BUTESIpEventAttributes,//SECURITY_ATTRIBUTES结构

BOOLbManualReset,//是否自动重置

BOOLblnitialState,//是否设置初始状态

LPCTSTRIpName//事件对象的名称

);

新建一个工程,添加一个ListBox,两个Buttono

〃先写个监视注册表的例子

〃监视HKEY_CURRENT_USER\\Software项下所有子键

procedureTForml.ButtonlClick(Sender:TObject);

var

hNotify:THandle;

hKeyx:HKEY;

dwRes:DWORD;

begin

hNotify:=CreateEvent(nil,〃不使用SECURITY_ATTRIBUTES结构

FALSE,〃不自动重置

TRUE,〃设置初始状态

\'RegistryNotify\,〃事件对象的名称

);

ifhNotify=0then

begin

Showmessage(\,CreateEventfailed.、');

exit;

end;

ifRegOpenKeyEx(HKEY_CURRENT_USER,〃跟键

\'Software、',〃子键

0,//reserved

KEY_NOTIFY〃监视用

hKeyx〃保存句柄

)<>ERROR_SUCCESSthen

begin

CloseHandle(hNotify);

Showmessage(\,RegOpenKeyExfailed.、');

exit;

end;

ifRegNotifyChangeKeyValue(hKeyx,//监视子键句柄

TRUE,〃监视此项的子键

REG_NOTIFY_CHANGE_NAMEorREG_NOTIFY_CHANGE_LAST_SE7;

hNotify,〃接受注册表变化事件的事件对象句柄

TRUE〃注册表变化前报告

)<>ERROR_SUCCESSthen

begin

CloseHandle(hNotify);

RegCloseKey(hKeyx);

Showmessage(\,RegNotifyChangeKeyValuefailed\,);

exit;

end;

dwRes:=WaitForSingleObject(hNotify,60*1000);〃监视一分钟

ifdwRes=0then

Showmessage(\'Registrywillbechanged.\,);

CloseHandle(hNotify);

RegCloseKey(hKeyx);

end;

要注意的是,API:WaitForSingleObject要等到注册表变化事件发生或者超时才会返回,

在此期间我们的程序将失去响应。解决的办法是新建一个线程,在新线程中监视注册表。

对注册表进行扫描要用到另外两个API:RegEnumKey和RegEnumValue。

LONGRegEnumKey(

HKEYhKey,//要扫描的注册表项目句柄

DWORDdwlndex,//要扫描的subkey序号

LPTSTRIpName,//要扫描的subkey名称

LPDWORDIpcbName,//要扫描的subkey名称占用空间

);

此函数的使用方法是:首先给dwlndex赋值0,调用RegEnumKey;然后Inc(dwlndex),再

调用RegEnumKey,直到返回值为ERROR_NO_MORE」TEMS,表示没有更多的子项了。

〃扫描注册表的例子

〃只演示了如何枚举HKEY_CURRENT_USER\\Software下的一层子项

procedureTForml.Button2Click(Sender:TObject);

var

buf:array[0..255]ofchar;

iRes:integer;

hKeyx:HKEY;

dwlndex,dwSize:DWORD;

begin

ifRegOpenKeyExfHKEY_CURRENT_USER,\'Software\,,0,KEY_READor

KEY_ENUMERATE_SUB_KEYS,hKeyx)<>ERROR_SUCCESSthen

begin

ShowmessagefX,RegOpenKeyExfailed.、');

exit;

end;

dwlndex:=0;

repeat

dwSize:=255;

iRes:=RegEnumKey(hKeyx,dwlndex,buf,dwSize);

ifiRes=ERROR_NO_MORE_ITEMSthen

break

elseifiRes=ERROR_SUCCESSthen

begin

Listboxl.ltems.Add(buf);

lnc(dwlndex);

end;

untiliRes<>ERROR__SUCCESS;

RegCloseKey(hKeyx);

end;

try

ifNTNetGetDCName(nil,nil,pDomain)=0then

Result:=WideCharToString(pDomain);

finally

NTNetApiBufferFree(pDomain);

end;

finally

FreeLibrary(Libhandle);

end;

end;

functionGetDomainName:AnsiString;

type

WKSTAJNFO_100=record

wkilOO_platform_id:Integer;

wkilOO_computername:PWideChar;

wkilOOJangroup:PWideChar;

wkilOO_ver_major:Integer;

wkilOO_ver_minor:Integer;

end;

WKSTA_USER_INFO_1=record

wkuil__username:PChar;

wkuiljogon_domain:PChar;

wkuil_logon_server:PChar;

wkuil_oth_domains:PChar;

end;

type

//Win9XANSIprototypesfromRADMIN32.DLLandRLOCAL32.DLL

TWin95_NetUserGetlnfo=function(ServerName,UserName:PChar;Level:DWORD;var

BfrPtr:Pointer):Integer;

stdcall;

TWin95_NetApiBufferFree=function(BufPtr:Pointer):Integer;

stdcall;

TWin95_NetWkstaUserGetlnfo=function(Reserved:PChar;Level:Integer;var

BufPtr:Pointer):Integer;

stdcall;

//WinNTUNICODEequivalentsfromNETAPI32.DLL

TWinNT_NetWkstaGetlnfo=function(ServerName:PWideChar;level:Integer;var

BufPtr:Pointer):Integer;

stdcall;

TWinNT_NetApiBufferFree=function(BufPtr:Pointer):Integer;

stdcall;

var

Win95_NetUserGetlnfo:TWin95_NetUserGetlnfo;

Win95_NetWkstallserGetlnfo:TWin95_NetWkstallserGetlnfo;

Win95_NetApiBufferFree:TWin95_NetApiBufferFree;

WinNT_NetWkstaGetlnfo:TWinNT_NetWkstaGetlnfo;

WinNT_NetApiBufferFree:TWinNT_NetApiBufferFree;

WSNT:AWKSTA_INFO_100;

WS95:AWKSTA_USER_INFO_1;

EC:DWORD;

hNETAPI:THandle;

begin

try

Result:=\';

ifIsWinNTthen

begin

hNETAPI:=LoadLibrary(\,NETAPI32.DLL、');

ifhNEIAPIoOthen

begin@WinNT_NetWkstaGetlnfo:=GetProcAddress(hNETAPI,\?NetWkstaGetlnfo\J);

@WinNT_NetApiBufferFree:=GetProcAddress(hNETAPI,\?NetApiBufferFree\T);

EC:=WinNT_NetWkstaGetlnfo(nilz100,Pointer(WSNT));

ifEC=0then

begin

Result:=WideCharToString(WSNTA.wkilOOJangroup);

WinNT_NetApiBufferFree(Pointer(WSNT));

end;

end;

end

else

begin

hNETAPI:=LoadLibrary(\,RADMIN32.DLL、');

ifhNETAPI<>Othen

begin@Win95_NetApiBufferFree:=GetProcAddress(hNETAPI,\?NetApiBufferFree\J);

@Win95_NetUserGetlnfo:=GetProcAddressfhNETAPI,NetUserGetlnfoA\,);

EC:=Win95_NetWkstaUserGetlnfo(nil,1,Pointer(WS95));

ifEC=0then

begin

Result:=WS95A.wkuil_logon_domain;

Win95__NetApiBufferFree(Pointer(WS95));

end;

end;

end;

finally

ifhNETAPI<>0then

FreeLibrary(hNETAPI);

end;

end;

functionAppendShareResource(ServerName/FilePathzNetName/Remark:string):Integer;

var

Shlnfo:TSHARE_INFO_502;

parm_err:PDWORD;

_FilePath/_NetName/_Remark:PWideChar;

_ServerName:Pchar;

LibHandle:THandle;

begin

LibHandle:=LoadLibrary(NTIib);

ifLibHandle=0then

raiseException.Create(\,Unabletomaplibrary:\'+NTlib);

try

,

@NTNetShareAdd:=GetProcAddress(Libhandle/NetShareAdd\);

分配内存

GetMem(__ServerNamez255);//

GetMem(_FilePath,255);

GetMem(_NetName,255);

GetMem(_Remarkz255);

StringToWideChar(FilePath,_FilePath,255);〃字符串转换,一定要转换正确

StringToWideChar(NetName,_NetName,255);

StringToWideChar(Remark,_Remark,255);

strpcopy(_ServerName,ServerName);

〃开始创建结构

withShlnfodo

begin

shi502_netname:=_NetName;

shi502_type:=STYPE_DISKTREE;

shi502__remark:=_Remark;

shi502_max_uses:=$FFFFFFFF;

shi502_current_uses:=10;

shi502_path:=_FilePath;

shi502_passwd:=nil;

shi502_reserved:=0;

shi502_security_descriptor:=nil;

shi502_permissions:=ACCESS_ALL;

end;

try

Result:=NTNetShareAdd(_ServerName,502,@Shlnfo,parm_err);

finally//别忘了释放内存

FreeMem(_ServerName,255);

FreeMem(_FilePath,255);

FreeMem(__NetName,255);

FreeMem(_Remark,255);

end;

finally

FreeLibrary(Libhandle);

end;

end;

functionDeleteShareResource(ServerName:string;NetName:string):Integer;

var

__ServerName:Pchar;

LibHandle:THandle;

begin

LibHandle:=LoadLibrary(NTIib);

ifLibHandle=0then

raiseException.Create(\,Unabletomaplibrary:\'+NTlib);

try

@NTNetShareDel:=GetProcAddress(Libhandle,NetShareDel\");

分酉己内存

GetMem(__ServerNamez255);//

strpcopy(__ServerName,ServerName);

try

Result:=NTNetShareDel(_ServerName,NetName,。);

finally

FreeMem<_ServerName,255);

end;

finally

FreeLibrary(Libhandle);

end;

end;

functionAddShareResource(ServerName:PChar;FilePath:PChar;

NetName:PChar;Remark:PChar):Integer;

var

MyShare:Share_lnfo50;

PMyShare:AShare_lnfo50;

LibHandle:THandle;

begin

LibHandle:=LoadLibrary(NTIib);

ifLibHandle=0then

raiseException.Create(\TUnabletomaplibrary:\'+MElib);

try

@MENetShareAdd:=GetProcAddress(Libhandle,\TNetShareDel\,);

strLcopy(MyShare.shi50_netname,NetName,13);

MyShare.shi50_type:=0;

MyShare.shi50_flags:=0;

MyShare.shi50__remark:=Remark;

MyShare.shi50_path:=FilePath;

{MyShare.shi50_rw_password:=nil;

MyShare.shiSO_ro_password:=nil;}

PMyShare:=@MyShare;

Result:=MENetShareAdd(ServerName,50,PMySharezSizeOf(MyShare));

finally

FreeLibrary(Libhandle);

end;

end;

functionDelShareResource(ServerName:string;NetName:string):Integer;

var

_ServerName:Pchar;

LibHandle:THandle;

begin

LibHandle:=LoadLibrary(NTIib);

ifLibHandle=0then

raiseException.Create(\,Unabletomaplibrary:\'+MElib);

try

@NTNetShareDel:=GetProcAddress(Libhandle,\TNetShareDel\?);

GetMem(_ServerName,255);//分配内存

strpcopy(_ServerName,ServerName);

try

Result:=NTNetShareDel(_ServerName,NetName,0);

finally

FreeMem(__ServerName,255);

end;

finally

FreeLibrary(Libhandle);

end;

end;

delphi数据库引擎管理器

当用户在硬盘的某个逻辑盘上建立一个目录,用于存放用户数据库文件时,Delphi将如何访

问该目录中所存放的数据库文件。例如,在E盘上建立E:\xsdagl\data目录,用于存放

学生档案管理系统数据库文件,Delphi应如何访问E:\xsdagl\data目录中的数据库文件?

常用方法是使用Delphi数据库引擎管理器建立一个与E:\xsdagl\data目录对应的别名(如

xsda),然后用该别名实现对数据库文件进行访问。因此,在讲述Delphi访问数据库文件方

法前,先介绍数据库引擎管理器BDEAdministrator。

数据库引擎管理器(BDEAdministrator)是对数据库引擎(BDE)进行管理和配置的工具软

件。在访问本地或远程数据库前,编程人员首先需要使用这个软件在本地计算机中创建需使

用数据库的别名,同时指定数据库引擎使用什么样的驱动程序对数据库进行访问。所以数据

库引擎管理器具有以下几个方面的功能:

①为用户访问数据库文件创建数据库别名,也可修改与删除数据库别名。

②对用户所使用的各类数据库引擎进行配置。

③安装和删除用户所使用的各种数据库驱动程序。

Delphi中遍历XML文档的实现方法及源代码

XML文档的节点是标准的树形结构,可以通过递归或者回溯算法来遍历所有的节点八

本例使用递归算法为例,制作了2个遍历XML文档的例子。

第一个例子,给出一个XML节点,遍历所有子节点•不包括起始节点。

第二个例子,给出一个XML节点,遍历所给的节点及其下属的所有子节点。

以上2个示例均列举出了XML文档的标签属性和文本值,是比较完整的示例代码。

<?xmlversion=\"1.0\"encoding=\Hgb2312\"?>

<rootwebsite=\Hhttp://www.whylOOOOO.com\">

<channelid=\"1\"tagname=\"channel\">

<topicid=tagname二、"topic\">Windows频道</topic>

<Urlid=\"l-2\"tagname=\"Url\">www.whylOOOOO.com/_windows</Url>

</channel>

<channelid=\H2\"tagname=\"channel\M>

<topicid=tagname=\"topic\">代码实验室</topic>

<subWebid=\"2-2\"tagname=\"subWeb\H>http://lab.whylOOOOO.com</subWeb>

</channel>

<BBSid=\"03\"tagname=\"BBS\">

<topicid=\"03・l\"tagname=\"topic\">电脑学习社区</topic>

<subWebid=\"03-2\"tagname=\"subWeb\n>http://bbs.whylOOOOO.com</subWeb>

<subBBSid=\"03-3\">

<subBBStopicid=\''0331\">菜鸟学院</subBBStopic>

<subBBStopicid=\"03-3-2\">问吧</subBBStopic>

<subBBStopicid=\"0333\">学吧</subBBStopic>

<subBBStopicid=\"0334\">回吧</subBBStopic>

<subBBStopicid=\"03-3-5\nx/subBBStopic>

<subBBStopic></subBBStopic>

</subBBS>

</BBS>

<AnatherTagnote=\HtestTag-l\"/>

<AnatherTag/>

</root>

{}

functionTForml.GetXmlTreel(nNode:IXMLNode):string;

var

i,j:integer;

begin

fori:=0tonNode.ChildNodes.Count-1do

begin

s:=s+'<'+nNode.ChildNodes.Nodes[i].NodeName;

forj:=0tonNode.ChildNodes[i].AttributeNodes.Count-ldo

begin

s:=s+''+nNode.ChildNodes[i].AttributeNodes[j].NodeName;

s:=s+'=\H,+nNode.ChildNodes[i].AttributeNodes[j].NodeValue+)\"';

end;

s:=s+'>';

ifnNode.ChildNodes.Nodes[i].lsTextElementthen

s:=s+nNode.ChildNodes.Nodes[i].Text;

ifnNode.HasChildNodesandnotnNode.ChildNodes.Nodes[i].lsTextElementthen

begin

s:=s+#13+#10;

GetXmlTreel(nNode.ChildNodes.Nodes[i]);

end;

s:=s+'</'+nNode.ChildNodes.Nodes[i].NodeName+>>'+#13+#10;

end;

result:=s;

end;

}

functionTForml.GetXmlTree2(nNode:IXMLNode):string;

var

i,j:integer;

begin

s:=s+'<'+nNode.NodeName;

forj:=0tonNode.AttributeNodes.Count-1do

begin

s:=s+'+nNode.AttributeNodes[j].NodeName;

s:=s+'=\H,+nNode.AttributeNodes[j].NodeValue\H,;

end;

s:=s+'>f;

ifnNode.lsIextElementthen

s:=s+nNode.Text

else

begin

s:=s+#13+#10;

ifnNode.HasChildNodesthen

fori:=0tonNode.ChildNodes.Count-1do

begin

GetXmlTree2(nNode.ChildNodes.Nodes[i]);

end;

end;

s:=s+'<r+nNode.NodeName+'>'+#13+#10;

result:=s;

end;

{}

调用:

procedureTForml.Button4Click(Sender:TObject);

var

oXml:TXMLDocument;

begin

oXml:=TXMLDocument.Create(self);

oXml.FileName:='_Treeview.xmlJ;

oXml.Active:=true;

s:=";

s:=GetXmlTreel(oXml.ChildNodes.FindNode(,root'));

Memol.Lines.Add(s);

oXml.Free;

end;

procedureTForml.Button5Click(Sender:TObject);

var

oXml:TXMLDocument;

begin

oXml:=TXMLDocument.Create(self);

oXml.FileName:='_Treeview.xmr;

oXml.Active:=true;

,,

s:=;

s:=GetXmlTree2(oXml.ChildNodes.FindNode(Jroot'));

Memol.Lines.Add(s);

oXml.Free;

end;

firebird嵌入式数据库

firebird是一个跨平台的开源数据库,适用interbase授权协议(IPL),从borland的interbase

脱胎而来。以前用interbase/firebird的时候,发布程序的时候哪怕只有一个用户至少也得安

装一个localserver,一些单机版的程序只好使用access来保存数据。但是微软那个mdac偏

偏常出现一些莫名其妙的问题,access2000的数据库文件在win98上就经常出现“插入时无

法定位遇到BOF/EOF...^^一类不知所云的错误提示,安装新版mdac并打上oledb补丁

就能解决问题,不过一个几百k的小程序要带上七八兆的补丁感觉实在不好。我就一直希望

能够把interbase/firebird应用于桌面数据的存储,就是因为那个安装服务器的问题一直没有

好办法。

现在终于发布了嵌入式的firdbird,我们可以用firebirdembbed作为桌面数据库了,跟

C/S版的firebird数据奎一样,对许多现代数据库特性提供充分的支持,可以使用触发器、

存储过程,可以自定义类型,可以自定义外部函数。而且他与firebirdC/S使用相同的文件

格式,也支持将一个数据库文件存储到多个文件,把它的数据文件放到firebirdC/S上立刻

就可以使用,你随时可以把单机应用改造成C/S或者放到web上。应用程序开发与firebirdC/S

没什么不同,可以使用它的CAPI,也可以使用Delphi/BCB的interbase和dbx组件,当然,

安装了0dbe驱动以后,用ado也是可以的。发布程序时只需要提供一个dll,我(门的firebird

应用程序就可以工作了(用ad。不行,用dbx还需要midas.dll和dbexpint.dll),可以很容易地

制作出安装程序,所有的配置工作都可以由程序员自己控制,也不用担心数据库会被用户直

接打开进行改动了。而且据我所知,嵌入式数据库好像还没有支持存储过程和触发器的吧,

access,sqlite都不行,更不用说dbf和paradox了。

Int64与Currency

procedureTForml.ButtonlClick(Sender:TObject);

var

c:Currency;

i:Int64absolutec;

begin

c:=1234.5678;

ShowMessage(lntlbStr(i));//12345678

end;

procedureTForml.Button2Click(Sender:TObject);

var

i:Int64;

c:Currencyabsolutei;

begin

i:=12345678;

ShowMessage(CurrTbStr(c));//1234.5678

end;

procedureTForml.Button3Click(Sender:TObject);

var

i:Int64;

c:Currency;

begin

i:=12345;

ShowMessage(Curr7bStr(PCurrency(@i)A));//l.2345

c:=3.14;

ShowMessage(lntTDStr(Plnt64(@c)A));//31400

end;

获取斐波那契数列的函数

(斐波那契数列:1、2、3、5、8、13、21、34、55、89、144...等于前两数之和}

{昂纳多•斐波那契(LeonardoFibonacci,1170-1240,意大利数学家)}

usesTypes;

{参数2是要获取的总数}

procedurefbnc(varA:Tlnt64DynArray;Count:Integer);

var

i:Integer;

begin

SetLengthfA,Count);

A[0]:=1;

A[l]:=2;

fori:=2toCountdoA[i]:=A[i-2]+A[i-1];

end;

{测试}

procedureTForml.ButtonlClick(Sender:TObject);

var

ns:Tlnt64DynArray;

n:Int64;

begin

fbnc(ns,90);

Memol.Clear;

forninnsdoMemol.Lines.Add(lntToStr(n));

end;

{查看其黄金分割比}

procedureTForml.Button2Click(Sender:TObject);

var

ns:Tlnt64DynArray;

i:Integer;

begin

fbnc(ns,90);

Memol.Clear;

fori:=0toLength(ns)-1do

begin

ifi=0thenContinue;

Memol.Lines.Add(FloatToStr(ns[i]/ns[i-l]));

end;

end;

动态指定存储过程的参数来可视化建立报表工程

由于项目需求变动,需要使用到了Rave进行报表设计,在使用中也查阅了很多资料,但是,

网上的资料很多都是很浅显的入门文章,本文中主要介绍,如何使用带参存储过程作为数据

源,实现可视化报表的设计。

下面是界面设计,很简单,通过选择的日期和时间范围,以要打印数据的类别来生成打

印报表。在界面中添加一个RvProject,几个RvDataSetConnection,几个ADOStoredProc,一

个ADOConnection,当然,这只是为设计时为了方便应用,在完成可视化设计报表格式后,

可以只使用一个存储过程的组件就可以了。

\'800\')this.width=\'800\';if(this.height>\'600\")this.height=\'600\';\"border=0>

思想就是:当可视化建立报表时,需要提供数据源,使用带参数的存储过程在设计时,

需要提供参数值,才能得到由存储过程返回的数据源;而存储过程的参数值是由界面提供

并由用户选择动态产生的,这就需要在设计时,屏蔽参数值的部分,可以采用两种方法:一

是指定固定的参数值,另外就是修改存储过程,先去掉存储过程的参数部分,当然,要保证,

去掉参数前后,存储过程返回的数据集是结构等同的。

下面提供部分代码,以供参考:

存储过程部分:(如何使用表名做参数,我以前写过一个总结)

CREATEProcedureGetSteel@tableNamenvarchar(20),@strDate

nvarchar(20),@strBeginTimenvarchar(30),@strEndTimenvarchar(30)

AS

declare@sSqlnvarchar(4000)

set@sSql=\'selectAVG(CASEWHENP24=999THENNULLELSEP24END)asA1L,AVG(CASE

WHENP23=999THENNULLELSEP23END)asA1R,AVG(CASEWHENP18=999THENNULLELSE

P18END)asA2L,AVG(CASEWHENP17=999THENNULLELSEP17END)asA2R,\'

set@sSql=@sSql+\'AVG(CASEWHENP138=999THENNULLELSEP138END)as

B15L,AVG(CASEWHENP137=999THENNULLELSEP137END)asB15R,AVG(CASEWHENP144=

999THENNULLELSEP144END)asB16L,AVG(CASEWHENP143=999THENNULLELSEP143END)

asB16Rfrom\'

set@sSql=@sSql+@tableName

set@sSql=@sSql+\'WhereTempDate=\'+@strDate+\'ANDTempTimeBETWEEN\'

+@strBeginTime+\'AND\'+@strEndTime

EXECUTEsp_executesql@sSql

GO

在设计时,将参数部分注释掉,同时,将存储过程的名称指定为GetSteel,将Active属

性设为True。然后在Rave工程中建立一个DataView,就可以看到相应的数据字段列表,可

以进行报表的设计了。

在设计完报表后,可以按F9预览,数据源的Active属性为True,可以看到已经有数据

显示在报表中。

下一步就是修改存储过程的属性,将active设为False,去掉ProcedureName属性,然

后在程序中指定存储过程的参数值。

下面是部分代码,已经整理过界面元素,并将连接数据库的控件整理到一个DataMConn

单元中。

WithDataMConn.ADOSPPrintSteeldo

begin

Close;

ProcedureName:=\'GetSteel\';

Parameters.Clear;

Parameters.CreateParameter(\'@tableName\',ftString,pdinput,20,0);

Parameters.CreateParameter(\'@strDate\',ftString,pdinput,20,0);

Parameters.CreateParameter(\'@strBeginTime\',ftString,pdinput,20,0);

Parameters.CreateParameter(\'@strEndTime\',ftString,pdinput,20,0);

Parameters.ParamByName(\'@tableName\,).Value:=tableName;

Parameters.ParamByName(\'@strDate\').Value:=strDate;

Parameters.ParamByName(\'@strBeginTime\').Value:=strBeginTime;

Parameters.ParamByName(\'@strEndTime\').\/alue:=strEndTime;

try

Open;

rvDataSetConnectionl.DataSet:=DataMConn.ADOSPPrintSteel;

except

begin

ShowMessageN打开存储过程出现错误!请联系开发人员\');

Exit;

end;

end;

end;

RvProject.ProjectFile:二GetCurrentDir()+\'\\Project.rav\';//得至lJ工程路径

RvProject.Open;〃打开报表工程

ifcmbKind.Itemindex=0then〃全部数据

begin

WithRvProject.ProjMando〃找到要打印的报表页的日期时间等控件,并赋值

begin

MyPage:=FindRaveComponent(\'Report4.Pagel\',nil)asTRavePage;

MyText^FindRaveComponent^'txtDateWMyPage)asTRaveText;

MyText.Text:=printDate;

MyText^FindRaveComponent^'txtBeginTimeWMyPage)asTRaveText;

MyText.Text:=printBeginTime;

MyText:=FindRaveComponent(\'txtEndTime\',MyPage)asTRavelext;

MyText.Iext:=printEndTime;

end;

RvProject.ExecuteReport(\,report4\);〃执行打印

RvProject.Close;

end;

注意:在存储过程写好后,不要轻易变更各个字段名称,因为这样将导致Rave中的

DataView不可用;在设计时也要十分小心,否则很可能要推倒重来,重新将存储过程设为

无参,注释掉赋参的代码,重新添加DataView等等。我就如此经历了几次,才摸清楚到底

如何使用带参数的存储过程做数据源实现报表的可视化设计,希望对有需要者有些帮助!

计算机二级:delphi播放mp3背景音乐代码

〃以下的代码为delphi中实现播放背景音乐

var

mciOpenParms:TMCI_Open_Parms;

m_MCIDevicelD:MCIDEVIC曰D;

procedureTForml.FormCreate(Sender:TObject);

var

mciPlayParms:MCI_PLAY__PARMS;

ret:integer;

begin

try

begin

mciOpenParms.lpstrDeviceType:=y;

mciOpenParms.lpstrElementName:='做你的爱人.mp3';

mciSendCommand(0/MCI_OPENzMCI_OPEN_ELEMENI;DWORD(@mciOpenParms));

m_MCIDevicelD:=mciOpenParms.wDevicelD;

mciPlayParms.dwCallback:=Forml.Handle;

mciPlayParms.dwFrom:=0;

ret:=mciSendCommand(m_MCIDevicelD/MCI_PLAXMCI__FROMor

MCI_NOTIFYinteger(@mciPlayParms));

end;

except

end;

end;

计算机二级:DELPHI如何在菜单中显示图片

用过Office97吗?是不是觉得在菜单中显示图标很新鲜?如果想让你的程序也能如此锦上

添花,那就请你赶快准备bmp吧!

假设你打算为“文件”菜单栏(name为nl)下的第9项(序号改为8)“打印”添加

一个打印机图标(文件名为c:inter.bmp),那只要在form的OnCreate事件中这样编写:

var

Bmp:TPicture;

begin

Bmp:=TPicture.Create;

Bmp.LoadFromFile(zc:printer.bmp');

SetMenultemBitmaps(nl.Handle,8,MF_BYPOSITION,Bmp.Bitmap.Handle,

Bmp.Bitmap.Handle);

end;

其中,第一个bitmap.handle用于未选定菜单项(unchecked),第二个则指定了选定

(checked)时所显示的bitmap,同异皆可。另外,由于菜单项的高度有限,所以,若bitmap

过大,只有左上角被显示。

计算机二级DELPHI技巧:窗体中底图位置的设置

<Pclass=contentstyle="“MARGIN:"Opx\?2px4px>首先需要调用底图,增加1个image控件,

在属性中选择Picture属性,Load选中的图片。

然后,属性中选择Align属性,该属性中有7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论