精华内容
下载资源
问答
  • Delhpi中的函数与过程

    2015-10-06 22:56:57
    Delhpi中的函数与过程 函数与过程的概述 过程可以看作轻量级的函数。 从形式上讲:过程强调处理事务的流程而不是结果,所以过程没有返回值。而函数强调处理事务后的结果,所以有返回值。 从功能上讲:函数可以...

    Delhpi中的函数与过程

    函数与过程的概述

    过程可以看作轻量级的函数。
    从形式上讲:过程强调处理事务的流程而不是结果,所以过程没有返回值。而函数强调处理事务后的结果,所以有返回值。
    从功能上讲:函数可以用作类的构造器即构造函数,而过程不具备这种功能。
    除此之外,函数与过程并没有太大的差异。

    注意:以下类容以函数为准,讲解一些需要注意的事项。

    函数的形式参数的值是否可变

    {使用关键字const后,形式参数的值便不可以改变,否则编译出错}
    function TForm1.ConstFunction(const name: String): String;
    begin
      {不可以这样:name := '鬼A魅'}
      Result := name;
    end;
    
    {默认情况下,形式参数的值是可以改变的}
    function TForm1.NormalFunction(name: String): String;
    begin
      name := '鬼A魅';
      Result := name;
    end;
    

    </pre><h2>函数的形式参数的值是传值还是传址</h2><div></div><pre name="code" class="delphi">var
      MyValue: Integer = 2;//全局变量
    
    {传址,将内存单元MyValue的地址传递给address}
    function TForm1.AddressFunction(var address: Integer): Integer;
    begin
      {因为address中保存的是内存单元MyValue的地址,
        对address的操作就是对MyValue的操作,
        MyValude中的值会发生变化}
      address := address * 2;
      {这里再将内存单元MyValue的地址传递给Result,函数拿到的是MyValue中的值}
      Result := address;
    end;
    
    {传值,将内存单元MyValue的值复制一份传递给value}
    function TForm1.ValueFunction(value: Integer): Integer;
    begin
      {对value的操作是不会影响到MyValue的,
        如果此刻MyValue的值发生变化同样也不会影响到value}
      value := value * 2;
      Result := value;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //结果:2
      showMessage(IntToStr(MyValue));
    
      //结果:4,函数AddressFunction()在这里会改变MyValue的值
      showMessage(IntToStr(AddressFunction(MyValue)));
      //结果:4
      showMessage(IntToStr(MyValue));
    
      //结果:8
      showMessage(IntToStr(ValueFunction(MyValue)));
      //结果:4
      showMessage(IntToStr(MyValue));
    end;
    

    函数的形式参数的开放模式

    说明:可以通过数组来传递参数个数或者参数类型不确定的参数列表

    {参数为数组,该数组的长度与数组中元素的类型均不确定}
    function TForm1.LengthTypeParams(const MyArray: array of const): Integer;
    var
      index: Integer;
      str: String;
    begin
      {通过循环来处理数组中的所有元素}
      for index := Low(MyArray) to High(MyArray) do
        begin
          {因为类型不确定,所以我们需要判断数据的类型然后再进行相应的处理}
          case MyArray [index].VType of
            vtInteger: str := IntToStr(MyArray [index].VInteger);
            vtBoolean: str := BoolToStr(MyArray [index].VBoolean);
          end;
          showMessage(str);
        end;
    end;
    
    {参数为数组,该数组的长度不确定,但数组中元素的类型确定}
    function TForm1.LengthParams(const MyArray: array of Integer): Integer;
    var
      index: Integer;
    begin
      {通过循环来处理数组中的所有元素}
      for index := Low(MyArray) to High(MyArray) do
        showMessage(IntToStr(MyArray[index]));
    end;
    
    
    procedure TForm1.Button2Click(Sender: TObject);
    
    begin
      showMessage(BoolToStr(True));
      LengthParams([1, 3, 5]);//结果为:1,3,5
      LengthTypeParams([520, True]);//结果为:520, -1(True:-1;False:0);
    end;
    
    {元素类型可变的数组,元素的可能类型如下}
    type
      TVarRec = record
        case Byte of
          vtInteger:    (VInteger: Integer; VType: Byte);
          vtBoolean:    (VBoolean: Boolean);
          vtChar:       (VChar: Char);
          vtExtended:   (VExtended: PExtended);
          vtString:     (VString: PShortString);
          vtPointer:    (VPointer: Pointer);
          vtPChar:      (VPChar: PChar);
          vtObject:     (VObject: TObject);
          vtClass:      (VClass: TClass);
          vtWideChar:   (VWideChar: WideChar);
          vtPWideChar:  (VPWideChar: PWideChar);
          vtAnsiString: (VAnsiString: Pointer);
          vtCurrency:   (VCurrency: PCurrency);
          vtVariant:    (VVariant: PVariant);
          vtInterface:  (VInterface: Pointer);
      end;

    函数的形式参数的缺省模式

    注意:声明函数时需要给那些缺省的参数赋初值
        function WithoutParams(param1: Integer; param2: Integer = 2; param3: Integer = 3) : Integer;

    function TForm1.WithoutParams(param1, param2, param3: Integer): Integer;
    begin
      showMessage(IntToStr(param1)+'|'+IntToStr(param2)+'|'+IntToStr(param3));
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      WithoutParams(1); //结果为:1|2|3
      WithoutParams(1, 4); //结果为:1|4|3
      WithoutParams(1, 4, 5); //结果为:1|4|5
    end;

    缺省参数后面的参数都将缺省。

    函数的重载

    说明:函数名字相同,参数列表不同。声明时需要使用关键字overload对同名的函数进行标注。

        function SameNameFunction(): Integer; overload;
        function SameNameFunction(param: Integer): Integer; overload;

      public
        { Public declarations }
        function SameNameFunction(): Integer; overload;
        function SameNameFunction(param: Integer): Integer; overload;



    展开全文
  • delhpi TRegistry

    2014-11-22 17:03:47
    32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。  一、创建和释放TRegistry对象  1....为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create;  2....对注册表操作结束后,...

    32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。
      一、创建和释放TRegistry对象
      1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create;
      2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。
      二、指定要操作的键
      操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。
      1.指定根键(RootKey)。
      根键是注册表的入口,也注册表信息的分类,其值可为:
      HKEY—CLASSES—ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。
      HKEY—CURRENT—USER:存储当前用户的配置信息。为属性RootKey的默认值。
      HKEY—LOCAL—MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。
     HKEY—USERS:存储所有用户通用的配置信息。
      还可以是HKEY—CURRENT—CONFIG、HKEY—DYN—DATA。
      2.指定要操作的主键。
      Function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
      Key:主键名,是键名全名中除去根键的部分,如Software\Borland\Delphi。
      CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。
      返回值True表示操作成功。
      3.关闭当前主键。
      在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。
      三、从注册表中读取信息
      Read系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。
      1.Read系列方法。
      function ReadString(const Name: string): string;
      读取一个字符串值,Name为字符串名称。
      function ReadInteger(const Name: string): Integer;
      读取一个整数值,Name为整数名称。
      function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer;
      读取二进制值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。
      其它方法还有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。
      2.读取信息一例(显示Windows的版本)。
     在HKEY—LOCAL—MACHINE\Software\Microsoft\Windows\CurrentVersion下,有三个字符串值Version、VersionNumber和SubVersionNumber,用于记录当前Windows的版本号。
      {请在Uses中包含Registry单元}
      procedure TForm1.Button1Click(Sender:TObject);
      var
       ARegistry : TRegistry;
      begin
       ARegistry := TRegistry.Create;
      //建立一个TRegistry实例
       with ARegistry do
        begin
       RootKey := HKEY—LOCAL—MACHINE;//指定根键为HKEY—LOCAL—MACHINE
       //打开主键Software\Microsoft\Windows\CurrentVersion
       if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,false ) then
       begin
       memo1.lines.add('Windows版本:′+ ReadString(′Version′));
       memo1.lines.add('Windows版本号:′+ ReadString(′VersionNumber′));
       memo1.lines.add(′Windows子版本号:′+ ReadString(′SubVersionNumber′));
       end;
       CloseKey;//关闭主键
       Destroy;//释放内存
       end;
      end;
      四、向注册表中写入信息
      Write系列方法将信息转化为指定的类型,并写入注册表。
      1.Write系列方法。
      procedure WriteString(const Name, Value: string);
      写入一个字符串值,Name为字符串的名称,Value为字符串值。
      procedure WriteInteger(const Name: string; Value: Integer);
      写入一个整数值。
      procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
      写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。
      其它方法还有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。
      2.写入信息一例。
      下面程序使Delphi随Windows启动而自动运行。
      var
       ARegistry : TRegistry;
      begin
       ARegistry := TRegistry.Create;
      //建立一个TRegistry实例
       with ARegistry do
       begin
       RootKey:=HKEY—LOCAL—MACHINE;
        if OpenKey(′Software\Microsoft\Windows\CurrentVersion\Run′,True) then
       WriteString(′delphi′,′C:\Program Files\borland\delphi3\bin\delphi32.exe′);
       CloseKey;
       Destroy;
       end;
      end;
      五、键值维护
      除了在注册表中读取、存储外,程序可能还需要增加主键、删除主键、主键改名、数据值改名等。
      1.创建新主键:function CreateKey(const Key: string): Boolean。
      Key即为主键名,返回值True表示操作成功。
      2.删除主键:function DeleteKey(const Key: string): Boolean。
      Key即为主键名,返回值True表示操作成功。
      3.复制或移动主键:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。
      OldName、NewName分别表示源主键名和目标主键名;Delete表示是否删除源主键,True表示删除,False表示保留。
      复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。
      4.判断指定主键是否存在,其下是否有主键,并获取主键名称。
      KeyExists用于判断指定主键是否存在:
      function KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。
      HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean;
      返回值为True表示主键下有子键。
     GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings);
     Strings用于返回当前主键下各子键的名称。
      5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)。
      Strings用于返回当前主键下各数值名称。
      如要获取当前系统中的拨号连接名称,可利用获取主键HKEY—USERS \.DEFAULT\RemoteAccess\Addresses下的数值名称的方法来进行。
      6.判断数值名称存在、数值名称改名。
      ValueExists用于判断数值名称是否存在:
      function ValueExists(const Name: string): Boolean;
      返回值为True表示数值名称存在。
      RenameValue用于数值名称改名:
      procedure RenameValue(const OldName, NewName: string);
     以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。
    以上程序在PWIN 98+Delphi 3.0下调试通过。
    2003-11-20 11:53:00
    发表评语&raquo;&raquo;&raquo;
    2003-11-20 11:59:20 注册表中对编程常用的几项(ODBC/BDE/Internet/Windows) 我用的是 WINDOWS 2000, WIN2000 的 REGEDIT 提供了类似 IE 中收藏夹的功能,我的收藏夹中有几个或许对大家编程时会有帮助(这是本人在编程过程中的探索出来的,请高手指教):
    1。关于 ODBC 和 DBE:
    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC File DSN
    有你的 COMPUTER 上 ODBC 的 FILE DSN 的存放的缺省路径,如果你建立 FILE DSN 的时候选择了自己的路径,那你就得小心了,系统不会为你保存该路径,你的自己记住它,:-(;
    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers
    列出了你的所有 ODBC DRIVER,
    关于 ODBC DRIVER 的名称,有一个比较有趣的地方:不知大家又没有用TSession.GetDriverNames 取过系统 ODBC DRIVER 名,我用的时候 DRIVER 名最长只能取到 31 个字符,剩下的就被截掉了,不知是我编程有问题还是 DELPHI 的 BUG;
    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
    列出了你的所有 ODBC DRIVER 的详细配置;
    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
    列出了你的所有 SYSTEM DSN 以及它们的配置情况;
    HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
    列出了你的所有 USER DSN 以及它们的配置情况;
    知道了以上的几个主键后,你就可以在程序中实现 %SystemRoot%\system32\odbcad32.exe 的大部分功能了。
    HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine
    下面是你的 DBE 的配置,我就不多说了,大家拿它和 BDE 用户界面一比较就明白了。
    2。关于 INTERNET 编程:
    HKEY_CLASSES_ROOT\htmlfile
    系统对 HTMLFILE 的处理定义;
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients
    INTERNET Option 中 INTERNET PROGRAM 的设定,尤其重要的是其中的
    HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail。
    3。关于 WINDOWS 编程
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    每次该用户启动 WINDOWS 必定执行下面的命令(如果有,当然一般都有),
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce
    该用户启动 WINDOWS 必定执行下面的命令(如果有),执行完后由 WINDOWS 把命令删掉,安装软件的时候特别有用,
    以上两处是针对特定用户的,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 下还有类似的地方,是针对所有用户的,我就不罗嗦了。
    2003-11-20 12:16:38 Delphi 中注册表构件TRegistry 的应用 在Delphi3.0 及以上版本中,提供了一个构件TRegistry。在程序中可以利用它来实现对WIN95/98/NT 注册表的操作,可以很方便地在注册表中增加、修改和删除键值。这样可以在程序中完成一些特殊的功能。
    ---- TRegistry 常用的属性和方法有(具体作用和用法请参考Delphi 帮
    助):
    RootKey、CreateKey、OpenKey、CloseKey、DeleteKey、ReadXXXX、WriteXXXX
    (XXXX表示数据类型如String、Integer等)
    我们用到的属性和方法有:
    RootKey:注册表的根键名( 如HKEY_LOCAL_MACHINE等)
    OpenKey( KeyName:string; CanCreate:boolean ):
    使当前键为KeyName,CanCreate 表示当指定的键不存在时是否创建,True 表示创建
    SetKey( KeyName,KeyValue : string ):使键KeyName的值为KeyValue
    ---- 应用之一:让自己的程序随WIN95/98/NT 的启动而运行
    当然,你可以在"启动"程序组中加入程序的快捷方式,但这样做好象不大明智,因为大多数程序在安装时不会这样做,而是在通过在注册表增加键值,让WIN95/98/NT 在启动时运行自己的程序。如果打开注册表,找到HKEY_LOCAL_MACHINE \Software \Microsoft\Windows \CurrentVersion \Run,就会发现这个秘密了,原来许多自动运行的程序都在这里。你也可以在这里增加一个键,让你的程序也随着 WIN95/98/NT 的启动而自己运行,成为WINDOWS 下的TSR 程序。实现方法如下:
    首先,在Uses 中加上Registry 单元
    然后,写下面代码。
    {将程序strExeFileName置为自动启动 }
    function StartUpMyProgram ( strPrompt,strExeFileName : string ) : boolean;
    var
    registerTemp : TRegistry;
    begin
    registerTemp := TRegistry.Create;
    //建立一个Registry实例
    with registerTemp do
    begin
    RootKey:=HKEY_LOCAL_MACHINE;
    //设置根键值为HKEY_LOCAL_MACHINE
    //找到Software\Microsoft\Windows\CurrentVersion\Run
    if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True) then
    //写入自己程序的快捷方式信息
    begin
    WriteString( strPrompt, strExeFileName );
    result := true;
    end
    else result := false;
    //善后处理
    CloseKey;
    Free;
    end;
    end;
    {调用StartUpMyProgram,
    使Delphi随WINDOWS启动而自动运行 }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    memo1.lines.add('开始');
    if StartUpMyProgram('delphi','C:\Program Files\borland\delphi3\bin\delphi32.exe') then
    memo1.lines.add('成功')
    else
    memo1.lines.add('失败')
    end;
        备份部分注册表的代码Procedure ExportRegistryBranch (rootsection : Integer; regroot:String; filename:String);
    implementation
    Function dblBackSlash(t:string):string;
    var k:longint;
    begin
    result:=t; {Strings are not allowed to have}
    for k:=length(t) downto 1 do {single backslashes}
    if result[k]='\' then insert('\',result,k);
    end;
    Procedure ExportRegistryBranch (rootsection : Integer; regroot:String; filename:String);
    var
    reg:tregistry;
    f:textfile;
    p:PCHAR;
    Procedure ProcessBranch(root:string); {recursive sub-procedure}
    var
    values,
    keys:tstringlist;
    i,j,k:longint;
    s,t:string; {longstrings are on the heap, not on the stack!}
    begin
    writeln(f); {write blank line}
    case rootsection of
    HKEY_CLASSES_ROOT : s := 'HKEY_CLASSES_ROOT';
    HKEY_CURRENT_USER : s := 'HKEY_CURRENT_USER';
    HKEY_LOCAL_MACHINE : s := 'HKEY_LOCAL_MACHINE';
    HKEY_USERS : s := 'HKEY_USERS';
    HKEY_PERFORMANCE_DATA: s := 'HKEY_PERFORMANCE_DATA';
    HKEY_CURRENT_CONFIG : s := 'HKEY_CURRENT_CONFIG';
    HKEY_DYN_DATA : s := 'HKEY_DYN_DATA';
    end;
    Writeln(f,'['+s+'\'+root+']'); {write section name in brackets}
    reg.OpenKey(root,false);
    values := tstringlist.create;
    keys:=tstringlist.create;
    reg.getvaluenames (values); {get all value names}
    reg.getkeynames (keys); {get all sub-branches}
    for i:=0 to values.count-1 do {write all the values first}
    begin
    s := values[i];
    t := s; {s=value name}
    if s= ''then
    s:='@' {empty means "default value", write as @}
    else
    s:='"' + s + '"'; {else put in quotes}
    write(f,dblbackslash(s)+ '=' ); {write the name of the key to the file}
    Case reg.Getdatatype(t) of {What type of data is it?}
    rdString,
    rdExpandString: {String-type}
    Writeln(f,'"' + dblbackslash(reg.readstring(t) + '"'));
    rdInteger: {32-bit unsigned long integer}
    Writeln(f,'dword:' + inttohex(reg.readinteger(t),8));
    { write an array of hex bytes if data is "binary." Perform a line feed after approx. 25 numbers so the line length stays within limits }
    rdBinary :
    begin
    write(f,'hex:');
    j := reg.getdatasize(t); {determine size}
    getmem(p,j); {Allocate memory}
    reg.ReadBinaryData(t,p^,J); {read in the data, treat as pchar}
    for k:=0 to j-1 do begin
    Write(f,inttohex(byte(p[k]),2)); {Write byte as hex}
    if k<>j-1 then {not yet last byte?}
    begin
    write(f,','); {then write Comma}
    if (k>0) and ((k mod 25)=0) then {line too long?}
    writeln(f,'\'); {then write Backslash + lf}
    end; {if}
    end; {for}
    freemem(p,j); {free the memory}
    writeln(f); {Linefeed}
    end;
    ELSE
    writeln(f,'""'); {write an empty string if datatype illegal/unknown}
    end; {case}
    end; {for}
    reg.closekey;
    {value names all done, no longer needed}
    values.free;
    {Now al values are written, we process all subkeys}
    {Perform this process RECURSIVELY...}
    for i := 0 to keys.count -1 do
    ProcessBranch(root+'\'+keys[i]);
    keys.free; {this branch is ready}
    end;
    begin
    if regroot[length(regroot)]='\' then {No trailing backslash}
    setlength(regroot,length(regroot)-1);
    Assignfile(f,filename); {create a text file}
    rewrite(f);
    IF ioresult<>0 then
    EXIT;
    Writeln(f,'REGEDIT4'); {"magic key" for regedit}
    reg:=tregistry.create;
    try
    reg.rootkey:=rootsection;
    ProcessBranch(regroot); {Call the function that writes the branch and all subbranches}
    finally
    reg.free; {ready}
    close(f);
    end;
    end;
    end.
    2003-11-20 12:22:54 读写网络上其他计算机注册表的代码procedure NetReg;
    var
    R: TRegistry;
    S: TStringList;
    begin
    R:=TRegistry.Create;
    S:=TStringList.Create;
    WriteLn(R.RegistryConnect('\\OtherPC'));
    WriteLn(R.OpenKeyReadOnly('Software'));
    R.GetKeyNames(S);
    WriteLn(S.CommaText);
    S.Free;
    R.Free;
    end;
       关于查看注册表的程序unit regform;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry;
    type
    TForm1 = class(TForm)
    ListSub: TListBox;
    ListValues: TListBox;
    ComboKey: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    ComboLast: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListSubClick(Sender: TObject);
    procedure ComboKeyChange(Sender: TObject);
    procedure ComboLastChange(Sender: TObject);
    private
    Reg: TRegistry;
    public
    procedure UpdateAll;
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Reg := TRegistry.Create;
    Reg.OpenKey ('\', False);
    UpdateAll;
    // select the current root(选择当前的根目录)
    ComboKey.ItemIndex := 1;
    ComboLast.Items.Add('\'); ///
    ComboLast.ItemIndex := 0;
    end;
    //更新
    procedure TForm1.UpdateAll;
    begin
    Caption := Reg.CurrentPath;
    if Capti [Root]';
    if Reg.HasSubKeys then
    Reg.GetKeyNames(ListSub.Items)
    else
    ListSub.Clear;
    Reg.GetValueNames(ListValues.Items);
    end;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    Reg.CloseKey;
    Reg.Free;
    end;
    procedure TForm1.ListSubClick(Sender: TObject);
    var
    NewKey, Path: string;
    nItem: Integer;
    begin
    // get the selection(获取选择项)
    NewKey := ListSub.Items [ListSub.ItemIndex];
    Reg.OpenKey (NewKey, False);
    // save the current path (eventually adding a \)(在不列出于列表时保存路径)
    // only if the it is not already listed
    Path := Reg.CurrentPath;
    if Path < '\' then
    Path := '\' + Path;
    nItem := ComboLast.Items.IndexOf (Path);
    if nItem < 0 then
    begin
    ComboLast.Items.Insert (0, Path);
    ComboLast.ItemIndex := 0;
    end
    else
    ComboLast.ItemIndex := nItem;
    UpdateAll;
    end;
    procedure TForm1.ComboKeyChange(Sender: TObject);
    begin
    case ComboKey.ItemIndex of
    0: Reg.RootKey := HKEY_CLASSES_ROOT;
    1: Reg.RootKey := HKEY_CURRENT_USER;
    2: Reg.RootKey := HKEY_LOCAL_MACHINE;
    3: Reg.RootKey := HKEY_USERS;
    4: Reg.RootKey := HKEY_CURRENT_CONFIG;
    5: Reg.RootKey := HKEY_DYN_DATA;
    end;
    Reg.OpenKey ('\', False);
    UpdateAll;
    ComboLast.Items.Clear;
    end;
    procedure TForm1.ComboLastChange(Sender: TObject);
    begin
    Reg.OpenKey (ComboLast.Text, False);
    UpdateAll;
    end;
    end.
      
         获得注册表项下的所有值Var
    Reg : TRegistry;
    list : TStrings;
    i : Integer;
    Begin
    Reg:=TRegistry.Create;
    Reg.RootKey:='HKEY_LOCAL_MACHINE';
    If Reg.OpenKey('\Software\Microsoft\CurrentVersion\Run', false) then
    Begin
    List:=TStringList.Create;
    Reg.GetValueNames(List);
    For i:=0 to list.Count-1 do
    If Reg.ValueExists(List[i]) then
    Begin
    Case Reg.GetDataType(List[i]) of rdInteger: Reg.ReadInteger(List[i]);
    rdBinary: Reg.ReadBinaryData(List[i]);
    else
    Reg.ReadString(List[i]);
    End;
    End;
    End;

    读取节点值//

    uses Registry;
    function ReadValue(mRootKey: HKEY; mKey, mName: string): string;
    var
    vRegDataInfo: TRegDataInfo;
    begin
    Result := '';
    with TRegistry.Create do try
    RootKey := mRootKey;
    if not OpenKey(mKey, False) then Exit;
    GetDataInfo(mName, vRegDataInfo);
    case vRegDataInfo.RegData of
    rdUnknown: Exit;
    rdString, rdExpandString: Result := ReadString(mName);
    rdInteger: Result := IntToStr(ReadInteger(mName));
    rdBinary: begin
    SetLength(Result, vRegDataInfo.DataSize);
    ReadBinaryData(mName, Result[1], vRegDataInfo.DataSize);
    end;
    end;
    finally
    CloseKey;
    Free;
    end;
    end; { ReadValue }

    展开全文
  • delhpi 身份证校验

    2019-05-28 17:39:07
    ∑(ai×Wi)(mod 11)……………………………………(1) 公式(1)中: i----表示号码字符从由至左包括校验码在内的位置序号; ai----表示第i位置上的号码字符值; Wi----示第i位置上的加权因...
    ∑(ai×Wi)(mod 11)……………………………………(1)
    公式(1)中:
    i----表示号码字符从由至左包括校验码在内的位置序号;
    ai----表示第i位置上的号码字符值;
    Wi----示第i位置上的加权因子,其数值依据公司Wi=2(n-1)(mod 11)计算得出。

    i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
    Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1

    根据公式(1)进行计算,然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
    ∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
    校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2

    用Delphi实现身份证15位升18位的算法
    摘自《网易虚拟社区》 (文/耙子)
      谢谢大虾的帮助。我通过你的帮助,我已经找到了计算机世界的那篇文章, 我还写了delphi的过程,但是不适用于100岁以上的老人。我才发现现在的身份证校验码居然可能是英文字母x,为什么用字母呢?谁知道?
    起码电话上就输不进去新的号码。
    转贴部分计算机世界的文章:
    公民身份号码升位在SYBASE数据库上的实现 四川省绵阳市 胥永康
    根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数 字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
    地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分 隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数 字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。
    某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
    ∑(ai×Wi)(mod 11)……………………………………(1)
    公式(1)中:
    i----表示号码字符从由至左包括校验码在内的位置序号;
    ai----表示第i位置上的号码字符值;
    Wi----示第i位置上的加权因子,其数值依据公司Wi=2(n-1)(mod 11)计算得出。
    i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
    ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
    Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
    ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
    根据公式(1)进行计算:
    ∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
    189 ÷ 11 = 17 + 2/11
    ∑(ai×Wi)(mod 11) = 2
    然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
    ∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
    校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
    根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
    以下是我的delphi 函数[@more@]


    function f(ID: string):string;
    const
    W:array [1..18] of integer = (6,3,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4);
    A:array [0..10] of char = ( '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2');
    var
    i, j, S: integer;
    NewID: string;
    begin
    if Length(ID) <> 15 then
    result:= ' '
    else begin
    NewID:= ID;
    Insert( '19', NewID, 7); //在第七位開始插入‘19‘。
    S:= 0;
    try
    for i:=1 to 17 do
    begin
    j:= StrToInt(NewID[i]) * W[i];
    // j:= StrToInt(NewID[i]) * ((2 shl (19-i)) mod 11);
    S:= S + j;
    end;
    S:= S mod 11;
    Result:= NewID + A[S];
    except
    result:= ' ';
    end;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    edit1.Text:=f('340104790115001'); // 結果: 34010419790115001x
    end;

    來源:http://topic.csdn.net/t/20030525/11/1830789.html

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/729024/viewspace-1041620/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/729024/viewspace-1041620/

    展开全文
  • delhpi控件替换

    2017-08-03 15:43:00
    只替换dfm 文件。替换后,用delphi打开程序,全部忽略。程序自己把pas文件内的 替换为dfm 文件内的控件。 如:TStringField --> TWideStringField; 1.不能多目录替换2....3.先执行格式转换.bat 到 txt文件4....

    只替换dfm 文件。替换后,用delphi打开程序,全部忽略。程序自己把pas文件内的 替换为dfm 文件内的控件。

    如:TStringField --> TWideStringField;

    1.不能多目录替换
    2.必须D盘,目录名不能换。
    3.先执行格式转换.bat 到 txt文件
    4.打开目录内的所有txt文件。
    5.替换。
    6.执行行修改扩展名.bat

     

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    d:
    cd D:\换控件\txt
    rename *.txt *.dfm

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    convert D:\换控件\txt\*.dfm -t -s
    del D:\换控件\txt\*.dfm

     

    转载于:https://www.cnblogs.com/maweiwei/p/7280078.html

    展开全文
  • Delhpi TQuery应用

    2014-06-06 14:16:40
    9.1 有效地使用查询  要有效地使用查询,必须熟悉标准的SQL语言以及所使用的服务器对SQL-92的限制和扩展,同时还要熟悉BDE。 9.1.1 查询桌面数据库  作为一个桌面开发者,应对表格、记录和字段的概念有所了解,...
  • Delhpi6数据库设计思想与实践》 Delphi 教程 系列书籍 (001) 《Delhpi6数据库设计思想与实践》 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 作者=林华聪等编著 页数=460 出版日期=...
  • 『delphi』Delhpi 错误中文手册

    千次阅读 2007-11-03 12:04:00
    Delhpi 错误中文手册; not allowed before ELSE ElSE前不允许有“;” clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 is not a type identifier 不是类型标识符 not previously ...
  • k线 delhpi源代码

    2009-06-04 10:02:48
    划k线,支持读取大智慧数据 通过读取*.day文件,画出k线
  • Delhpi啊Delphi

    千次阅读 2009-10-09 20:38:00
    不经意间,从开始接触Delphi到现在,差不多十年了。可是,水平仍然停留在拉控件的阶段。最近三年,玩得稍多点,有了一点进步。继续玩下去。水平总会慢慢地提高。这 个博客,主要收一些与Delphi相关的文章。...
  • delhpi MD5生成

    2013-05-15 12:19:54
    效果如下图:  调用单元文件:  Unit1.pas [delphi] view plaincopy unit Unit1;... Windows, Messages, SysUtils, Variants, Classes, Graphi
  • 1 、如何实现在Microsoft Access数据库中的图像存储:这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:procedure TForm1...
  • 原文地址:...FHTTPClient:TIdHTTP; begin FHTTPClient := TIdHTTP.Create( Self ); with FHTTPClient do begin Disconnect; Request.Pragma := 'no-cache';...Re...
  • delhpi程序中获取网络资源信息

    千次阅读 2001-05-07 20:23:00
    delhpi程序中获取网络资源信息王发军 充分利用局域网中的共享资源,无疑将减少用户的硬件和软件投资。在我们的程序中,常常会需要列举局域网络中的共享资源,如在MIDAS多层应用程序中可能要选择上层应用程序...
  • <Departments><Department Name = "开发部门"/><Department Name = "市场部门"/></Departments> ...类似这样的字符串,在Delphi里面用什么方法可以方便简捷的取出里面的"开发部门"、"市场部门...
  • 这是从微软那得到的。... 谁给改写成Delphi格式的等价功能的代码?谢谢 Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset ... rs.ActiveConnection = ADOCon ... If rs.Fields(x).Properties("ISAUTOINCREMENT...
  • 上一篇专利数据统计中需要搞清楚的首要问题(1)介绍了通过合并申请号避免重复统计,理清了专利篇数和专利件数的问题,那么还有一类统计就是对发明项数的统计,这里就涉及到对同一项发明的重复统计问题。...
  • delhpi中使用DLL文件

    2007-06-23 16:14:00
    第一章 为什么要使用动态链接库(DLL)提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。(举个例子,笔者的Win95 System目录下尽有500多个DLL文件...
  • 指标与维度是数据分析中最常用到的术语,它们是非常基础的,但是又很重要,经常有朋友没有搞清楚它们之间的关系,只有掌握理解了,我们的数据分析工作开展就就容易多了。现在就来说说指标与维度的那些事。...
  • 一听清楚对业主投诉的事情要保持镇静,耐心倾听客人的投诉内容。二问清楚对业主投诉反映的事情要问清楚,什么时间、地点,反映事情的详细经过,当时没听明白的及时请业主进行重复一遍,态度要诚恳、委婉。...
  • 前两篇财报知识中翻中,阅读量和打赏率一概惨不忍睹阅读量和打赏率,是读者给作者发出的信号。阅读量惨不忍睹,说明很多人看见标题直接就跳过去了。打赏率惨不忍睹,说明看过的朋友里,99%以上的人认为没有什么价值...
  • 记得关注小编,给予支持哦!良心分享持续更新!感谢!前言数据的价值在当今社会被大众广泛认知,特别是在互联网行业,数据价值的媒介被不断探索、发现、沉淀,最后进行价值输出。在普通大众眼里,可能对大数据的概念...
  • unit commvar; interface uses Windows, Messages, SysUtils, Variants, Classes; function SearchInfoPack(Folder: String):TStrings; implementation ...
  • “自我提示”是指一切提示和自我执行的刺激,通过五大感官传达到内心。换句话说,自己对自己的提示就是自我提示,属于一种沟通媒介,处于产生意念的意识部分和产生行动的潜意识部分之间。通过一个人有意识自动产生的...
  • 下面是写的一个小Demo及其运行结果源码如下:procedure TForm1.Button1Click(Sender: TObject);var str1 : string; str2 : shortstring; str3 : PChar;begin str1 := 'abcde'; str2 := 'abcde';...
  • 本文介绍一种将数据复制到剪贴板,然后粘帖到excel的技术,目的是快速将数据导入到excel文件。实践证明,普通的电脑可以每秒导入2000条数据以上.网上已有这方面的文章,本人也将自己的实践经历告诉一下大家,以供大家参考...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
关键字:

delhpi