標準モジュールからフォーム上のコントロールを操作するには

解決


まさし  2002-09-04 14:59:14  No: 104825  IP: [192.*.*.*]

標準モジュールや、フォームなどから
別のフォーム上にあるコントロールを操作する方法を教えてください。

たとえば、Form2の何らかのイベントでForm1内のボタンに
visible = false
などの変更を加える方法です。

単純に、
Form1.button1.visible = false
とやると、「非共有メンバを参照するにはオブジェクト参照が必要です」
といわれます。なので、
Dim Form1 As New Form1()
を入れればとりあえずエラーではなくなりますが、これでは新たにインスタンスを
作成しているだけで、現在表示されているForm1に変更が加わるわけではないので
どうしたらよいのか分からず行き詰まっています。
よろしくおねがいします

編集 削除
多分  2002-09-04 15:55:47  No: 104826  IP: [192.*.*.*]

単純にやった方法でいいはずなんですけどね。

ところで同じプロジェクトですか?

編集 削除
t@Ki  2002-09-04 16:01:30  No: 104827  IP: [192.*.*.*]

この場合は関数の引数としてコントロールを与えてやるとよいと思います。
注意する点としてはByRefで渡す必要があります。

'呼出し
call Module1.g_AAAAA(Me.Command1)

'標準モジュールの関数
Public Sub g_AAAAA(ByRef a_Button as CommandButton)
     a_Button.Visible = False
end Sub

とういう具合です。
この例だと引数の型が"CommandButton"になっていますが、
"Object" でも動きます。

編集 削除
まさし  2002-09-04 16:17:49  No: 104828  IP: [192.*.*.*]

レスありがとうございます。

>多分さん
6.0まではそれでできたのですが、.NETからはできないようです。

>t@kiさん
ありがとうございます。ByRefで渡す方法なら確かに出来そうです
でもコントロールの操作に関してはその関数の本筋ではないので
引数として渡すのにはちょっと問題ありそうです(仕事なので)

このような6.0ソースを.NETにアップグレードすると
Form1.Definstance.Button1.visible = False
と変換され、問題なく動きます。
フォームにアップグレードに伴うコードが追加され
そのおかげでこのような表記が出来るようになるようです。
意味は理解できませんでした。
この変のことご存知な方いらっしゃいませんでしょうか

編集 削除
t@Ki  2002-09-04 17:11:06  No: 104829  IP: [192.*.*.*]

フォームのプロパティとしてコントロールを設定するという
やり方もあります。
こうすれば、好きなときにコントロールをいじることができます。

'フォームモジュール内変数
Option Explicit
dim m_Command1ptr as CommandButton
----------------------------------------------------------------------
'フォームのプロパティ設定
Property Set p_Command1(ByVal a_Command1 as CommandButton)
     m_Command1ptr = a_Command1
end Property
Property Get p_Command1()
     p_Command1 = m_Command1ptr 
end Property

'標準モジュール呼出し
     p_Command1= Me.Command1 '//関数を呼び出す前に参照を設定
     call g_AAAAA
'標準モジュールの関数
Public Sub g_AAAAA()
     Form1.p_Command1.Visible = False     
end Sub

とういう具合でどうですか?

編集 削除
t@Ki  2002-09-04 17:18:41  No: 104830  IP: [192.*.*.*]

すみません訂正です。

間違い
Property Set p_Command1(ByVal a_Command1 as CommandButton)
     m_Command1ptr = a_Command1
end Property
Property Get p_Command1()
     p_Command1 = m_Command1ptr 
end Property

訂正
Property Set p_Command1(ByVal a_Command1 as CommandButton)
     Set m_Command1ptr = a_Command1
end Property
Property Get p_Command1()
     Set p_Command1 = m_Command1ptr 
end Property

編集 削除
まさし  2002-09-10 10:28:24  No: 104831  IP: [192.*.*.*]

お返事遅くなりました。すいません。
やはり.NETでは普通の手段では、別モジュールへの操作は出来ないのですね
その方が言語としては理路整然としてるのでしょうが、如何せん不便です

.NETはコントロール配列がなくなってたりしているので
イベントや参照だけならTagで代用できるとしても、プロパティの変更等は
Forで回してまとめてやることが出来なくなっているので不便だし…

ラベルが重なるとラベル同士では透過しないのも不便…

この3点はかなり大問題です。
レスありがとうございました。

編集 削除