版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题申报参考:科学发明问题解决中原型启发效应的认知神经机制及其干预研究
- 2024年高纯人造硅灰石项目投资申请报告代可行性研究报告
- 教育行业中的个性化宣传册设计策略
- 二零二五年度大连离婚协议书定制与调解服务合同4篇
- 技术培训保密用工合同
- 2025年新世纪版七年级物理上册阶段测试试卷
- 2025年人教五四新版八年级地理下册阶段测试试卷含答案
- 2025年牛津上海版九年级地理下册月考试卷含答案
- 2025年上教版选修3生物上册阶段测试试卷含答案
- 2025年沪科版必修3生物下册阶段测试试卷
- 垃圾处理厂工程施工组织设计
- 天疱疮患者护理
- 2025年高考物理复习压轴题:电磁感应综合问题(原卷版)
- 2025年蛇年新年金蛇贺岁金蛇狂舞春添彩玉树临风福满门模板
- 《建筑制图及阴影透视(第2版)》课件 4-直线的投影
- 2024-2030年中国IVD(体外诊断)测试行业市场发展趋势与前景展望战略分析报告
- 碎纸机设计说明书
- 湖南省长沙市青竹湖湘一外国语学校2021-2022学年八年级下学期期中语文试题
- 2024年股权代持协议经典版(3篇)
- 一站到底试题及答案完整版(第2801-2900题)
- 《税务风险文献综述》
评论
0/150
提交评论