はじめまして。過去ログを検索しても見つからなかった(はず…)ので質問させていただきます。
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を複数持つようにしたほうがよいのでしょうか。
よろしくお願いいたします。
> 素直にTMemoを複数持つようにしたほうがよいのでしょうか。
これに賛成。TPageControl + TMemo x ページ数 でもよいと思います。
Linesプロパティへの代入は、やはりAssignを使用していますから同じです。
ちなみに、TMemo.Linesは、TStringListクラスではありません。
TStringsクラスではありますが、TMemo用のサブクラスです。
どこかに複数のTRichEditをTPageControlできりかえるサンプルがあったような気がするんですが見失ってしまいましたw
TTabSheetにTMemoやファイル名を保存するフィールドなどをのせたコンポを作っておいて、それを生成するようにすればいいと思います
タブシートの切替サンプル
http://hp.vector.co.jp/authors/VA009712/take/delphi/ture1998.htmの11月21日
内容の置換はあまり推奨できません
返事が遅れてしまい、申し訳ありません。
jokさん
そうですよね、素直にそうすれば悩むこともなかったのですが。某MLの過去ログで
普通はTMemoを切り替えて・・・と書いてあったのがどうしても忘れられなかったん
ですよ。もしかしたらポインタを参照させるような、画期的な方法があるのではな
いかと思ってしまいました。
にしのさん
詳しい説明ありがとうございます。
再度質問で申し訳ないのですが、TStringは抽象クラスですよね?TMemoのサブクラ
スだとしてもTMemoがインスタンス化される時にTStringもインスタンス化されるは
ずですよね?このあたりがまだよくわからないんです。
るるとんさん
まさに、それ!って感じです。これから見てみたいと思います。ありがとうござい
ます。
昨日どうしてもこの件を解決させたくて、住んでいる県の県庁所在地の大きな本屋
を回ったのですが、Delphi関連の本は4冊のみ…。
ほんとみなさんには感謝です!ありがとうございました。
> 再度質問で申し訳ないのですが、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が実装しています。こちらが呼ばれるわけです。
にしのさま
恥ずかしながら間違いに気づきました。TMemoのサブクラスというのを継承されたクラスではなく、TMemo内に持っているクラスと勘違いしていました。
結局TStringクラスをプロパティに持っているのは、TStringクラスから派生されたクラスでも扱えるようになのですね。
混乱していましたが、回答を読んでいろいろ気づくところがありました。
わかりやすい回答をありがとうございました。
ツイート | ![]() |