delphi stringgrid里的数据到本地txt文件的读取和写入的代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi stringgrid里的数据到本地txt文件的读取和写入的代码相关的知识,希望对你有一定的参考价值。

帮我写一下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方法关闭已打开的文件。

以上 ,希望能对您有帮助
参考技术A 首先说代码本身没有问题。
问题出在调用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;
参考技术B 提示“另一个程序在在使用此文件,进程无法访问”,表示你多次执行文件还在占用或者文件已经被打开;

尝试更改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;本回答被提问者和网友采纳
参考技术C 写入: 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 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;
参考技术D

// 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;

以上是关于delphi stringgrid里的数据到本地txt文件的读取和写入的代码的主要内容,如果未能解决你的问题,请参考以下文章

急需解决delphi 重stringgrid的定位方法 !!!!!!!!

delphi 更改stringgrid单元格所在行的字体颜色

Delphi中StringGrid控件如何添加数据?

delphi中STRINGGRID的用法

delphi中stringgrid如何动态增加一行。如何删除一行。

delphi stringGrid