1=
2=
3=
[cade]
2=
3=
4=
[bde]
1=
2=
3=
.
.
.
现有阶段我要读出所有[]内有'a'的内容,还要要读取小节内的键值。就是要把[abcd],[cade]给检索出来,怎么做?就像SQL内的like '*a*'。
主要是第一个问题。
不知道的仁兄给UP下。谢谢。
15 个解决方案
#1
uses
IniFiles;
var
IniFile: TIniFile;
Data: String;
begin
IniFile := TIniFile.Create('dan.ini');
Data := IniFile.ReadString('abcd', '1', '');
...
IniFiles;
var
IniFile: TIniFile;
Data: String;
begin
IniFile := TIniFile.Create('dan.ini');
Data := IniFile.ReadString('abcd', '1', '');
...
#2
要调用api函数来读,这样方便操作
#3
我的意思是我知道'a',要把【】内有a的给查找出来。小节内的主键是不知道的,而且,有a的内容可能很多。
#4
控制 INI 文件几法
要利用.INI 文件做程序有关数据的存储工作,就需要能读和写.INI 文件,所以列了如下方法给大家参考 :
从.INI 文件中获取字符串
var
strResult:pchar;
begin
GetPrivateProfileString(
'windows', // [] 中标题的名字
'NullPort', // = 号前的名字
'NIL', // 如果没有找到字符串时,返回的默认值
strResult, // 存放取得字符
100, // 取得字符的允许最大长度
'c:\forwin95\win.ini' // 调用的文件名
);
edit1.text:=strResult; // 显示取得字符串
从.INI 文件中获取整数
edit1.text:=inttostr(GetPrivateProfileInt(
'intl', // [] 中标题的名字
'iCountry', // = 号前的名字
0,// 如果没有找到整数时,返回的默认值
'c:\forwin95\win.ini' // 调用的文件名
));
向.INI 文件写入字符串
WritePrivateProfileString(
'windows', // [] 中标题的名字
'load', // 要写入“ = ”号前的字符串
'accca', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
向.INI 文件写入整数
WritePrivateProfileSection(
'windows', // [] 中标题的名字
'read=100', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
上面的方法是调用 API 函数,下面介绍另一种不用 API 从.INI 文件中获取字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');// 取得字符
end;
向.INI 文件中写入字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp');
end;
(转载)
要利用.INI 文件做程序有关数据的存储工作,就需要能读和写.INI 文件,所以列了如下方法给大家参考 :
从.INI 文件中获取字符串
var
strResult:pchar;
begin
GetPrivateProfileString(
'windows', // [] 中标题的名字
'NullPort', // = 号前的名字
'NIL', // 如果没有找到字符串时,返回的默认值
strResult, // 存放取得字符
100, // 取得字符的允许最大长度
'c:\forwin95\win.ini' // 调用的文件名
);
edit1.text:=strResult; // 显示取得字符串
从.INI 文件中获取整数
edit1.text:=inttostr(GetPrivateProfileInt(
'intl', // [] 中标题的名字
'iCountry', // = 号前的名字
0,// 如果没有找到整数时,返回的默认值
'c:\forwin95\win.ini' // 调用的文件名
));
向.INI 文件写入字符串
WritePrivateProfileString(
'windows', // [] 中标题的名字
'load', // 要写入“ = ”号前的字符串
'accca', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
向.INI 文件写入整数
WritePrivateProfileSection(
'windows', // [] 中标题的名字
'read=100', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
上面的方法是调用 API 函数,下面介绍另一种不用 API 从.INI 文件中获取字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');// 取得字符
end;
向.INI 文件中写入字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp');
end;
(转载)
#5
首先读出[]内的值(可能有点难度,没试过)
然后在判断[]内有'a',用if pos('a',[abcd])>0 来判断。
然后在判断[]内有'a',用if pos('a',[abcd])>0 来判断。
#6
很好解决啊,用ReadSection方法
例如:
IniFile.ReadSection('Ports',Listbox1.Items);
那么ListBox1中的数据可以令你满意
例如:
IniFile.ReadSection('Ports',Listbox1.Items);
那么ListBox1中的数据可以令你满意
#7
利用Windows API函数WritePrivateProfileString 和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。
2、Create方法
该方法用来创建一个处理INI文件的TIniFile类型实例。
方法声明:constructor Create(const FileName:string);
参数说明:FileName指明待创建的INI文件的文件名;
注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:\windows,对于Windows NT来说,则一般是c:\winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。
3、ReadSection方法
该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。
方法声明:procedure ReadSection(const Section:string; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放子键名的字符串列表;
注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。
4、ReadSections方法
该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。
方法声明:procedure ReadSections(Strings:TStrings);
参数说明:Strings参数指明存放段名的字符串列表;
注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。
5、ReadSectionValues方法
该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。
方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放段名的字符串列表;
注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。
6、EraseSection方法
该方法删除INI文件中指定的一个整段。
方法声明:procedure EraseSection(const Section:string);
参数说明:Section指明待删除段的段名;
注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。
7、DeleteKey方法
该方法删除指定段中的某个指定的子键。
方法声明:procedure DeleteKey(const Section,Key:string);
参数说明:Section指明待删除子键据段的段名;
Key指明待删除子键的键名;
注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。
8、ReadBool方法
该方法读取指定段的某个子键的布尔值。
方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;
参数说明:Section指明待读子键所在段的段名;
Key指明待读子键的键名;
Default参数指明缺省时的返回值。
注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False.
9、WriteBool方法
该方法向指定段的某个子键写入布尔值。
方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);
参数说明:Senction指明待写入子键所在段的段名;
Key参数指明待写入值的子键键名;
Value指明待写入的布尔值;
注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。
10、ReadInteger方法
该方法读取指定段的某个子键的整型值。
方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;
注释:此方法与ReadBool方法类似,只是变量类型不同。
11、WriteInteger方法
该方法向指写段的某个子键写放整型值。
方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);
注释:此方法与WriteBool方法类似,只是变量灰型不同。
12、ReadString方法
该方法读取指定段的某个子键的字符串型 值。
方法声明:function ReadString(const Section,Key:string; Default:string):string;
注释;此方法与ReadBool方法类似,只是变量类型不同。
13、WriteString方法
该方法向指写段的某个子键写入整型值。
方法声明:procedure WriteString(const Section,Key:string; Value:string);
注释:此方法与WriteBool方法类似,只是变量类型不同。
14、FileName属性
该属性指明被封装在TIniFile对象中的INI文件的文件名。
属性声明:property FileName:string;
注释:FileName属性是一个运行时的只读属性。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。
2、Create方法
该方法用来创建一个处理INI文件的TIniFile类型实例。
方法声明:constructor Create(const FileName:string);
参数说明:FileName指明待创建的INI文件的文件名;
注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:\windows,对于Windows NT来说,则一般是c:\winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。
3、ReadSection方法
该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。
方法声明:procedure ReadSection(const Section:string; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放子键名的字符串列表;
注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。
4、ReadSections方法
该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。
方法声明:procedure ReadSections(Strings:TStrings);
参数说明:Strings参数指明存放段名的字符串列表;
注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。
5、ReadSectionValues方法
该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。
方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放段名的字符串列表;
注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。
6、EraseSection方法
该方法删除INI文件中指定的一个整段。
方法声明:procedure EraseSection(const Section:string);
参数说明:Section指明待删除段的段名;
注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。
7、DeleteKey方法
该方法删除指定段中的某个指定的子键。
方法声明:procedure DeleteKey(const Section,Key:string);
参数说明:Section指明待删除子键据段的段名;
Key指明待删除子键的键名;
注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。
8、ReadBool方法
该方法读取指定段的某个子键的布尔值。
方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;
参数说明:Section指明待读子键所在段的段名;
Key指明待读子键的键名;
Default参数指明缺省时的返回值。
注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False.
9、WriteBool方法
该方法向指定段的某个子键写入布尔值。
方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);
参数说明:Senction指明待写入子键所在段的段名;
Key参数指明待写入值的子键键名;
Value指明待写入的布尔值;
注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。
10、ReadInteger方法
该方法读取指定段的某个子键的整型值。
方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;
注释:此方法与ReadBool方法类似,只是变量类型不同。
11、WriteInteger方法
该方法向指写段的某个子键写放整型值。
方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);
注释:此方法与WriteBool方法类似,只是变量灰型不同。
12、ReadString方法
该方法读取指定段的某个子键的字符串型 值。
方法声明:function ReadString(const Section,Key:string; Default:string):string;
注释;此方法与ReadBool方法类似,只是变量类型不同。
13、WriteString方法
该方法向指写段的某个子键写入整型值。
方法声明:procedure WriteString(const Section,Key:string; Value:string);
注释:此方法与WriteBool方法类似,只是变量类型不同。
14、FileName属性
该属性指明被封装在TIniFile对象中的INI文件的文件名。
属性声明:property FileName:string;
注释:FileName属性是一个运行时的只读属性。
#8
先用myinifile.readsections(TStrings变量);将INI文件中所有小节名读取至一个字符串列表变量中去,然后用strscan()函数判断符合条件的小节名,再通过小节名读取数据。
#9
同意楼上的,
#10
可能要用TSTRING读进来后再判断:
Var
FList: TStringList;
tmpStr: String;
Begin
FList:= TStringList.Create;
FList.LoadFromFile('c:123.ini');
for i:=0 to flist.count-1 do begin
if copy(flist[i],1,2)='a' then do something;具体位置你自己判断一下
end;
Var
FList: TStringList;
tmpStr: String;
Begin
FList:= TStringList.Create;
FList.LoadFromFile('c:123.ini');
for i:=0 to flist.count-1 do begin
if copy(flist[i],1,2)='a' then do something;具体位置你自己判断一下
end;
#11
楼主这样改写ini文件:加入一个小节名:
[MY_TYPE]
NAME=abcd#cade#bde
[ITEMS]
abcd=1#2#3#
cade=2#3#4#
bde=.......
[abcd]
1=
2=
3=
[cade]
2=
3=
4=
[bde]
1=
2=
3=
.
.
.
代码:
全局变量
var:
FinanceTypeName : tStringList
FinanceIniPath := GetCurrentDir;
Finance_Ini := TInifile.Create(FinanceIniPath + '/Finance.ini');
AnalyseFinanceType( Finance_Ini.ReadString(MY_TYPE','NAME','ERROR') );
procedure TMain.AnalyseFinanceType( Name : String );
var i : Integer;
TypeName : String;
begin
//从配置文件中读取业务类别列表
if FinanceTypeName <> nil then
FinanceTypeName.Free;
FinanceTypeName := TStringList.Create;
if Name = 'ERROR' then
begin
showmessage('error');
exit;
end;
TypeName := '';
for i := 1 to Length(Name) do
begin
if Name[i] <> Finance_Compart then
TypeName := TypeName + Name[i]
//za在此处加入对TypeName 的判断
{ if Pos('a',TypeName ) then
//楼主搞定吧
}
else
begin
FinanceTypeName.Add(TypeName);
TypeName := '';
end;
end;
end;
[MY_TYPE]
NAME=abcd#cade#bde
[ITEMS]
abcd=1#2#3#
cade=2#3#4#
bde=.......
[abcd]
1=
2=
3=
[cade]
2=
3=
4=
[bde]
1=
2=
3=
.
.
.
代码:
全局变量
var:
FinanceTypeName : tStringList
FinanceIniPath := GetCurrentDir;
Finance_Ini := TInifile.Create(FinanceIniPath + '/Finance.ini');
AnalyseFinanceType( Finance_Ini.ReadString(MY_TYPE','NAME','ERROR') );
procedure TMain.AnalyseFinanceType( Name : String );
var i : Integer;
TypeName : String;
begin
//从配置文件中读取业务类别列表
if FinanceTypeName <> nil then
FinanceTypeName.Free;
FinanceTypeName := TStringList.Create;
if Name = 'ERROR' then
begin
showmessage('error');
exit;
end;
TypeName := '';
for i := 1 to Length(Name) do
begin
if Name[i] <> Finance_Compart then
TypeName := TypeName + Name[i]
//za在此处加入对TypeName 的判断
{ if Pos('a',TypeName ) then
//楼主搞定吧
}
else
begin
FinanceTypeName.Add(TypeName);
TypeName := '';
end;
end;
end;
#12
楼主这个要求比较奇怪吧,如果用INI的读写函数可能解决不了问题吧
可能需要自己手工来解决这个问题,我这里有一个大概的思路,你可以试一试
但代码不一定能调的通,因为我是随手写的,未经试验。。
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
可能需要自己手工来解决这个问题,我这里有一个大概的思路,你可以试一试
但代码不一定能调的通,因为我是随手写的,未经试验。。
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
#13
按我下面的代码,楼主可以通过的了,我在自己的机器上试过的,没有问题,可以查到你需要的内容的
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
#14
程序示例如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
f : TINIFile;
begin
f := TINIFile.Create('c:\Edit.ini');
f.WriteString('TEdit', Edit1.Name, Edit1.Text);
f.WriteString('TEdit', Edit2.Name, Edit2.Text);
f.WriteString('TEdit', Edit3.Name, Edit3.Text);
f.WriteString('Edit', Edit4.Name, Edit4.Text);
f.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str1,str2:TStringList;
f:TiniFile;
begin
f := TINIFile.Create('c:\Edit.ini');
str1:=TstringList.Create;
str2:=TstringList.Create;
f.ReadSections(str1);
for i:=0 to str1.Count-1 do
if strscan(pchar(str1[i]),'a')<>nil then
str2.Add(str1[i]);
for i:=0 to str2.Count-1 do
f.readsectionvalues(str2[i],Listbox1.Items);
f.Free;
end;
end.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
f : TINIFile;
begin
f := TINIFile.Create('c:\Edit.ini');
f.WriteString('TEdit', Edit1.Name, Edit1.Text);
f.WriteString('TEdit', Edit2.Name, Edit2.Text);
f.WriteString('TEdit', Edit3.Name, Edit3.Text);
f.WriteString('Edit', Edit4.Name, Edit4.Text);
f.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str1,str2:TStringList;
f:TiniFile;
begin
f := TINIFile.Create('c:\Edit.ini');
str1:=TstringList.Create;
str2:=TstringList.Create;
f.ReadSections(str1);
for i:=0 to str1.Count-1 do
if strscan(pchar(str1[i]),'a')<>nil then
str2.Add(str1[i]);
for i:=0 to str2.Count-1 do
f.readsectionvalues(str2[i],Listbox1.Items);
f.Free;
end;
end.
#15
没那么麻烦,TINIFile.ReadSections方法结合pos函数就可以搞定。
#1
uses
IniFiles;
var
IniFile: TIniFile;
Data: String;
begin
IniFile := TIniFile.Create('dan.ini');
Data := IniFile.ReadString('abcd', '1', '');
...
IniFiles;
var
IniFile: TIniFile;
Data: String;
begin
IniFile := TIniFile.Create('dan.ini');
Data := IniFile.ReadString('abcd', '1', '');
...
#2
要调用api函数来读,这样方便操作
#3
我的意思是我知道'a',要把【】内有a的给查找出来。小节内的主键是不知道的,而且,有a的内容可能很多。
#4
控制 INI 文件几法
要利用.INI 文件做程序有关数据的存储工作,就需要能读和写.INI 文件,所以列了如下方法给大家参考 :
从.INI 文件中获取字符串
var
strResult:pchar;
begin
GetPrivateProfileString(
'windows', // [] 中标题的名字
'NullPort', // = 号前的名字
'NIL', // 如果没有找到字符串时,返回的默认值
strResult, // 存放取得字符
100, // 取得字符的允许最大长度
'c:\forwin95\win.ini' // 调用的文件名
);
edit1.text:=strResult; // 显示取得字符串
从.INI 文件中获取整数
edit1.text:=inttostr(GetPrivateProfileInt(
'intl', // [] 中标题的名字
'iCountry', // = 号前的名字
0,// 如果没有找到整数时,返回的默认值
'c:\forwin95\win.ini' // 调用的文件名
));
向.INI 文件写入字符串
WritePrivateProfileString(
'windows', // [] 中标题的名字
'load', // 要写入“ = ”号前的字符串
'accca', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
向.INI 文件写入整数
WritePrivateProfileSection(
'windows', // [] 中标题的名字
'read=100', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
上面的方法是调用 API 函数,下面介绍另一种不用 API 从.INI 文件中获取字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');// 取得字符
end;
向.INI 文件中写入字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp');
end;
(转载)
要利用.INI 文件做程序有关数据的存储工作,就需要能读和写.INI 文件,所以列了如下方法给大家参考 :
从.INI 文件中获取字符串
var
strResult:pchar;
begin
GetPrivateProfileString(
'windows', // [] 中标题的名字
'NullPort', // = 号前的名字
'NIL', // 如果没有找到字符串时,返回的默认值
strResult, // 存放取得字符
100, // 取得字符的允许最大长度
'c:\forwin95\win.ini' // 调用的文件名
);
edit1.text:=strResult; // 显示取得字符串
从.INI 文件中获取整数
edit1.text:=inttostr(GetPrivateProfileInt(
'intl', // [] 中标题的名字
'iCountry', // = 号前的名字
0,// 如果没有找到整数时,返回的默认值
'c:\forwin95\win.ini' // 调用的文件名
));
向.INI 文件写入字符串
WritePrivateProfileString(
'windows', // [] 中标题的名字
'load', // 要写入“ = ”号前的字符串
'accca', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
向.INI 文件写入整数
WritePrivateProfileSection(
'windows', // [] 中标题的名字
'read=100', // 要写入的数据
'c:\forwin95\win.ini' // 调用的文件名
);
上面的方法是调用 API 函数,下面介绍另一种不用 API 从.INI 文件中获取字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
edit1.text:=MyIni.ReadString('Desktop', 'Wallpaper', '');// 取得字符
end;
向.INI 文件中写入字符的方法
var MyIni: TIniFile;
begin
MyIni := TIniFile.Create('WIN.INI');// 调用的文件名
DelphiIni.WriteString('Desktop', 'Wallpaper', 'c:\a.bmp');
end;
(转载)
#5
首先读出[]内的值(可能有点难度,没试过)
然后在判断[]内有'a',用if pos('a',[abcd])>0 来判断。
然后在判断[]内有'a',用if pos('a',[abcd])>0 来判断。
#6
很好解决啊,用ReadSection方法
例如:
IniFile.ReadSection('Ports',Listbox1.Items);
那么ListBox1中的数据可以令你满意
例如:
IniFile.ReadSection('Ports',Listbox1.Items);
那么ListBox1中的数据可以令你满意
#7
利用Windows API函数WritePrivateProfileString 和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。
2、Create方法
该方法用来创建一个处理INI文件的TIniFile类型实例。
方法声明:constructor Create(const FileName:string);
参数说明:FileName指明待创建的INI文件的文件名;
注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:\windows,对于Windows NT来说,则一般是c:\winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。
3、ReadSection方法
该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。
方法声明:procedure ReadSection(const Section:string; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放子键名的字符串列表;
注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。
4、ReadSections方法
该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。
方法声明:procedure ReadSections(Strings:TStrings);
参数说明:Strings参数指明存放段名的字符串列表;
注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。
5、ReadSectionValues方法
该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。
方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放段名的字符串列表;
注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。
6、EraseSection方法
该方法删除INI文件中指定的一个整段。
方法声明:procedure EraseSection(const Section:string);
参数说明:Section指明待删除段的段名;
注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。
7、DeleteKey方法
该方法删除指定段中的某个指定的子键。
方法声明:procedure DeleteKey(const Section,Key:string);
参数说明:Section指明待删除子键据段的段名;
Key指明待删除子键的键名;
注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。
8、ReadBool方法
该方法读取指定段的某个子键的布尔值。
方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;
参数说明:Section指明待读子键所在段的段名;
Key指明待读子键的键名;
Default参数指明缺省时的返回值。
注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False.
9、WriteBool方法
该方法向指定段的某个子键写入布尔值。
方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);
参数说明:Senction指明待写入子键所在段的段名;
Key参数指明待写入值的子键键名;
Value指明待写入的布尔值;
注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。
10、ReadInteger方法
该方法读取指定段的某个子键的整型值。
方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;
注释:此方法与ReadBool方法类似,只是变量类型不同。
11、WriteInteger方法
该方法向指写段的某个子键写放整型值。
方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);
注释:此方法与WriteBool方法类似,只是变量灰型不同。
12、ReadString方法
该方法读取指定段的某个子键的字符串型 值。
方法声明:function ReadString(const Section,Key:string; Default:string):string;
注释;此方法与ReadBool方法类似,只是变量类型不同。
13、WriteString方法
该方法向指写段的某个子键写入整型值。
方法声明:procedure WriteString(const Section,Key:string; Value:string);
注释:此方法与WriteBool方法类似,只是变量类型不同。
14、FileName属性
该属性指明被封装在TIniFile对象中的INI文件的文件名。
属性声明:property FileName:string;
注释:FileName属性是一个运行时的只读属性。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。
2、Create方法
该方法用来创建一个处理INI文件的TIniFile类型实例。
方法声明:constructor Create(const FileName:string);
参数说明:FileName指明待创建的INI文件的文件名;
注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:\windows,对于Windows NT来说,则一般是c:\winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。
3、ReadSection方法
该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。
方法声明:procedure ReadSection(const Section:string; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放子键名的字符串列表;
注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。
4、ReadSections方法
该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。
方法声明:procedure ReadSections(Strings:TStrings);
参数说明:Strings参数指明存放段名的字符串列表;
注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。
5、ReadSectionValues方法
该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。
方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放段名的字符串列表;
注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。
6、EraseSection方法
该方法删除INI文件中指定的一个整段。
方法声明:procedure EraseSection(const Section:string);
参数说明:Section指明待删除段的段名;
注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。
7、DeleteKey方法
该方法删除指定段中的某个指定的子键。
方法声明:procedure DeleteKey(const Section,Key:string);
参数说明:Section指明待删除子键据段的段名;
Key指明待删除子键的键名;
注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。
8、ReadBool方法
该方法读取指定段的某个子键的布尔值。
方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;
参数说明:Section指明待读子键所在段的段名;
Key指明待读子键的键名;
Default参数指明缺省时的返回值。
注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False.
9、WriteBool方法
该方法向指定段的某个子键写入布尔值。
方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);
参数说明:Senction指明待写入子键所在段的段名;
Key参数指明待写入值的子键键名;
Value指明待写入的布尔值;
注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。
10、ReadInteger方法
该方法读取指定段的某个子键的整型值。
方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;
注释:此方法与ReadBool方法类似,只是变量类型不同。
11、WriteInteger方法
该方法向指写段的某个子键写放整型值。
方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);
注释:此方法与WriteBool方法类似,只是变量灰型不同。
12、ReadString方法
该方法读取指定段的某个子键的字符串型 值。
方法声明:function ReadString(const Section,Key:string; Default:string):string;
注释;此方法与ReadBool方法类似,只是变量类型不同。
13、WriteString方法
该方法向指写段的某个子键写入整型值。
方法声明:procedure WriteString(const Section,Key:string; Value:string);
注释:此方法与WriteBool方法类似,只是变量类型不同。
14、FileName属性
该属性指明被封装在TIniFile对象中的INI文件的文件名。
属性声明:property FileName:string;
注释:FileName属性是一个运行时的只读属性。
#8
先用myinifile.readsections(TStrings变量);将INI文件中所有小节名读取至一个字符串列表变量中去,然后用strscan()函数判断符合条件的小节名,再通过小节名读取数据。
#9
同意楼上的,
#10
可能要用TSTRING读进来后再判断:
Var
FList: TStringList;
tmpStr: String;
Begin
FList:= TStringList.Create;
FList.LoadFromFile('c:123.ini');
for i:=0 to flist.count-1 do begin
if copy(flist[i],1,2)='a' then do something;具体位置你自己判断一下
end;
Var
FList: TStringList;
tmpStr: String;
Begin
FList:= TStringList.Create;
FList.LoadFromFile('c:123.ini');
for i:=0 to flist.count-1 do begin
if copy(flist[i],1,2)='a' then do something;具体位置你自己判断一下
end;
#11
楼主这样改写ini文件:加入一个小节名:
[MY_TYPE]
NAME=abcd#cade#bde
[ITEMS]
abcd=1#2#3#
cade=2#3#4#
bde=.......
[abcd]
1=
2=
3=
[cade]
2=
3=
4=
[bde]
1=
2=
3=
.
.
.
代码:
全局变量
var:
FinanceTypeName : tStringList
FinanceIniPath := GetCurrentDir;
Finance_Ini := TInifile.Create(FinanceIniPath + '/Finance.ini');
AnalyseFinanceType( Finance_Ini.ReadString(MY_TYPE','NAME','ERROR') );
procedure TMain.AnalyseFinanceType( Name : String );
var i : Integer;
TypeName : String;
begin
//从配置文件中读取业务类别列表
if FinanceTypeName <> nil then
FinanceTypeName.Free;
FinanceTypeName := TStringList.Create;
if Name = 'ERROR' then
begin
showmessage('error');
exit;
end;
TypeName := '';
for i := 1 to Length(Name) do
begin
if Name[i] <> Finance_Compart then
TypeName := TypeName + Name[i]
//za在此处加入对TypeName 的判断
{ if Pos('a',TypeName ) then
//楼主搞定吧
}
else
begin
FinanceTypeName.Add(TypeName);
TypeName := '';
end;
end;
end;
[MY_TYPE]
NAME=abcd#cade#bde
[ITEMS]
abcd=1#2#3#
cade=2#3#4#
bde=.......
[abcd]
1=
2=
3=
[cade]
2=
3=
4=
[bde]
1=
2=
3=
.
.
.
代码:
全局变量
var:
FinanceTypeName : tStringList
FinanceIniPath := GetCurrentDir;
Finance_Ini := TInifile.Create(FinanceIniPath + '/Finance.ini');
AnalyseFinanceType( Finance_Ini.ReadString(MY_TYPE','NAME','ERROR') );
procedure TMain.AnalyseFinanceType( Name : String );
var i : Integer;
TypeName : String;
begin
//从配置文件中读取业务类别列表
if FinanceTypeName <> nil then
FinanceTypeName.Free;
FinanceTypeName := TStringList.Create;
if Name = 'ERROR' then
begin
showmessage('error');
exit;
end;
TypeName := '';
for i := 1 to Length(Name) do
begin
if Name[i] <> Finance_Compart then
TypeName := TypeName + Name[i]
//za在此处加入对TypeName 的判断
{ if Pos('a',TypeName ) then
//楼主搞定吧
}
else
begin
FinanceTypeName.Add(TypeName);
TypeName := '';
end;
end;
end;
#12
楼主这个要求比较奇怪吧,如果用INI的读写函数可能解决不了问题吧
可能需要自己手工来解决这个问题,我这里有一个大概的思路,你可以试一试
但代码不一定能调的通,因为我是随手写的,未经试验。。
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
可能需要自己手工来解决这个问题,我这里有一个大概的思路,你可以试一试
但代码不一定能调的通,因为我是随手写的,未经试验。。
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
#13
按我下面的代码,楼主可以通过的了,我在自己的机器上试过的,没有问题,可以查到你需要的内容的
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
Function GetChapterStr(var Rtn_List:TStringList;strFileName,strFind:String):Boolean;
var
MainList : TStringList;
i : integer;
tmpStr : String;
begin
if strFind = '' then
begin
Result := False;
exit;
end;
MainList := TStringList.Create;
MainList.LoadFromFile(strFileName);
for i := 0 to MainList.Count - 1 do
begin
tmpStr := MainList.Strings[i];
if (Pos('[',tmpStr) <> 0) and (Pos(']',tmpStr) <> 0) and (Pos(strFind,tmpStr)<> 0 ) then
Rtn_List.Add(tmpStr);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strList : TStringList;
i : integer;
begin
strList := TStringList.Create;
if GetChapterStr(strList,'E:\project\Delphi\CrmSource\db.ini','D') then
begin
for i:= 0 to StrLIst.Count - 1 do
begin
showmessage(strList.Strings[i]);
end;
end;
end;
#14
程序示例如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
f : TINIFile;
begin
f := TINIFile.Create('c:\Edit.ini');
f.WriteString('TEdit', Edit1.Name, Edit1.Text);
f.WriteString('TEdit', Edit2.Name, Edit2.Text);
f.WriteString('TEdit', Edit3.Name, Edit3.Text);
f.WriteString('Edit', Edit4.Name, Edit4.Text);
f.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str1,str2:TStringList;
f:TiniFile;
begin
f := TINIFile.Create('c:\Edit.ini');
str1:=TstringList.Create;
str2:=TstringList.Create;
f.ReadSections(str1);
for i:=0 to str1.Count-1 do
if strscan(pchar(str1[i]),'a')<>nil then
str2.Add(str1[i]);
for i:=0 to str2.Count-1 do
f.readsectionvalues(str2[i],Listbox1.Items);
f.Free;
end;
end.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
f : TINIFile;
begin
f := TINIFile.Create('c:\Edit.ini');
f.WriteString('TEdit', Edit1.Name, Edit1.Text);
f.WriteString('TEdit', Edit2.Name, Edit2.Text);
f.WriteString('TEdit', Edit3.Name, Edit3.Text);
f.WriteString('Edit', Edit4.Name, Edit4.Text);
f.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str1,str2:TStringList;
f:TiniFile;
begin
f := TINIFile.Create('c:\Edit.ini');
str1:=TstringList.Create;
str2:=TstringList.Create;
f.ReadSections(str1);
for i:=0 to str1.Count-1 do
if strscan(pchar(str1[i]),'a')<>nil then
str2.Add(str1[i]);
for i:=0 to str2.Count-1 do
f.readsectionvalues(str2[i],Listbox1.Items);
f.Free;
end;
end.
#15
没那么麻烦,TINIFile.ReadSections方法结合pos函数就可以搞定。