- PR -

タブページ内にあるコントロールすべてをコピーしたい

投稿者投稿内容
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2007-10-22 15:58
いつもお世話になっております。

VisualStdio2005(C++)、Windowsフォームアプリケーションで
タブコントロールをフォーム上に配置し、デフォルト表示はタブページが1つとなっているフォームを作成しました。

フォーム実行中にタブの追加を行うとき、デフォルト表示となっているタブページ(tabpage1)を
そのままコピーして、新しくタブページを新規追加したいのですが、
コードでどのように記述していいかわかりません。


タブを追加するのみであれば、
tabControl1->TabPages->Add("");
となるようですが、
tabpage1内にある複数のコントロールをそのままtabpage2にコピーして
使いたい場合、どのようにコードを記述していいかわかりません。

どなたかご教授していただければと思います。
よろしくお願い致します。

MSDNフォーラムにて別の方が似たような質問しており、ある方が
MemberwiseCloneメソッドを使う手法を提示していました。
そちらの手法を使用して解決できるのか、解決できるのであればどのように使うかわからなく質問させていただきました。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-22 16:46
C++/CLI でしょうか?

単に違うページでも同じものを使いたいのであれば、TabPage のコンテナに追加するのではなく、TabPage と同じ位置に載せるようなイメージで配置した方が楽です。

そうではなくあくまで TabPage 全体のコピーに拘りたい場合は、TabPage 上の Controls を列挙し、列挙した要素の型を動的に生成してからプロパティなどのメンバをすべて適切にコピーする (というよりは設定する) という方法しか思いつきません。 型についてはリフレクションに頼った方が良い場面になるでしょう。

MemberwiseClone メソッドについてですが、派生クラスを作る必要があるのはともかく。 NativeHandle などなどコピーされてはまずいものが含まれているため、この場面では使い難いと思われます。 結局手動で書くハメになりそうです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2007-10-22 17:01
引用:

じゃんぬねっとさんの書き込み (2007-10-22 16:46) より:
C++/CLI でしょうか?

単に違うページでも同じものを使いたいのであれば、TabPage のコンテナに追加するのではなく、TabPage と同じ位置に載せるようなイメージで配置した方が楽です。

そうではなくあくまで TabPage 全体のコピーに拘りたい場合は、TabPage 上の Controls を列挙し、列挙した要素の型を動的に生成してからプロパティなどのメンバをすべて適切にコピーする (というよりは設定する) という方法しか思いつきません。 型についてはリフレクションに頼った方が良い場面になるでしょう。

MemberwiseClone メソッドについてですが、派生クラスを作る必要があるのはともかく。 NativeHandle などなどコピーされてはまずいものが含まれているため、この場面では使い難いと思われます。 結局手動で書くハメになりそうです。





じゃんぬねっと様。ご回答どうもありがとうございます。
また、いつもお世話になっております。

実はMSDNフォーラムで、別な方の質問に対する回答はじゃんぬねっと様がしていました。
もしかして、この発言を見て回答していただけたらと、淡い希望を抱いていました。
大変助かります。

さて、本題ですがC++/CLIでの開発をしています。

tabpage1内に存在するコントロールすべてと同じものを、
tabpage2、tabpage3・・・tabpage[n]使用したいために、
n個あるタブページ数分、コードでなんとかできないかと考えていました。

1つのタブページでは、パネル、ラベル、チェックドリストボックス、ピクチャボックスなど
たくさんのコントロールがあり、これらのコントロールをコード上で
新しくタブページが作成されるたびにtabpage1と同じ配置でコントロールが表示できないものかと悩んでいました。

>列挙した要素の型を動的に生成してからプロパティなどのメンバをすべて適切にコピーする (というよりは設定する) という方法しか思いつきません。

コピーする手法について、ちょっと調査していたのですが、
MSDN等で探すもどのようなメソッドを使っていいかわかりません。
手法についてご教授していただけないでしょうか。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-22 18:54
引用:

effemiaさんの書き込み (2007-10-22 17:01) より:

実はMSDNフォーラムで、別な方の質問に対する回答はじゃんぬねっと様がしていました。
もしかして、この発言を見て回答していただけたらと、淡い希望を抱いていました。
大変助かります。


すみません。 あれは何も考えていないダメダメな回答です。

引用:

tabpage1内に存在するコントロールすべてと同じものを、
tabpage2、tabpage3・・・tabpage[n]使用したいために、
n個あるタブページ数分、コードでなんとかできないかと考えていました。

1つのタブページでは、パネル、ラベル、チェックドリストボックス、ピクチャボックスなど
たくさんのコントロールがあり、これらのコントロールをコード上で
新しくタブページが作成されるたびにtabpage1と同じ配置でコントロールが表示できないものかと悩んでいました。


単に同じ機能を提供したいかつ TabPage にどうして配置したいというのであれば、UserControl をコンテナとした複合コントロールを使う (作る) のが賢明だと思います。

引用:

コピーする手法について、ちょっと調査していたのですが、
MSDN等で探すもどのようなメソッドを使っていいかわかりません。
手法についてご教授していただけないでしょうか。


軽く説明しますと、
  1. TabPage の Controls プロパティを For Each ステートメントで列挙します。
    (さらにコンテナが配置されることを考えると再帰を使うと良いです)
  2. 列挙したコントロールの要素の型を GetType して、動的に取得したその型から新しいインスタンスを生成します。
  3. 新しく生成したインスタンスに必要なプロパティの値を設定 (コピー) します。
  4. 新しく配置したい TabPage の Controls に Add します。
面倒くさいのでやはり UserControl をお勧めしたいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2007-10-25 18:52
お世話になっております。
別作業、当問題の調査等、多忙につき返事が遅れました。すみません。

引用:

単に同じ機能を提供したいかつ TabPage にどうして配置したいというのであれば、UserControl をコンテナとした複合コントロールを使う (作る) のが賢明だと思います。



UserControlを使う方向で調査していました。
以下のMSDNを参考にしてたのですが、よくわかりませんでした。

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.usercontrol(VS.80).aspx

上記のサンプルは複数のアプリケーションで再利用するサンプルですが、
私の場合は、同一アプリケーション内においてのことですので
イメージがちょっと沸きませんでした。

もう少しご教授していただけないでしょうか。
物分り悪くて申し訳ありません。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-10-25 19:31
引用:

上記のサンプルは複数のアプリケーションで再利用するサンプルですが、
私の場合は、同一アプリケーション内においてのことですので
イメージがちょっと沸きませんでした。



Dim x As New TextBox
Dim y As New TextBox

これでテキストボックスが2つできますよね。
それがユーザーコントロールというだけですよ。
今までの説明との違いは、全コントロールを列挙したり型を判断したりしなくてよいということだけです。
各コントロールがユーザーコントロール内にいるわけですのでそれらについては考える必要が無くなるということ。
タブの追加と同時にユーザーコントロールのインスタンスを作って、タブページに追加して位置調整して終わり。
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2007-10-25 21:29
引用:

まどかさんの書き込み (2007-10-25 19:31) より:
引用:

上記のサンプルは複数のアプリケーションで再利用するサンプルですが、
私の場合は、同一アプリケーション内においてのことですので
イメージがちょっと沸きませんでした。



Dim x As New TextBox
Dim y As New TextBox

これでテキストボックスが2つできますよね。
それがユーザーコントロールというだけですよ。
今までの説明との違いは、全コントロールを列挙したり型を判断したりしなくてよいということだけです。
各コントロールがユーザーコントロール内にいるわけですのでそれらについては考える必要が無くなるということ。
タブの追加と同時にユーザーコントロールのインスタンスを作って、タブページに追加して位置調整して終わり。



お世話になります。
ご回答いただいたところ、恐縮ですがC++/CLIではどのようになりますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-26 00:41
引用:

effemiaさんの書き込み (2007-10-25 21:29) より:

お世話になります。
ご回答いただいたところ、恐縮ですがC++/CLIではどのようになりますか?


まどかさんの書き込みにあるコードはあくまでイメージであり、"それがユーザーコントロールというだけですよ。" が主旨になります。 ですので、C++/CLI で実際に TextBox を配置してマネればわかるかと思います。 ただ VB の例からだとそれもわからない人がいるのかもしれませんね。

コード:

    MyUserControl^ myUserControl1 = gcnew MyUserControl();


こうなります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)