2011-02-01 8 views
1

テキストを読み込もうとしたTMemoがありますが、「テキストがメモ容量を超えています」というエラーが表示されます。コードは次のとおりです:Memo1.Lines.LoadFromFile(s) Delphi 7/Win 7でのTMemoの制限はいくらですか?私は64KBの制限があることを知っていましたが、Win95/98の下にありました。「テキストがメモ容量を超えています」エラー

注:このエラーは、ユーザーが送信したスクリーンショットです。大きなファイル(5〜10 MB)を正常に読み込むことができます。


アップデート:私はこのラインで新しいバグレポートにこの時間を持っ

procedure TCLog.Add (s: string; Cl: TColor); 
begin 
    SelStart:= Length(Text); 
    SelAttributes.Color:= Cl;            

    S:= GenerateString(Indent, ' ')+ S; 
    TRY 
    Lines.Add(s);      <------------------------ HERE 
    EXCEPT  
    on E: Exception DO 
    begin 
     MesajError('Cannot store string '+ s); 
     raise; // re-raise the currently caught exception 
    end; 
    END; 
    if AutoScroll 
    then LogScroll; 
end; 
+4

*あなたは10 MBのファイルを読み込むことができますが、ロードしようとしている*顧客のファイルの大きさはどれくらいですか? –

+2

あなたのスクリーンショットがありません。 –

+1

これはあなたの問題に関連しているかどうかわかりませんが、http://www.zuggsoft.com/forums/viewtopic.phpをチェックしてください。t = 34572 –

答えて

0

I 50万文字の文字列でTMemoオブジェクトをテストして、それが働いた:

procedure TForm5.Button1Click(Sender: TObject); 
VAR s: string; 
begin 
s:= GenerateString(1000000, 'x'); 
Memo1.Text:= s; 
end; 

それはしかし20秒かかります。

後で私はTEditをTRichEditに置き換えました。私はさらに問題がありました。結局のところ、犯人は#0文字を含む文字列であることに気付きました。この文字に遭遇すると、TRichEditのねじのように見えます。

2

例外が反応して、 'stdctrls.pas' にTMemoStrings.SetTextStr手順で上げていますメモに送信されたメッセージWM_SETTEXTに失敗しました。 VCLは 'SendMessage'の戻り値を調べ、 '0'の場合は例外をスローします。実際の失敗の理由を示す方法は実際にはありません。ドキュメントから見ることができるように、リストボックスやコンボボックスには特別なエラーコードしかありません。

ユーザーがエラーを一貫して再現できる場合は、 'SetLastError'/'GetLastError'呼び出しの間に 'LoadFromFile'をラップする特別なビルドを送信することを検討してください。


編集:私はメモにテキストを設定する実用上の限界を押した場合(理論限界Jeroen's answerに言及はなく)GetLastError言うだろうかと思っ

var 
    s: array [0.. 1073741823] of Char; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    i: Integer; 
begin 
    FillChar(s[0], Length(s) - 1, Ord('a')); 

    // without line breaks 'SendMessage' takes forever to return 
    for i := 1 to Length(s) - 1 do 
    if i mod 50 = 0 then begin 
     s[i - 1] := #13; 
     s[i] := #10; 
    end; 

    s[Length(s) - 1] := #0; 

    SetLastError(0); 
    try 
    if SendMessage(Memo1.Handle, WM_SETTEXT, 0, Longint(@s[0])) = 0 then 
     raise Exception.Create('set text fail'); 
    except 
    ShowMessage(SysErrorMessage(GetLastError)); 
    end; 
end; 


制限は、特定の条件に応じて変化するであろうが、ここでは、上記のポップス「ではない十分な記憶域がこのコマンドを処理することが可能です」。 (その半分(0.5GB)でテキストの設定に問題はありません)

+0

'GetLastError'の' wm_SetText'に対する動作は、*文書化されていない*であることに注意してください。 –

2

TMemoはWindowsの「Edit Control」を包むラッパーです。 this questionへの回答は、あなたがそれに保存できる最大長さを見つける方法とその長さに影響する方法を説明しています。

--jeroen

1

私はあなただけTMemoオブジェクトを取り出し、その代わりにリッチエディット、またはSynEditなどのエディタを置く提案する可能性がある場合。

次に、TMemoがラッピングしているMS Common Controlが、クライアントのサイトでこのランダムで迷惑な方法で失敗するのはなぜか分かりません。

+0

+1ウォーレン。スマートな考え。 – Ampere

+0

私はSysEditが私に「ベータよりも小さい」と聞こえる「プレビュー」だと思っています。あなたはそれを使いましたか?それは安定していますか? – Ampere

関連する問題