delphi stringgrid里的数据到本地txt文件的读取和写入的代码
我现在是用list做的,但是运行过程中会提示“另一个程序在在使用此文件,进程无法访问”
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
在线等。弄好的话再奖500积分 展开
procedure SaveS(S:string);
var slst:tstringlist;
begin
slst:=tstringlist.create();
slst.Text:=s;
slst.savetofile('c:\aaa.txt');
freeandnil(slst);
end;
读:
第一种、直接用 memo 加载 txt文件
1. memo控件读取txt
memo1.Lines.LoadFromFile('E:\*\*.txt');
要读取一个txt文件的全部内容可以借用到 stringlist 来中转。
建立一个stringlist,如:
var
sList: TStringlist;
begin
sList := TStringList.Create;
try
sList.LoadFromFile('C:\a.txt');
finally
sList.Free;
end;
end;
然后可以将TStringList 转换为 string类型 str=ts.GetText ; 来转换
第二种、Delph内建的函数读写
示例代码:
var
F: Text; //TextFile 和 Text 是一样的
FileName: string = 'c:\temp\test.txt';
//写文件
procedure TForm1.Button1Click(Sender: TObject);
begin
AssignFile(F,FileName);
Rewrite(F); //会覆盖已存在的文件
Writeln(F, '第一行');
Writeln(F, '第二行');
CloseFile(F);
end;
//读文件(先执行写文件)
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
AssignFile(F,FileName);
Reset(F); //只读打开
Readln(F, s); //读取
ShowMessage(s); //显示: 第一行
Readln(F, s); //继续读取
ShowMessage(s); //显示: 第二行
CloseFile(F);
end;
//追加
procedure TForm1.Button3Click(Sender: TObject);
begin
AssignFile(F,FileName);
Append(F); //打开准备追加
Writeln(F, '第三行');
Writeln(F, '第四行');
CloseFile(F);
end;
//读取全部(需要Memo帮忙显示)
procedure TForm1.Button4Click(Sender: TObject);
var
s: string;
begin
AssignFile(F,FileName);
Reset(F); //只读打开
Memo1.Clear;
while not Eof(F) do
begin
Readln(F, s);
Memo1.Lines.Add(s);
end;
CloseFile(F);
end;
第三种、Delphi 用流来读取TXT文件
TXT文本文件是一种以ACSII吗存储数据的文件。在TXT文件中只能够存储一些字符数据,所以这种文件的移植性和通用性很强,具有较高的易用性,并且 被广泛应用,所以Delphi对该类型文件提供了较好的支持。目前在Internet上最为流行的XML文件也是一种文本文件。TXT文本文件的操作非常 简单,具体操作过程如下:
1.首先要声明一个TextFile类型的的文件指针。如:var MyFile:TEXTFile。
2.然后使用AssignFile方法将声明的文件指针与外部TXT文件相关联。AssignFile (FileName ) ;FileName 既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。
3.初始化读写有三种方式: Reset为读打开文件并把文件指针移动到文件首;Rewrite为写创建一个新文件;Append为写打开存在的文件并把文件指针定位在文件尾。
4.读取或写入文本。Readln方法能够读取一行文本,writeln方法能向文件写入一行文本。
5.最后用Closefile方法关闭已打开的文件。
以上 ,希望能对您有帮助
问题出在调用SaveGrid函数时,给定的参数filename所指定的文件读写权限本身未进行检查。造成无法写入已打开的文件。
解决方法:
以下有两种解决方法,各有优缺点
方法一:
在调用SaveGrid时,每次给出一个唯一的文件名称。这个文件名可以用当前时间作为文件名字。
这种方法运行时间长或次数多了后,会产生较多的文件。
代码如下:
var
FileName:String;
begin
FileName:=ExtractFilePath(Application.ExeName)+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');//保存路径为本Exe程序所在的目录
SaveGrid(StringGrid1,FileName);
end;
方法二:
在调用函数前判断文件是否可以读写。如果权限不够提示用户
判断的话因为要写入新文件,可以尝试是否可以删除旧文件来进行判断
代码如下
var
Filaname:String;
begin
FileName:='c:\d.txt';
if FileExists(FileName) then
begin
Try
DeleteFile(FileName);
except
Application('文件已打开,或被其它软件锁定','权限不足',mb_OK);
end;
end;
SaveGrid(StringGrid1,FileName);
end;
尝试更改filename,再重新运行看看;
代码:
procedure TForm1.Button1Click(Sender: TObject);
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
end;
begin
SaveGrid(StringGrid1,'d:\'+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');
end;
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
end;
begin
SaveGrid(StringGrid1,'d:\'+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');
end;
读取:
procedure TForm1.Button1Click(Sender: TObject);
var
aa,bb:tstringlist;
i:integer;
begin
aa:=tstringlist.Create;
bb:=tstringlist.Create;
aa.LoadFromFile('c:.txt');
for i:=0 to aa.Count-1 do
begin
bb:=SplitString(aa.Strings[i],' ');
stringgrid1.Rows[i]:=bb;
end;
aa.Free;
bb.Free;
end;
其中splitstring为:
function SplitString(const source,ch:string):tstringlist;
var
temp:string;
i:integer;
begin
result:=tstringlist.Create;
temp:=source;
i:=pos(ch,source);
while i<>0 do
begin
result.Add(copy(temp,0,i-1));
delete(temp,1,i);
i:=pos(ch,temp);
end;
result.Add(temp);
end;
// Save a TStringGrid to a file
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
i, k: Integer;
begin
AssignFile(f, FileName);
Rewrite(f);
with StringGrid do
begin
// Write number of Columns/Rows
Writeln(f, ColCount);
Writeln(f, RowCount);
// loop through cells
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
// Load a TStringGrid from a file
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
AssignFile(f, FileName);
Reset(f);
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp);
RowCount := iTmp;
// loop through cells & fill in values
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
end;
CloseFile(f);
end;
// Save StringGrid1 to 'c:\temp.txt':
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveStringGrid(StringGrid1, 'c:\temp.txt');
end;
// Load StringGrid1 from 'c:\temp.txt':
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'c:\temp.txt');
end;