2016-07-17 43 views
0

我有一个文本文件和10个StringLists,我想打开10个StringLists中的txt文件,例如文本文件有1000行,我想要StringList1中的第100行在StringLists2第二100等等,我的想法是让文本文件中的行数和除以10,然后它在10个StringLists如何将StringList中的字符串复制到多个Memos中

var 
i, x :integer; 
U : TStrings; 
DatFile ,ExePath:string; 

begin 
U := TStringList.Create; 
ExePath := ExtractFilePath(Application.ExeName); 
DatFile := ExePath + 'Test.txt'; 
U.LoadFromFile(DatFile); 
x := U.Count Div 10; 
Edit1.Text := IntToStr(x); 
/// Stoped here 
end; 

复制每个100如何继续呢?

回答

1

可以使用一个数组来保存备忘录指针,然后通过文件的行循环,计算该数组索引添加的每个线到,例如:

var 
    i, LinesPerMemo, LinesAdded: integer; 
    U : TStrings; 
    DatFile: string; 
    Memos: array[0..9] of TMemo; 
    CurMemo: TMemo; 
begin 
    Memos[0] := Memo1; 
    Memos[1] := Memo2; 
    Memos[2] := Memo3; 
    Memos[3] := Memo4; 
    Memos[4] := Memo5; 
    Memos[5] := Memo6; 
    Memos[6] := Memo7; 
    Memos[7] := Memo8; 
    Memos[8] := Memo9; 
    Memos[9] := Memo10; 

    DatFile := ExtractFilePath(Application.ExeName) + 'Test.txt'; 

    U := TStringList.Create; 
    try 
    U.LoadFromFile(DatFile); 

    LinesPerMemo := U.Count div 10; 
    if (U.Count mod 10) <> 0 then 
     Inc(LinesPerMemo); 

    Edit1.Text := IntToStr(LinesPerMemo); 

    J := 0; 
    CurMemo := Memos[J]; 

    try 
     LinesAdded := 0; 
     for I := 0 to U.Count-1 do 
     begin 
     CurMemo.Lines.Add(U[I]); 
     Inc(LinesAdded); 
     if (LinesAdded = LinesPerMemo) and (J < 9) then 
     begin 
      CurMemo.Lines.EndUpdate; 
      Inc(J); 
      CurMemo := Memos[J]; 
      CurMemo.Lines.BeginUpdate; 
      LinesAdded := 0; 
     end; 
     finally 
     CurMemo.Lines.EndUpdate; 
     end; 
    end; 
    finally 
    U.Free; 
    end; 
end; 

或者,使用一个临时TStringList以收集每个备注的行数:

var 
    i, LinesPerMemo: integer; 
    U, Lines : TStrings; 
    DatFile: string; 
    Memos: array[0..9] of TMemo; 
begin 
    Memos[0] := Memo1; 
    Memos[1] := Memo2; 
    Memos[2] := Memo3; 
    Memos[3] := Memo4; 
    Memos[4] := Memo5; 
    Memos[5] := Memo6; 
    Memos[6] := Memo7; 
    Memos[7] := Memo8; 
    Memos[8] := Memo9; 
    Memos[9] := Memo10; 

    DatFile := ExtractFilePath(Application.ExeName) + 'Test.txt'; 

    U := TStringList.Create; 
    try 
    U.LoadFromFile(DatFile); 

    LinesPerMemo := U.Count div 10; 
    if (U.Count mod 10) <> 0 then 
     Inc(LinesPerMemo); 

    Edit1.Text := IntToStr(LinesPerMemo); 

    Lines := TStringList.Create; 
    try 
     J := 0; 
     for I := 0 to U.Count-1 do 
     begin 
     Lines.Add(U[I]); 
     if (Lines.Count = LinesPerMemo) and (J < 9) then 
     begin 
      Memos[J].Lines.Assign(Lines); 
      Inc(J); 
      Lines.Clear; 
     end; 
     end; 
     Memos[J].Lines.Assign(Lines); 
    finally 
     Lines.Free; 
    end; 
    finally 
    U.Free; 
    end; 
end; 
+0

它的作品,但它的速度很慢,我尝试使用StringLists,但我得到的AV,你可以请调整代码StringLists工作,非常感谢Mr.Remy勒博 – Thunderx

+0

你有没有'Create'的StringList的对象之前试图填补他们? –

+0

它的工作,谢谢你的注意事项 – Thunderx

0

要加快速度,可以使用Texfile和Tstringstream创建Tmemo(如果需要)。

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    ScrollBox1: TScrollBox; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Déclarations privées } 
    function getNewMemo(const aStream : Tstream) : TMemo; 
    public 
    { Déclarations publiques } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
const nblines : Integer = 100; 
var F : TextFile; 
    sLine, sfile : string; 
    cpt : Integer; 
    Memo : TMemo; 
    tmp : TStringStream; 
begin 
    sfile := 'C:\TEMP\Test.txt'; 

    tmp := TStringStream.Create; 
    AssignFile(F, sFile); 
    Reset(F); 
    try 
    LockWindowUpdate(ScrollBox1.Handle); 
    cpt := 0; 
    while not Eof(F) do begin 
     Readln(F, sLine); 
     Inc(cpt); 

     tmp.WriteString(sLine + #13); 
     if (cpt mod nbLines = 0) then begin 
     Memo := getNewMemo(tmp); 
     tmp.Clear; 
     end; 
    end; 

    if tmp.Size > 0 then begin 
     Memo := getNewMemo(tmp); 
     tmp.Clear; 
    end; 
    finally 
    CloseFile(F); 
    tmp.Free; 
    LockWindowUpdate(0); 
    end; 
end; 

function TForm1.getNewMemo(const aStream : Tstream): TMemo; 
begin 
    Result := TMemo.Create(ScrollBox1); 
    Result.Parent := ScrollBox1; 
    Result.Top := High(integer); 
    Result.Align := alTop; 
    Result.Height := 150; 
    Result.ScrollBars := ssBoth; 
    if aStream <> nil then begin 
    aStream.Seek(0, soFromBeginning); 
    Result.Lines.LoadFromStream(aStream); 
    end; 
end; 

end. 
相关问题