- PR -

親フォームのpublicプロシージャー呼び出し

投稿者投稿内容
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2005-04-26 12:03
引用:

未記入さんの書き込み (2005-04-26 11:41) より:
ありがとうございます。

残念ながら仕様上構造を変えることはできません。プロジェクトの出力がWindowsアプリケーションである以上、それを参照することができないのは非常に残念です。Javaだと簡単に参照できるのに・・。


アセンブリの参照関係を変えたくない、という意味ですか?
そうであれば、
・Form2のdllにinterfaceを定義
・そのinterfaceを、Form1でimplementsする
・Form2は、「Form1そのもの」としてではなく、「そのinterfaceとしてのForm1」をアクセスする
だったら出来そうな気がします。

それすらNGならば……キーワードも2つほど持っているけど、今のところ触れたくないです(←あきらめたほうがトラブルに遭遇しにくい)。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-04-26 12:12
引用:

残念ながら仕様上構造を変えることはできません。


とは言っても、解決するためにはある程度、呼ぶ側・呼ばれる側ともに手を入れる必要はあるんじゃないでしょうか。
他の皆さんが仰っているように、インターフェイスでメソッドを定義してインプリメントする程度なら、屋台骨ぐらつかす程の構造変更ではないと思いますけど…。
あとは、デリゲートとかイベントとかかな。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-04-26 12:17
引用:

未記入さんの書き込み (2005-04-26 11:41) より:
残念ながら仕様上構造を変えることはできません。プロジェクトの出力がWindowsアプリケーションである以上、それを参照することができないのは非常に残念です。Javaだと簡単に参照できるのに・・。


微妙に誤解がありそうですが、参照できないのはWindowsアプリケーションだから「だけ」ではありません(エラーメッセージはそこまでしか出ないかもしれませんが)。
クラスライブラリにしても駄目ですよ。
未記入じゃけんど
ベテラン
会議室デビュー日: 2004/11/09
投稿数: 65
お住まい・勤務地: Osaka City
投稿日時: 2005-04-26 14:15
インターフェイスを作成してインプリメントですか?
ありがとうございます。ちょっと難しそうですけど試してみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-26 23:09
ぢゃん♪さん>
 循環参照になりません?

未記入さん>
> 残念ながら仕様上構造を変えることはできません。
 今の構造だとできないのだから、仕様を変更するしかないのでは?
 まぁ、循環参照と同じで、VSが許可していないだけのようにも思いますけど。うん、そのようだ。できないことはない(ただし、できないケースの方が多い)が、やるのは避けるように、ってことですね。スタティックなmainメソッドが2つ以上できて、どちらを実行するかわからない、ってことろでしょうか。
 Javaだと、「このメソッドから実行」って指定するんじゃなかったっけ?つまり、.NET Frameworkだと、実行メソッド名が固定なので、実行ファイルさえあれば実行できる(つまり、以前の実行ファイルと同じ)が、Javaはファイルがあっても実行メソッドがわからなければ実行できない。この辺のトレードの結果でしょう。
引用:

実行時には、同じプロセスで複数の .exe を読み込むことができる場合もありますが、1 プロセスに読み込むことができる .exe アセンブリは 1 つだけであるものと考えておく必要があります。このため、/target:exe または /target:winexe を使用してビルドしたアセンブリを /reference には渡さないでください。これは、共通言語ランタイムの将来のバージョンで変更される可能性があります。



 なんにしても、Form1からForm2を呼び出し、Form2からForm1を操作するのであれば、ここに参照の循環が生じます。これは設計上避けるべきです。
 回避策として、
1.インターフェイスを定義する別のDLLプロジェクトを用意する
2.Form2にイベントを定義し、イベントハンドラとしてForm1のメソッドを定義する
3.デリゲートを利用する(2といっしょやん)
ってところでしょうか。

> インターフェイスを作成してインプリメントですか?
 Javaやってんなら簡単でしょ(「Javaだと簡単に参照できるのに」に対する皮肉です)。

_________________
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2005-04-27 08:47
引用:

Jittaさんの書き込み (2005-04-26 23:09) より:
ぢゃん♪さん>
 循環参照になりません?


工夫すれば、循環参照にならないように作れます。
(あくまでも「工夫」なので、設計として問題がないかどうかは置いといて。)
大雑把に書くと……

  • <仮称>Form1.exe
    コード:
    Public Class Form1
    
    Inherits System.Windows.Forms.Form
    Implements <仮称>ParentFormInterface
    '実装は省略します


  • <仮称>Form2.dll
    コード:
    Public Interface <仮称>ParentFormInterface '実装は省略します

    コード:
    Public Class Form2
    
    Inherits System.Windows.Forms.Form
    'このクラス中では、親フォームForm1を、<仮称>ParentFormInterfaceという型でアクセスします
    '実装は省略します


  • <仮称>Form1.exeが、<仮称>Form2.dllを参照設定します。
という感じで、実際に動作確認もしています(私はC#使いなのでC#でですが)。
ポイントは、Interfaceを<仮称>Form1.exe側ではなく<仮称>Form2.dll側に持たせることです。


……以上はあくまでも工夫であって、これとは別に。
引用:
なんにしても、Form1からForm2を呼び出し、Form2からForm1を操作するのであれば、ここに参照の循環が生じます。これは設計上避けるべきです。


この場合、元々は、そういうことなんですけどね。
(何か他にも設計に無理な点があるかも……。)

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2005-04-27 08:56 ]
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-04-27 16:24
お勧めできないのですが...

> Form2のボタンを押下時に、Form1のpublicプロシージャーを呼び出す処理

遅延バインディングが使える可能性があります。

Option Strict Off
をソースに書く。

OwnerをObject型にして、目的のメソッドを呼び出す。

これでいけるはず。

ただし、これを使うと悪い設計とされてもしょうがないものになりますよ。
ここまで意図的にだれも書かなかったんだと思う。

_________________
たつごろー
codeseek
こみゅぷらす
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2005-04-27 17:25
引用:

たつごろーさんの書き込み (2005-04-27 16:24) より:
お勧めできないのですが...


というか、パンドラの箱を開けるようなものであり「神よ万難辛苦を我に与えたまえ」なつもりで使わないといけないんですよね……。
引用:

ただし、これを使うと悪い設計とされてもしょうがないものになりますよ。
ここまで意図的にだれも書かなかったんだと思う。


ということです↓。
引用:

ぢゃん♪の書き込み (2005-04-26 12:03) より:

それすらNGならば……キーワードも2つほど持っているけど、今のところ触れたくないです(←あきらめたほうがトラブルに遭遇しにくい)。


もうひとつも同類で、リ…ぁゎゎゎゎ

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