2019年11月25日

2019-11-25 Delphi のメモコンポーネント(TMemo)の高速表示

2019-11-25 Delphi のメモコンポーネント(TMemo)の高速表示

Delphi XE2 で開発を行っていますがテキストを表示する「TMemo」のコンポーネントがあります。

テキストを設定するには以下の1,2,3の方法があります。行数が多い場合は、ファイルから直接読み込んで表示がする方法が、追加して表示するより圧倒的に早い、という結果になります。

単純に読み込んで表示する場合は、ファイルから直接読み込んで下さい。

ただ、ファイルから読み込んで処理を行った結果を反映させる場合には、処理を行った結果のファイルリストを作成して、このファイルリストをストリームに保存してか、このストリームを一括して読み込むと、ファイルから直接読み込んだのと同じ効果が得られます。

1:文字列を追加して表示(遅い)

StrList1.LoadFromFile('C:\test\123.txt');
Memo1.Lines.BeginUpdate;
for iRow1 := to StrList1.Count-1 do
begin
Memo1.Lines.Add(StrList1.Strings[iRow1]);
end;
Memo1.Lines.EndUpdate;

2:ファイルから直接読み込んで表示(早い)

Memo1.Lines.LoadFromFile('C:\test\123.txt');

3:ストリームから読み込んで表示(処理を行った後にストリームから読み込みで早い)
ただし、絵文字を含んだ場合は、絵文字が正常に表示されません。

var
StrStream1: TMemoryStream;
StrList1: TStringList;
StrList2: TStringList;
begin
StrList1 := TStringList.Create;;
StrList2 := TStringList.Create;;

StrList1.LoadFromFile('C:\test\123.txt');
for iRow1 := 0 to trList1.Count-1 do
begin
StrList2.Lines.Add(...StrList1.Strings[iRow1]を処理した結果... );
end;

StrStream1 := TStringStream.Create(StrList2.Text);
Memo1.Lines.LoadFromStream(StrStream1);
StrStream1.Free;

StrList1.Free;
StrList2.Free;
end;


4:Delphi XE2 のファイル読み込み
文字コードを指定して、ファイルから直接読み込みます。絵文字の表示は可能です。

procedure TFormMain.LoadFile(Sender: TObject);
var
Enc1: TEncoding;
begin
//SJIS
if IntReadEncode1 = ENCODE_SJIS then
begin
Enc1 := TEncoding.GetEncoding(932);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//JIS
else if IntReadEncode1 = ENCODE_JIS then
begin
Enc1 := TEncoding.GetEncoding(50220);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//EUC
else if IntReadEncode1 = ENCODE_EUCJP then
begin
Enc1 := TEncoding.GetEncoding(20932);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//UTF7
else if IntReadEncode1 = ENCODE_UTF7 then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.UTF7);
end
//UTF8 BOM
else if IntReadEncode1 = ENCODE_UTF8_BOM_ON then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF8
else if IntReadEncode1 = ENCODE_UTF8_BOM_OFF then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.UTF8);
end
//UTF16 BOM BE
else if IntReadEncode1 = ENCODE_UTF16_BOM_ON_BE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF16 BE
else if IntReadEncode1 = ENCODE_UTF16_BOM_OFF_BE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.BigEndianUnicode);
end
//UTF16 BOM LE
else if IntReadEncode1 = ENCODE_UTF16_BOM_ON_LE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF16 LE
else if IntReadEncode1 = ENCODE_UTF16_BOM_OFF_LE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.Unicode);
end
//ここはない
else
begin
end;
end;

posted by bonworld at 09:38| Comment(0) | TrackBack(0) | Delphi
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/186848960
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック