初めて投稿させていただきます。
VB6で開発を行っています。
String型の変数へフォーム内のオブジェクト名あるいはフォーム名を代入して
フォームの制御又は、フォームのShowを実行させたいと思っております。
Dim sForm As String
Dim sFrame As String
Dim sFormObj As Object
Dim sFrameObj As Object
sParm = "FormMain"
sFrame = "Frame1"
Set sFormObj = sParm
Set sFrameObj = sFrame
sFrameObj.Enable = True
sForm.Show
上記記述ですと、エラーになってしまいます。
何方か分かる方がおられましたらご教授をお願いいたします。
sParmは"FormMain"であってFormMainではないからObjectにSetしても
Formにはなれません。
Me.Controls(sParm).Show
みたいにしてできないでしょうか。
#検証はしておりません。
> String型の変数へフォーム内のオブジェクト名あるいはフォーム名を代入して
> フォームの制御又は、フォームのShowを実行させたいと思っております。
そういう時は、「フォーム名」を String 型で渡すのではなく、
「フォームそのもの」を Form 型で渡した方が良いかと。
> 上記記述ですと、エラーになってしまいます。
フォーム名からフォームオブジェクトを生成するには、
Dim S As String
S = "Form2"
Dim F As Form
Set F = Forms.Add(S)
Load F
F.Show vbModeless
のように、Forms.Add メソッドを用いるという手法があります。
はっ、、そうか、探すぐらいなら生成したほうが確実だ、、、orz
>> Set F = Forms.Add(S)
>> Load F
>> F.Show vbModeless
すみません。上記の 2 行目は削除してください。
Add メソッドで生成したときは、Load ステートメントは不要です。
うっかり、
Set F = New Form2 ' Form2 の Initialize イベントが発生
Load F ' Form2 の Load イベントが発生
F.Show vbModeless
の構文と混同していました……。
(Forms.Add の場合、自動的に Load 処理まで行われます)
> はっ、、そうか、探すぐらいなら生成したほうが確実だ、、、orz
ただし、フォームの二重起動などを避けたいのであれば、
生成前に 『Forms コレクション』内を列挙して、目的のフォームが
既にロード/表示されていないかを確認する必要があるでしょう。
# なお、Forms コレクションに登録されるのは、
# Form が生成されたときではなく、Form がロードされた時です。
ツイート | ![]() |