2016-07-17 45 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. 
相關問題