TMemoの内容を高速に置き換えるには?

解決


さいとうゆきひろ  2004-05-10 11:42:18  No: 8848

はじめまして。過去ログを検索しても見つからなかった(はず…)ので質問させていただきます。
TTabControlを利用して、簡単なタブ型のテキストエディタを作ろうとしています。
ひとつのTMemoをタブで切り替えていますので以下のようなコードが必要になりました。

var
  MyString: TStringList;
  Fname: String;
begin
  if OpenDialog1.Execute then begin
    Fname := OpenDialog1.FileName;
    MyString := TStringList.Create;
    MyString.LoadFromFile(Fname);
    TabControl1.Tabs.AddObject(ExtractFileName(Fname), MyString);
    Memo1.Lines.Assign(MyString);
    TabCOntrol1.TabIndex := TabControl1.Tabs.Count - 1;
  end;
end;

この場合、3000行ほどのテキストを表示するのにかなりの時間がかかってしまいます。
Memo1.Lines.Assign(MyString)の部分が遅いとわかりましたので、参照のコピー?の場合は早いだろうと思い
Memo1.Lines := MyStr
に書き換えても変わりませんでした。
もちろんTab切り替え時もかなりの時間がかかってしまいます。

素直にTMemoを複数持つようにしたほうがよいのでしょうか。
よろしくお願いいたします。


jok  2004-05-10 12:28:25  No: 8849

> 素直にTMemoを複数持つようにしたほうがよいのでしょうか。

これに賛成。TPageControl + TMemo x ページ数 でもよいと思います。


にしの  2004-05-10 18:12:34  No: 8850

Linesプロパティへの代入は、やはりAssignを使用していますから同じです。
ちなみに、TMemo.Linesは、TStringListクラスではありません。
TStringsクラスではありますが、TMemo用のサブクラスです。


るるとん@K  2004-05-11 03:24:30  No: 8851

どこかに複数のTRichEditをTPageControlできりかえるサンプルがあったような気がするんですが見失ってしまいましたw
TTabSheetにTMemoやファイル名を保存するフィールドなどをのせたコンポを作っておいて、それを生成するようにすればいいと思います


るるとん@K  2004-05-11 03:31:04  No: 8852

タブシートの切替サンプル
http://hp.vector.co.jp/authors/VA009712/take/delphi/ture1998.htmの11月21日
内容の置換はあまり推奨できません


さいとうゆきひろ  2004-05-11 04:32:31  No: 8853

返事が遅れてしまい、申し訳ありません。

jokさん
そうですよね、素直にそうすれば悩むこともなかったのですが。某MLの過去ログで
普通はTMemoを切り替えて・・・と書いてあったのがどうしても忘れられなかったん
ですよ。もしかしたらポインタを参照させるような、画期的な方法があるのではな
いかと思ってしまいました。

にしのさん
詳しい説明ありがとうございます。
再度質問で申し訳ないのですが、TStringは抽象クラスですよね?TMemoのサブクラ
スだとしてもTMemoがインスタンス化される時にTStringもインスタンス化されるは
ずですよね?このあたりがまだよくわからないんです。

るるとんさん
まさに、それ!って感じです。これから見てみたいと思います。ありがとうござい
ます。

昨日どうしてもこの件を解決させたくて、住んでいる県の県庁所在地の大きな本屋
を回ったのですが、Delphi関連の本は4冊のみ…。
ほんとみなさんには感謝です!ありがとうございました。


にしの  2004-05-11 18:31:05  No: 8854

> 再度質問で申し訳ないのですが、TStringは抽象クラスですよね?TMemoのサブクラ
> スだとしてもTMemoがインスタンス化される時にTStringもインスタンス化されるは
> ずですよね?このあたりがまだよくわからないんです。

抽象クラスには、定義はあるが、実装していない機能があることはわかりますよね。
実装していないものをインスタンス化はできません。

たとえば、次のようなコードは正しく動きます。
# 一部抜粋です
var
  sl: TStrings;
begin
  sl := TStringList.Create;
  sl.Add('TEST');
  ShowMessage(sl.Text);
  sl.Free;
end;

slは、TStringsクラスの変数ですが、中身はTStringListです。
これは、TStringListがTStringsの派生クラスだから代入できるのです。
同じように、TMemo(TCustomMemo)では、

FLines := TMemoStrings.Create;

としています。
Linesプロパティの実態は、TMemoStringsクラスのインスタンスです。TStringsの未実装機能を、TMemoStringsが実装しています。こちらが呼ばれるわけです。


さいとうゆきひろ  2004-05-12 10:31:59  No: 8855

にしのさま

恥ずかしながら間違いに気づきました。TMemoのサブクラスというのを継承されたクラスではなく、TMemo内に持っているクラスと勘違いしていました。
結局TStringクラスをプロパティに持っているのは、TStringクラスから派生されたクラスでも扱えるようになのですね。
混乱していましたが、回答を読んでいろいろ気づくところがありました。

わかりやすい回答をありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加