実行中にコントロールを増やす

解決


たけ  2002-07-23 08:01:14  No: 1154

タブ型のエディタを作っているのですが、実行中にMemoコントロールの数を
増やす方法がわかりません。
何か良いアドバイスをお願いします。


のこ  2002-07-23 19:32:12  No: 1155

必要な時にTabSheetとMemoを新規作成。

TabSheetX := TTabSheet.Create(Self);
MemoX := TMemo.Create(Self);

MemoX.Parent は TabSheetX に。
その他の必要なプロパティ、ハンドラも適切にセット。
不要になったら、 Free;

TabSheetX、MemoX としては、それぞれ10個くらいの配列変数を用意しておけばいいんじゃないかな。


にしの  2002-07-23 19:42:11  No: 1156

「10個」など、固定で持てば必ず破綻します。
別の方法で動的に管理することをおすすめします。


たけ  2002-07-23 22:09:39  No: 1157

お二人ともありがとうございました。
無事にコントロールを増やせました。
解決と致します。


のこ  2002-07-24 15:11:58  No: 1158

>>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;


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








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