在 delphi 中如何保存数据(100分)

  • 主题发起人 主题发起人 superxishi
  • 开始时间 开始时间
S

superxishi

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在delphi编程,保存设置改如何去做?
 
可以使用INI文件或写进注册表这样的方式。
 
也可以 把 设置 保存回 数据库。
当一般 不会这样做, 会选择 Ini 文件,注册表
 
存成XML文件。呵呵...也很方便。
 
目前XML渐火,INI操作简单。
 
也看保存流!一般的人还看不懂。保密好
 
有这方面的例子吗?
现在我需要 我现在建立了主窗体-程序运行的主体。我需要在另外一个窗体中修改工艺参数。比如电机速度,电机加速度的修改和保存。
希望给于执教,谢谢3了。
 
在DELPHI5中应用INI文件保存程序设置


INI文件在系统配置及应用程序参数设置与保存方面,具有很重要的作用,而且比起读写系统注册表来说,具有方便、安全
和“环保”等无可比拟的特点。所以现在几乎所有的可视化编程工具,如VB、VC、VFP、C++Builder和Delphi等都提供了读写
INI文件的方法。其中Delphi中操作INI文件,最为简洁,这是因为Delphi提供了一个TInifile类,从而无需调用系统的API函数,
使我们操作INI文件变得更加灵活和快捷。

首先,让我们先来了解一下INI文件的结构:
;注释
[小节名]
关键字=值
...
INI文件允许有多个小节(Section),每个小节又允许有多个关键字(Key), “=”后面是该关键字的值。值的类型有三种:字符串、整型
数值和布尔值。其中字符串存贮在INI文件中时不需要加引号,布尔值用0和1来表示,1表示“真”(True),0表示“假”(Fa
lse),注释则是以分号“;”作为一行的开头。

接着我们就来看一下具体在DELPHI5中,如何操作INI文件。首先要在程序中引用INI文件单元,方法是:在Interface的
Uses节增加IniFiles。接着再在变量定义部分增加一行:
MyInifile: TInifile;
然后,就可以对变量MyInifile进行创建、打开、读取、写入等操作了。
下面我们就分别来看一下如何进行以上所述的一系列操作:

1. 打开INI文件
MyInifile: =TInifile.Create ('LoginSys.ini');
上面这一行语句将会为变量MyInifile与具体的文件 LoginSys.ini建立联系,然后,就可以通过变量MyInifile,来读写
LoginSys.ini文件中的关键字的值了。值得注意的是,如果括号中的文件名没有指明路径的话,那么这个LoginSys.ini文件会
存储在Windows目录中。把LoginSys.ini文件存储在应用程序当前目录中的正确方法是:为其指定完整的路径及文件名。下面
的两条语句可以完成这个功能:
Filename: =ExtractFilePath(ParamStr(0))+'LoginSys.ini';
MyInifile:=TInifile.Create(Filename);

2. 读取关键字的值
针对INI文件支持的字符串型、整型、浮点型、日期型、日期时间型、时间型和布尔型七种数据类型,TIniFiles类提供了
七种不同的对象方法来读取INI文件中关键字的值。假设已定义变量vstr、vi、vf、vdt、vldt、vtime和vbln分别为字符串型、
整型、浮点型、日期型、日期时间型、时间型和布尔型类型,以下即为分别读取这七种类型关键字的示例代码:
vstr:=MyInifile.ReadString('小节名','关键字',缺省值);
vi:=Myinifile.ReadInteger('小节名','关键字',缺省值);
vf:=Myinifile.ReadFloat('小节名','关键字',缺省值);
vdt:=Myinifile.ReadDate('小节名','关键字',缺省值);
vldt:=Myinifile.ReadDateTime('小节名','关键字',缺省值);
vtime:=Myinifile.ReadTime('小节名','关键字',缺省值);
vbln:=MyInifile.ReadBool('小节名','关键字',缺省值);
其中缺省值为该INI文件不存在该关键字时返回的缺省值。

3. 写入INI文件
同样的,TInifile类也提供了七种不同的对象方法,向INI文件写入字符串型、整型、浮点型、日期型、日期时间型、时间
型和布尔型这七种类型的关键字。示例代码分别如下:
MyInifile.WriteString('小节名','关键字',变量或字符串值);
MyInifile.WriteInteger('小节名','关键字',变量或整型数值);
MyInifile.WriteFloat('小节名','关键字',变量或浮点型数值);
MyInifile.WriteDate('小节名','关键字',变量或短日期型数值);
MyInifile.WriteDateTime('小节名','关键字',变量或长日期型数值);
MyInifile.WriteTime('小节名','关键字',变量或时间型数值);
MyInifile.WriteBool('小节名','关键字',变量或True或False);
当这个INI文件不存在时,上面的语句还会自动创建该INI文件。而当一个小节不存在时,也会自动创建。

4. 删除关键字
如何不想再继续使用某个关键字的话,该怎么办呢?不用担心,在DELPHI中除了可用写入的方法为INI文件增加一个关键字之
外,TInifile类还提供了一个删除关键字的对象方法:MyInifile.DeleteKey('小节名','关键字');

5. 小节操作
增加一个小节可用写入一个关键字的方法来完成(DELPHI还未提供直接增加新小节的对象方法,其实也没多大必要的)。
删除一个小节可用下面的对象方法:
MyInifile.EraseSection('小节名');
另外TInifile类还提供了三种对象方法来对小节进行其它操作:
MyInifile. ReadSection('小节名',TStrings变量);可将指定小节中的所有关键字名读取至一个字符串列表变量中;
MyInifile.ReadSections(TStrings变量);可将INI文件中所有小节名读取至一个字符串列表变量中去。
MyInifile.ReadSectionValues('小节名',TStrings变量);可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一
个字符串列表变量中去。
MyInifile.SectionExists('小节名');是一个布尔型函数,用来判断INI文件中是否存在这样一个小节。
6. 释放
INI文件类和其它运行时创建的类一样,也需要释放,不然同样会引起内存泄露。我们可以在程序中适当的位置(比如窗体
的Destroy事件中),用下面的语句释放MyInifile:
MyInifile.Destroy;

九、一个实例
下面用一个简单的例子(如图)演示了建立、读取、存贮INI文件的方法。LoginSys.ini文件中包含有“Settings”小节,和“Use
rName”(字符串)、“IfRegisted”(布尔值)和“OpenTimes”(整型值)三个关键字。程序在窗体建立读取这些数据,并
在窗体释放时更新LoginSys.ini文件。
附源程序清单
Unit Unit1;
Interface
Uses
Windows, SysUtils, Forms, IniFiles, Classes, Controls, StdCtrls, Buttons;
Type
TForm1 = class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
chkBox1: TCheckBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Procedure FormCreate(Sender: TObject);
Procedure FormDestroy(Sender: TObject);
Procedure chkBox1Click(Sender: TObject);
Procedure BitBtn1Click(Sender: TObject);
Procedure BitBtn2Click(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Implementation
Var
MyInifile: TInifile;
{$R *.DFM}

Procedure TForm1.FormCreate (Sender: TObject);
Var
Filename: string;
Begin
//把LoginSys.ini文件存储在应用程序当前目录中
Filename:= ExtractFilePath(paramstr(0))+'LoginSys.ini';
MyInifile:= TInifile.Create(filename);
Edit1.Text:= MyInifile.readstring('Settings','UserName','党博昌');
Edit2.text:= inttostr(1+MyInifile.readinteger('Settings','OpenTimes',0));
chkBox1.Checked:= MyInifile.readbool('Settings','ifRegisted',False);
chkBox1Click(Sender);
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
MyInifile.WriteString ('Settings','UserName', Edit1.Text);
MyInifile.WriteInteger ('Settings','OpenTimes',strtoint(Edit2.text));
MyInifile.WriteBool ('Settings','ifRegisted', chkBox1.Checked);
MyInifile.Destroy;
End;

Procedure TForm1.chkBox1Click(Sender: TObject);
Begin
if ChkBox1.Checked =True then ChkBox1.Caption :='是'
else if ChkBox1.Checked =False then ChkBox1.Caption :='否';
End;

Procedure TForm1.BitBtn1Click(Sender: TObject);
Begin
//在此添加判断是否为已注册用户的语句,及其它代码';
End;
Procedure TForm1.BitBtn2Click(Sender: TObject);
Begin
Form1.DoDestroy;
End;

End.
以上的例子只是非常简单的说明了如何操作INI文件,更深一步的“发掘”工作还是留给感兴趣的读者吧!有什么问题
欢迎来信:dangbochang@263.net共同探讨,另外可以去作者的主页:http://myprogsoft.myrice.com 下载本示例的完整
代码!

(联系方法:党博昌 山东省蓬莱市广播电视局 265600
E-MAIL:dangbochang@263.net 电话:0535-5643614
录用与否,请尽早答复,多谢!)

下载:6K
 
首页 | delphi编程技巧 | 安装制作工具 | delphi辅助工具 | vcl控件 | 源码 | 编程书籍 | 软件下载 | 进入论坛
delphi 技巧网
2006年7月5日 星期三 您知道网络赚钱吗???赚钱中心,网络赚钱专业指导中心,信誉、专业、好赚,您还在等什么!!!

--------------------------------------------------------------------------------
delphi编程技巧

47、在Delphi程序中操作注册表

--------------------------------------------------------------------------------
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。

  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下,有三个字符串值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

   if OpenKey( ′Software′,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′,True) then

   WriteString(′delphi′,′C:Files.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下的数值名称的方法来进行。

  6.判断数值名称存在、数值名称改名。

  ValueExists用于判断数值名称是否存在:

  function ValueExists(const Name: string): Boolean;

  返回值为True表示数值名称存在。

  RenameValue用于数值名称改名:

  procedure RenameValue(const OldName, NewName: string);

  以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。

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

【关闭本窗口】
 
我用INI+REG.
Call: lovewjp
何不说说你用XML的用法?小弟很想学习学习...
 
帮顶.....................
 
接受答案了.
 
后退
顶部