- - PR -
ソリューションエクスプローラでフォームを複製するとエラーになる。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-08-31 23:32
じゃんぬねっとさん、私に教えようとするところは理解できました。
そもそも "継承はコピーではない" ということですね。 継承とは、クラスの複製を作成するときに元のクラスのプロパティやメソッド、 イベント等の内容を引き継ぐ場合に使われていた言葉のように記憶しています。 ここでは、コピーする方法を尋ねたのです。ありがとうございました。 [ メッセージ編集済み 編集者: だんじり 編集日時 2007-09-01 08:55 ] | ||||
|
投稿日時: 2007-08-31 23:46
そうやってちゃんと、ご自分でできることをやった上で、 わからなくて質問するのであれば、全く問題ないと思います。 こちらこそうるさくいってすみませんでした。 じゃんぬさんもおっしゃっていますが、 ソリューションエクスプローラからの コピーに相当することをやりたいのであれば 継承ではなく、私の書いた方法ということになると思います。 さて、DataGridView のお話ですが やってみたところ、コピーはできますが、 列までコピーしてくれませんでした。 おそらくこのことをおっしゃっているんですよね? 列も含めたコピー・・・まあ、やろうと思えば 手はいくらでもあると思いますが、 どれがスマートなやり方なのかはよくわかりません。 もっといい方法が思いつく方は教えて頂けたらと思います。 私はとりあえず、当初の目的通り、 フォームを丸ごと複製する方法として、以下を考えてみました。 結局、ソリューションエクスプローラからのコピーというのは、 ファイルをそのままコピーするだけになるので、 フォームのクラス名が重複してしまってエラーになります。 ですから、そのクラス名を手で修正してしまおうというわけです。 Form1 をコピーして Form2 を作成するという仮定で説明します。 (1) ソリューションエクスプローラでコピーを実行する。 (2) ソリューションエクスプローラの上にあるツールバーの 「すべてのファイルを表示」が押された状態になっていなければ 押された状態にする。 (3) 「コピー 〜 Form1.vb」を選択してF2ボタンを押して、名前を 「Form2.vb」に変更する。 (自動で 〜designer.vb ファイルも名前が変更されます。) (4) Form2.vb を右クリックして「コードの表示」でコードを表示し、 「Public Class Form1」となっているのを、 「Public Class Form2」に変更する。 (5) Form2.vb の横の+マークで展開すると表示される Form2.designer.vb をダブルクリックしてコードを表示し、 「Partial Class Form1」となっているのを、 「Partial Class Form2」に変更する。 これでエラーなく表示できると思います。 | ||||
|
投稿日時: 2007-09-01 09:41
KIさん、おはようございます。
昨夜は大変親切な解答をいただき、ありがとうございました。ご解答いただきました 内容の手順どおり、今朝から実験していますが、次のような不都合が発生します。 (1)〜(5)までの処理を行いForm2.vbは正常に動作しますが、コピー元Form1.vb の「デザイナの表示」で次のようなエラーメッセージが表示され、35個のエラーが 発生し、Form1.vbのデザイナは表示できません。私の操作ミスでわな以下と2回行い ましたが同様な結果です。 −−−−−−−−−−−− エラーメッセージ −−−−−−−−−−−−−−−−− メソッド 'InitializeComponent' を解析できませんでした。パーサーによって以下 のエラー 'エラー HRESULT E_FAIL が COM コンポーネントの呼び出しから返されま した。' が報告されました。 | ||||
|
投稿日時: 2007-09-01 09:53
私もコピーはよく使います。
ですが、VisualStdioが気を利かせようとして失敗して、 デザイナが動かなくなったりしますね。 私は普段KIさんのやり方でやりますが、 複雑なフォームなどでは たまにうまくできない時があります。 そういった場合、私はダミーのプロジェクトを使います。 空のプロジェクトを作成し、 ソリューションエクスプローラーから、 空プロジェクトに対象ファイルをコピーします。 コピー後、空プロジェクト側で名前変更を行います。 (VBなら「Form1」を右クリックかな? で、元のプロジェクトに戻します。 これで大抵はできるのですが。 お試しください。 | ||||
|
投稿日時: 2007-09-01 10:34
さかもとです。
「同じようなフォーム」を読み違えました。 純粋にコピーだったと・・・。 すいません。皆様おっしゃるように「継承」=「コピー」 ではありません。 以下は本題とは別です。 継承ピッカー表示されていませんか? ひょっとしてVS2005Teamが入っているところにExpressEdtionを入れるという良くないことをしているので私側では見えるのかもしれません。 その当たりのバージョン別細かい機能の差に関する資料は見つけられませんでした。 _________________ ------------------------------------------ 拝啓、さかもとと申します♪ | ||||
|
投稿日時: 2007-09-01 11:36
れいさん
経験談を含めて、解答ありがとうございました 早速2個のプロジェクトを次のように作成し試みました。 WindowsApplication1(含む My Project、 Form1_1.vb) WindowsApplication2(含む My Project、 Form2_2.vb) 1.Form1_1.vbをWindowsApplication2にコピーして名前をForm1_3.vbに変更 2.WindowsApplication2のForm1_3.vbをWindowsApplication1へ移動します 結果は以下のようになりました。 WindowsApplication1(My Project、 Form1_1.vb、 Form1_3.vb) WindowsApplication2(My Project、 Form2_2.vb) これで、れいさんの言われるとおりForm1_1.vb及びForm1_3.vbは正常に動作 していますが、次の *.VB のコードに問題があるのではないでしょうか。 1.Form1_3.vbのコードに「Form1_1」の名前が2箇所残っています 2.Form1_3.Designer.vb のコードに「Form1_1」の名前が3箇所残っています このことはKIさんの言われたとおり 「結局、ソリューションエクスプローラからのコピーというのは、ファイルをその ままコピーするだけになるので、 フォームのクラス名が重複してしまってエラー になります。 ですから、そのクラス名を手で修正してしまおうというわけです。」 とのことで、コピー先の Form1_3.vb 関連ファイルに「Form1_1」の名前が残って しまうようです。しかし、このような修正を「編集」メニューの「クイック置換」 を使えば容易に置き換えられますので、これからはれいさんの言われる方法でやろ うと思います。ただなんとなく、スマートな方法ではありませんね。 さかもとさま お返事ありがとうございます。「継承ピッカー」との読み違えとのこと了解です。 なお、私のEEには「継承ピッカー」は見当たりません。 それにしても諸先輩方はフォームの複製(コピー)などは、あまりなさらないので しょうか。また、さかもとさん、いい方法が見つかりましたら教えてください。 | ||||
|
投稿日時: 2007-09-01 11:47
えーと。 >(VBなら「Form1」を右クリックかな? これを読めばわかるかと思ったのですが、 伝わらなかったようです。 >1.Form1_1.vbをWindowsApplication2にコピーして名前をForm1_3.vb ファイル名を変更するのではありません。 コピーしたForm1_1.vbを開き、 たとえば、「Class Form1_1」となっている所の「Form1_1」にカーソルを合わせ、 右クリックを押すと「名前の変更」というのが出ます。 これで変更してください。 これで、関連する全ての名前がForm1_1からForm1_3に変わります。 こうやって変えた後、元に戻すとうまく行きます。 | ||||
|
投稿日時: 2007-09-01 11:49
こちらでは、私が提示した手順 (1)〜(5) でできてるんですけどね。
なぜでしょう・・・ Visual Studio が余計な気を利かせてしまうとかなら、 エクスプローラでコピーして外部のテキストエディタで 同じことをすればOKかもしれません。 いずれにせよ、クラス名が重複するのが原因だということが理解できれば、 方法はいくらでもあるというのは理解していただけたと思います。 他にはフォームは新規作成して InitializeComponent のコードの 中身をコピーするという手もありますので参考までに。
私の場合、どちらかといえばコントロールを個別にコピーする方が多いですが、 フォーム丸ごとコピーも使わないことはないです。 その場合はさっきの方法を使っています。 |