怎样通过二级delphi经典中经典.docx
《怎样通过二级delphi经典中经典.docx》由会员分享,可在线阅读,更多相关《怎样通过二级delphi经典中经典.docx(75页珍藏版)》请在冰豆网上搜索。
怎样通过二级delphi经典中经典
DELPHI8操作符重载的例子
unitWinForm;
interface
uses
System.Drawing,System.Collections,System.ComponentModel,
System.Windows.Forms,System.Data;
type
TWinForm=class(System.Windows.Forms.Form)
{$REGION\'DesignerManagedCode\'}
strictprivate
///
///Requireddesignervariable.
///
Components:
System.ComponentModel.Container;
Button1:
System.Windows.Forms.Button;
///
///RequiredmethodforDesignersupport-donotmodify
///thecontentsofthismethodwiththecodeeditor.
///
procedureInitializeComponent;
procedureButton1_Click(sender:
System.Object;e:
System.EventArgs);
{$ENDREGION}
strictprotected
///
///Cleanupanyresourcesbeingused.
///
procedureDispose(Disposing:
Boolean);override;
private
{PrivateDeclarations}
public
constructorCreate;
end;
//写成类也可以,这里我用了记录。
由于记录是值类型省去了创建实例的麻烦
TClassTest=record
public
FA:
Integer;
//重载了“+”操作符
classoperatoradd(A,B:
TClassTest):
TClassTest;
end;
[assembly:
RuntimeRequiredAttribute(TypeOf(TWinForm))]
implementation
{$REGION\'WindowsFormDesignergeneratedcode\'}
///
///RequiredmethodforDesignersupport--donotmodify
///thecontentsofthismethodwiththecodeeditor.
///
procedureTWinForm.InitializeComponent;
begin
Self.Button1:
=System.Windows.Forms.Button.Create;
Self.SuspendLayout;
//
//Button1
//
Self.Button1.Location:
=System.Drawing.Point.Create(96,88);
Self.Button1.Name:
=\'Button1\';
Self.Button1.Size:
=System.Drawing.Size.Create(392,112);
Self.Button1.TabIndex:
=0;
Self.Button1.Text:
=\'Button1\';
Include(Self.Button1.Click,Self.Button1_Click);
//
//TWinForm
//
Self.AutoScaleBaseSize:
=System.Drawing.Size.Create(6,14);
Self.ClientSize:
=System.Drawing.Size.Create(560,357);
Self.Controls.Add(Self.Button1);
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.Button1_Click(sender:
System.Object;e:
System.EventArgs);
var
A,B,C:
TClassTest;
begin
A.FA:
=1;
B.FA:
=2;
C:
=A+B;//两个结构(或者类)用+操作,在DELHI8以前是不可想象的
system.Windows.Forms.MessageBox.Show(System.Convert.ToString(C.FA));
end;
{TClassTest}
//重载“+”操作符的实现
classoperatorTClassTest.add(A,B:
TClassTest):
TClassTest;
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.ADOConnection1;
myquery.Active:
=false;
myquery.SQL.Clear;
myquery.SQL.Add('select*fromLCConstDepawhereparent='+inttostr(socParent));
myquery.Active:
=true;
//插记录
WhileNotmyquery.EofDo
Begin
mysoc:
=myquery.FieldByName('ID').AsInteger;
ReDataSet2.Append;
ReDataSet2.FieldByName('shlid').AsInteger:
=Syspublic.LoginSchoolID;
ReDataSet2.FieldByName('name').AsString:
=myquery.FieldByName('name').AsString;
ReDataSet2.FieldByName('pinyin').AsString:
=myquery.FieldByName('pinyin').AsString;
ReDataSet2.FieldByName('parent').AsInteger:
=desParent;
ReDataSet2.Post;
mydes:
=ReDataSet2.FieldByName('ID').AsInteger;
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_ATTRIBUTESlpEventAttributes,//SECURITY_ATTRIBUTES结构
BOOLbManualReset,//是否自动重置
BOOLbInitialState,//是否设置初始状态
LPCTSTRlpName//事件对象的名称
);
新建一个工程,添加一个ListBox,两个Button。
//先写个监视注册表的例子
//监视HKEY_CURRENT_USER\\Software项下所有子键
procedureTForm1.Button1Click(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_SET,
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,//要扫描的注册表项目句柄
DWORDdwIndex,//要扫描的subkey序号
LPTSTRlpName,//要扫描的subkey名称
LPDWORDlpcbName,//要扫描的subkey名称占用空间
);
此函数的使用方法是:
首先给dwIndex赋值0,调用RegEnumKey;然后Inc(dwIndex),再调用RegEnumKey,直到返回值为ERROR_NO_MORE_ITEMS,表示没有更多的子项了。
//扫描注册表的例子
//只演示了如何枚举HKEY_CURRENT_USER\\Software下的一层子项
procedureTForm1.Button2Click(Sender:
TObject);
var
buf:
array[0..255]ofchar;
iRes:
integer;
hKeyx:
HKEY;
dwIndex,dwSize:
DWORD;
begin
ifRegOpenKeyEx(HKEY_CURRENT_USER,\’Software\’,0,KEY_READor
KEY_ENUMERATE_SUB_KEYS,hKeyx)<>ERROR_SUCCESSthen
begin
Showmessage(\’RegOpenKeyExfailed.\’);
exit;
end;
dwIndex:
=0;
repeat
dwSize:
=255;
iRes:
=RegEnumKey(hKeyx,dwIndex,buf,dwSize);
ifiRes=ERROR_NO_MORE_ITEMSthen
break
elseifiRes=ERROR_SUCCESSthen
begin
Listbox1.Items.Add(buf);
Inc(dwIndex);
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
WKSTA_INFO_100=record
wki100_platform_id:
Integer;
wki100_computername:
PWideChar;
wki100_langroup:
PWideChar;
wki100_ver_major:
Integer;
wki100_ver_minor:
Integer;
end;
WKSTA_USER_INFO_1=record
wkui1_username:
PChar;
wkui1_logon_domain:
PChar;
wkui1_logon_server:
PChar;
wkui1_oth_domains:
PChar;
end;
type
//Win9XANSIprototypesfromRADMIN32.DLLandRLOCAL32.DLL
TWin95_NetUserGetInfo=function(ServerName,UserName:
PChar;Level:
DWORD;var
BfrPtr:
Pointer):
Integer;
stdcall;
TWin95_NetApiBufferFree=function(BufPtr:
Pointer):
Integer;
stdcall;
TWin95_NetWkstaUserGetInfo=function(Reserved:
PChar;Level:
Integer;var
BufPtr:
Pointer):
Integer;
stdcall;
//WinNTUNICODEequivalentsfromNETAPI32.DLL
TWinNT_NetWkstaGetInfo=function(ServerName:
PWideChar;level:
Integer;var
BufPtr:
Pointer):
Integer;
stdcall;
TWinNT_NetApiBufferFree=function(BufPtr:
Pointer):
Integer;
stdcall;
var
Win95_NetUserGetInfo:
TWin95_NetUserGetInfo;
Win95_NetWkstaUserGetInfo:
TWin95_NetWkstaUserGetInfo;
Win95_NetApiBufferFree:
TWin95_NetApiBufferFree;
WinNT_NetWkstaGetInfo:
TWinNT_NetWkstaGetInfo;
WinNT_NetApiBufferFree:
TWinNT_NetApiBufferFree;
WSNT:
^WKSTA_INFO_100;
WS95:
^WKSTA_USER_INFO_1;
EC:
DWORD;
hNETAPI:
THandle;
begin
try
Result:
=\’\’;
ifIsWinNTthen
begin
hNETAPI:
=LoadLibrary(\’NETAPI32.DLL\’);
ifhNETAPI<>0then
begin@WinNT_NetWkstaGetInfo:
=GetProcAddress(hNETAPI,\’NetWkstaGetInfo\’);
@WinNT_NetApiBufferFree:
=GetProcAddress(hNETAPI,\’NetApiBufferFree\’);
EC:
=WinNT_NetWkstaGetInfo(nil,100,Pointer(WSNT));
ifEC=0then
begin
Result:
=WideCharToString(WSNT^.wki100_langroup);
WinNT_NetApiBufferFree(Pointer(WSNT));
end;
end;
end
else
begin
hNETAPI:
=LoadLibrary(\’RADMIN32.DLL\’);
ifhNETAPI<>0then
begin@Win95_NetApiBufferFree:
=GetProcAddress(hNETAPI,\’NetApiBufferFree\’);
@Win95_NetUserGetInfo:
=GetProcAddress(hNETAPI,\’NetUserGetInfoA\’);
EC:
=Win95_NetWkstaUserGetInfo(nil,1,Pointer(WS95));
ifEC=0then
begin
Result:
=WS95^.wkui1_logon_domain;
Win95_NetApiBufferFree(Pointer(WS95));
end;
end;
end;
finally
ifhNETAPI<>0then
FreeLibrary(hNETAPI);
end;
end;
functionAppendShareResource(ServerName,FilePath,NetName,Remark:
string):
Integer;
var
ShInfo:
TSHARE_INFO_502;
parm_err:
PDWORD;
_FilePath,_NetName,_Remark:
PWideChar;
_ServerName:
Pchar;
LibHandle:
THandle;
begin
LibHandle:
=LoadLibrary(NTlib);
ifLibHa