2011-07-29 58 views
0

代码的第一部分工作正常,而第二部分(注释)没有。 它会覆盖我的A1文件,尽管它应该写入A2。如何加载和保存StringGrid内容?

procedure TForm1.AdvGlowButton12Click(Sender: TObject); 
var 
    i,j: Integer; 
    Seznam: TStrings; 
    ApplicationPath: string; 
begin 
    if (cxRadiogroup3.ItemIndex and cxRadiogroup2.ItemIndex) = 0 then begin 
    ApplicationPath:= ExtractFileDir(Application.ExeName); 
    Seznam:= TStringList.Create; 
    try 
     for i:=0 to advStringGrid2.ColCount-1 do 
     Seznam.AddStrings(advStringGrid2.Cols [i]); 
     for i:=0 to advStringGrid2.rowCount-1 do 
     Seznam.AddStrings(advStringGrid2.rows [j]); 
     Seznam.SaveToFile(ApplicationPath+'\A1.txt'); 
    finally 
     seznam.free; 
    end; 
    end ; 
    //if cxRadiogroup3.ItemIndex = 1 and cxRadiogroup2.ItemIndex = 0 then begin 
    // ApplicationPath:= ExtractFileDir(Application.ExeName); 
    // Seznam:= TStringList.Create; 
    // try 
    // for i:=0 to advStringGrid2.ColCount-1 do 
    //  Seznam.AddStrings(advStringGrid2.Cols [i]); 
    // for i:=0 to advStringGrid2.rowCount-1 do 
    //  Seznam.AddStrings(advStringGrid2.rows [j]); 
    // Seznam.SaveToFile(ApplicationPath+'\A2.txt'); 
    // finally 
    // seznam.free; 
    // end ; 
    //end 
end; 

我在做什么错? 当我尝试从空文本文件加载到内容时,为什么stringgrid给listindex超出界限?如果我将空字符串保存到该文件中,稍后,虽然文件中没有任何内容,但它不会抱怨?奇怪...

这是我如何加载到字符串网格A1和A2。

procedure TForm1.cxRadioGroup2Click(Sender: TObject); 
Var 
    I,j,k: Integer; 
    Seznam: TStrings; 
    ApplicationPath: string; 
begin 
    case cxradioGroup2.ItemIndex of 
    0: begin 
     if cxradioGroup3.ItemIndex = 0 then begin 
      Seznam:= TStringList.Create; 
      AdvStringgrid2.ClearAll; 
      try 
      Seznam.LoadFromFile('A1.txt'); 
      k:= 0; 
      for i:=0 to advStringGrid2.ColCount-1 do 
       for j:=0 to advStringGrid2.RowCount-1 do begin 
       advstringGrid2.Cells [i,j]:= Seznam.Strings [k]; 
       Inc(k); 
       end; 
      finally 
      seznam.free; 
      end; 
     end; 
     if cxradioGroup3.ItemIndex = 1 then begin 
      Seznam:= TStringList.Create; 
      AdvStringgrid2.ClearAll; 
      try 
      Seznam.LoadFromFile('A2.txt'); 
      k:=0; 
      for i:=0 to advStringGrid2.ColCount-1 do 
       for j:=0 to advStringGrid2.RowCount-1 do begin 
       advstringGrid2.Cells [i,j]:= Seznam.Strings [k]; 
       Inc(k); 
       end; 
      finally 
      seznam.free; 
      end; 
     end; 
     end; 
    end; 
end; 
+0

你需要证明你的加载代码之前,有人能告诉你为什么它报告索引错误。 –

+0

代码已被更新以上... – user763539

+0

ClearAll()删除行,或只是将它们设置为空字符串?如果它删除行,则需要将ColCount和RowCount存储到文件中,以便在加载单元数据之前恢复原始值。无论如何,这可能不是一个坏主意。 –

回答

0

这里是SwissDelphiCenter老TIPP,可以帮助你

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

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

我试图理解你的代码,并试图为他好,因为它可以让我重写。 (它未测试)

procedure TForm1.AdvGlowButton12Click(Sender: TObject); 
var 
    i, j: Integer; 
    Seznam: TStrings; 
    ApplicationPath: string; 
    fileName: string; 
    line: string; 
begin 
    if (cxRadiogroup2.ItemIndex = 0) then begin 
    if (cxRadiogroup3.ItemIndex = 0) then 
     fileName:= 'A1.txt' 
    else 
     fileName:= 'A2.txt' 

    ApplicationPath:= ExtractFileDir(Application.ExeName); 
    Seznam:= TStringList.Create; 
    try 
     for k:=0 to advStringGrid2.RowCount-1 do begin 
     line:= ''; 
     for i:=0 to advStringGrid2.ColCount-1 do 
      line = line + '|' + advStringGrid2.Cells[i, k]; 
     Seznam.AddStrings(line); 
     end; 
     Seznam.SaveToFile(ApplicationPath + '\' + fileName); 
    finally 
     seznam.Free; 
    end; 
    end; 
end; 

procedure TForm1.cxRadioGroup2Click(Sender: TObject); 
var 
    splitList: TStringList; 
    i, j: Integer; 
    Seznam: TStrings; 
    ApplicationPath: string; 
    fileName: string; 
    line: string; 
    sepIndex: integer; 
begin 
    if (cxRadiogroup2.ItemIndex = 0) then begin 
    if (cxRadiogroup3.ItemIndex = 0) then 
     fileName:= 'A1.txt' 
    else 
     fileName:= 'A2.txt' 

    AdvStringgrid2.ClearAll; // don't know what this does 

    ApplicationPath:= ExtractFileDir(Application.ExeName); 
    Seznam:= TStringList.Create; 
    try 
     Seznam.LoadFromFile(fileName); 
     advstringGrid2.RowCount:= Seznam.Count; 
     splitList:= TStringList.Create; 
     for i:=0 to Seznam.Count-1 do begin 
     line:= Seznam.Strings [i]; 
     Split('|', line, splitList); 
     advStringGrid2.ColCount:= Max(advStringGrid2.ColCount, splitList.Count); 
     for k:=0 to splitList.Count-1 do 
      advStringGrid2.Cells[i, k]:= splitList[k]; 
     end; 
    finally 
     splitList.Free; 
     seznam.Free; 
    end; 
    end; 
end; 

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings); 
begin 
    Assert(Assigned(Strings)); 
    Strings.Clear; 
    Strings.Delimiter:= Delimiter; 
    Strings.DelimitedText:= Input; 
end; 

希望帮助

+0

在我看来,引用SwissDelphiCenter的包装函数只是对实际问题“如何加载和保存StringGrid内容?”的一个可能的答案,如摘录中所述。尽管如此,恐怕似乎还有其他“隐藏”的问题。 – menjaraz

0

你怎么知道它覆盖了A1.txt?在这两种情况下,您都可以保存完全相同的内容。

+0

你是什么意思的“你在两种情况下保存完全相同的内容”?我认为这是发生的,但不知道什么是错的...... – user763539

+0

我加载新的数据之前清除网格的内容。似乎数据似乎仍然存在并越来越被覆盖...文件有不同的内容.. – user763539

+1

您显示,评论和所有的代码是将具有完全相同的列和行的完全相同的网格保存为两个单独的文件名。所以即使代码第二次覆盖了A1.txt,你会怎么知道?新数据将与旧数据相同。我建议你从http://www.sysinternals.com抓取文件监视器并观察真正发生的事情。 –