タブ型のエディタを作っているのですが、実行中にMemoコントロールの数を
増やす方法がわかりません。
何か良いアドバイスをお願いします。
必要な時にTabSheetとMemoを新規作成。
TabSheetX := TTabSheet.Create(Self);
MemoX := TMemo.Create(Self);
MemoX.Parent は TabSheetX に。
その他の必要なプロパティ、ハンドラも適切にセット。
不要になったら、 Free;
TabSheetX、MemoX としては、それぞれ10個くらいの配列変数を用意しておけばいいんじゃないかな。
「10個」など、固定で持てば必ず破綻します。
別の方法で動的に管理することをおすすめします。
お二人ともありがとうございました。
無事にコントロールを増やせました。
解決と致します。
>>TabSheetX、MemoX としては、それぞれ10個くらいの配列変数を用意しておけばいいんじゃないかな。
>「10個」など、固定で持てば必ず破綻します。
>別の方法で動的に管理することをおすすめします。
あれっ?、TTabSheetとTMemoの配列をあらかじめ固定で確保しておいても、インスタンスがあるわけではなくて単なるポインタの配列ですから(要素数x4)バイト消費するだけですよね。 動的配列を使わなくても特に問題ないのでは?
試しにWin98で100個作成してみましたが、まだまだ破綻しませんです。(^^;;
Memoに大きなファイルを読み込んだらダメですけど…(^^ゞ
var
Memo : array[1..100]of TMemo; // 100個で400バイト消費
TabSheet : array[1..100]of TTabSheet; // 100個で400バイト消費
//TabSheetとMemoを動的作成
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
for i:=Low(TabSheet) to High(TabSheet) do begin
if TabSheet[i] = nil then begin
TabSheet[i] := TTabSheet.Create(PageControl1);
with TabSheet[i] do begin
PageControl := PageControl1;
Name := 'TabSheet'+IntToStr(i);
Caption := 'File '+IntToStr(i);
Visible := True;
end;
PageControl1.ActivePage := TabSheet[i];
Memo[i] := TMemo.Create(TabSheet[i]); //MemoのOwnerはTabSheetとする
with Memo[i] do begin
Parent := TabSheet[i];
Align := alClient;
Name := 'Memo'+IntToStr(i);
Visible := True;
end;
break;
end;
end;
end;
// 表示されているTabSheetとMemoを削除
procedure TForm1.Button2Click(Sender: TObject);
var
i : Integer;
begin
for i:=Low(TabSheet) to High(TabSheet) do begin
if TabSheet[i] = nil then continue;
if TabSheet[i].Visible then begin
TabSheet[i].Free; // TabSheetが所有するMemoも自動開放
TabSheet[i] := nil;
break;
end;
end;
end;
ツイート | ![]() |