怎样通过二级delphi经典中经典.docx

上传人:b****6 文档编号:7133988 上传时间:2023-01-21 格式:DOCX 页数:75 大小:51.72KB
下载 相关 举报
怎样通过二级delphi经典中经典.docx_第1页
第1页 / 共75页
怎样通过二级delphi经典中经典.docx_第2页
第2页 / 共75页
怎样通过二级delphi经典中经典.docx_第3页
第3页 / 共75页
怎样通过二级delphi经典中经典.docx_第4页
第4页 / 共75页
怎样通过二级delphi经典中经典.docx_第5页
第5页 / 共75页
点击查看更多>>
下载资源
资源描述

怎样通过二级delphi经典中经典.docx

《怎样通过二级delphi经典中经典.docx》由会员分享,可在线阅读,更多相关《怎样通过二级delphi经典中经典.docx(75页珍藏版)》请在冰豆网上搜索。

怎样通过二级delphi经典中经典.docx

怎样通过二级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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1