C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: TextBoxArray を取得したいんですが


(過去ログ 127 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■75620 / inTopicNo.1)  TextBoxArray を取得したいんですが
  
□投稿者/ 良い湯 (1回)-(2015/04/15(Wed) 13:41:42)

分類:[.NET 全般] 

よろしくお願いします。
VB2010 Windows7-32bit 環境です。

アクティブFORMに存在するTextBoxArray(TEXTI) にTextBoxを追加したいのですが
以下の<エラー行>のコーディングがわかりません。
御教授お願いします。

Dim ACTform As Form = System.Windows.Forms.Form.ActiveForm
Dim 親TextBoxArray as Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray

親TextBoxArray = CType(ACTform.Controls("TEXTI"), Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray)<エラー行>
 
親TextBoxArray.SetIndex(追加TextBox, CType(5, Short))
引用返信 編集キー/
■75621 / inTopicNo.2)  Re[1]: TextBoxArray を取得したいんですが
□投稿者/ shu (730回)-(2015/04/15(Wed) 14:03:34)
No75620 (良い湯 さん) に返信
> アクティブFORMに存在するTextBoxArray(TEXTI) にTextBoxを追加したいのですが
> 以下の<エラー行>のコーディングがわかりません。
なんのエラーでしょう?


TextBoxArrayの使用はお勧めしません。Framework4以上では警告対象です。
https://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.compatibility.vb6.textboxarray%28v=vs.110%29.aspx
引用返信 編集キー/
■75622 / inTopicNo.3)  Re[1]: TextBoxArray を取得したいんですが
□投稿者/ 魔界の仮面弁士 (289回)-(2015/04/15(Wed) 14:12:12)
2015/04/15(Wed) 15:31:07 編集(投稿者)

No75620 (良い湯 さん) に返信
> アクティブFORMに存在するTextBoxArray(TEXTI) にTextBoxを追加したいのですが

Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray は互換クラスですし、
使わない方向に持っていった方が望ましいのですが、その話はとりあえず置いといて:


> 以下の<エラー行>のコーディングがわかりません。
とりあえずは、
 親TextBoxArray = New Microsoft.VisualBasic.Compatibility.VB6.TextBoxArray(Me.components)
ですかね。引数無しでも良いですが、終了処理のためには Components 噛ませた方が安全。

それと事前に
 If Me.components Is Nothing Then
  Me.components = New System.ComponentModel.Container()
 End If
も入れておくと良いかも。


-------- 追記 --------
質問内容を誤解してました。 No75623 の PANG2 さんの回答で理解。


> 以下の<エラー行>のコーディングがわかりません。

各フォーム側で、TextBoxArray 変数を Public か Friend にしておけば、
直接 SetIndex を呼べるようになりますね。

ただ、外部からそういうことを行わせたいのなら、
操作される側のフォームにあらかじめ、
  「TextBox を追加するための Public なメソッド」
を定義しておき、それを呼び出すべきだと思いますよ。
引用返信 編集キー/
■75623 / inTopicNo.4)  Re[2]: TextBoxArray を取得したいんですが
□投稿者/ PANG2 (79回)-(2015/04/15(Wed) 14:40:09)
2015/04/15(Wed) 14:55:46 編集(投稿者)

> アクティブFORMに存在するTextBoxArray(TEXTI) にTextBoxを追加したいのですが

外部からACTformがもつTEXTIというprivate変数を触りたいということですか?

> ACTform.Controls("TEXTI")

TEXTIはコントロールでないので不可。

ACTform.GetType().GetField("TEXTI", Reflection.BindingFlags.NonPublic).GetValue(ACTform)
で取得できると思うけど、

そもそも何故そのようなことをしたいのか?
引用返信 編集キー/
■75628 / inTopicNo.5)  Re[3]: TextBoxArray を取得したいんですが
□投稿者/ 良い湯 (2回)-(2015/04/16(Thu) 09:55:01)
2015/04/16(Thu) 10:27:42 編集(投稿者)


>アクティブFORMに存在するTextBoxArray(TEXTI) にTextBoxを追加したいのですが

皆様、御対応ありがとうございます。
皆様の疑問は当然ですね。
少し説明しますと
10何年昔のオフコンのプログラム資産をWindows95上でVB4.0で稼働するように
あるコンバートツールでVB言語に変換して動作していました。
その後、WindowsXP上でVB6.0で動作させていました。
それをまた、Windows7上でVB2010で作成中です。
(現在は、Windows7でVB6.0版が動作しています)
この経緯でFORMが80以上、BASが600以上あるソースプログラムを
構造を変えて作り直す事が大変です。

FORMは全てLABELとTEXTはARRAYになっています。
各ソースで画面のFUNCTIONキーを要求する場合にFORM外に共通関数で
TEXTARRAYにTEXTを追加し(画面に見えない位置で)
入力後,追加したTEXTを削除しています。

ご理解いただけましたでしょうか。

引用返信 編集キー/
■75629 / inTopicNo.6)  Re[4]: TextBoxArray を取得したいんですが
□投稿者/ shu (732回)-(2015/04/16(Thu) 10:24:11)
No75628 (良い湯 さん) に返信

> ・・・
> この経緯でFORMが80以上、BASが600以上あるソースプログラムを
> 構造を変えて作り直す事が大変です。
> 
前述のとおり警告対象となっているものです。
ここで頑張って変更しておかないと次では非対応になっている可能性も
出てきます。既に6.0からの変換でかなり直すところがたくさん出てきていると
思います。ついでに直してみてはどうでしょう?強制するものではありませんが。


> FORMは全てLABELとTEXTはARRAYになっています。
配列にするのは
Private Labels() as Label

Labels = {Label1, Label2, Label3, .... , Labeln}
の表記で出来るのでLabelArrayを使う必要はないです。TextArrayなども同様
配列の要素に共通でイベントをわりあてるなら

For Each lbl in Labels
    AddHandler lbl.Click, AddressOf lbl_Click
Next


Private Sub lbl_Click(sender as Object, e as EventArgs)
    Dim lbl = TryCast(sender, Label)
    Dim Index = Array.IndexOf(labels, lbl)
    ・・・・
End Sub

のようにすればよいです。




引用返信 編集キー/
■75630 / inTopicNo.7)  Re[5]: TextBoxArray を取得したいんですが
□投稿者/ 良い湯 (3回)-(2015/04/16(Thu) 10:38:41)
No75629 (shu さん) に返信

shu様

ご指摘ありがとうございます。
もっともなご意見です。
私も、そう思っておりますが、
修正個所が膨大になりますので段階的に修正する為に
少しの修正で可能であれば、次の段階で・・・と思っていたのですが。
検討してみます。

ありがとうございました。

> ■No75628 (良い湯 さん) に返信
>
>>・・・
>>この経緯でFORMが80以上、BASが600以上あるソースプログラムを
>>構造を変えて作り直す事が大変です。
>>
> 前述のとおり警告対象となっているものです。
> ここで頑張って変更しておかないと次では非対応になっている可能性も
> 出てきます。既に6.0からの変換でかなり直すところがたくさん出てきていると
> 思います。ついでに直してみてはどうでしょう?強制するものではありませんが。
>
>
>>FORMは全てLABELとTEXTはARRAYになっています。
> 配列にするのは
> Private Labels() as Label
>
> Labels = {Label1, Label2, Label3, .... , Labeln}
> の表記で出来るのでLabelArrayを使う必要はないです。TextArrayなども同様
> 配列の要素に共通でイベントをわりあてるなら
>
> For Each lbl in Labels
> AddHandler lbl.Click, AddressOf lbl_Click
> Next
>
>
> Private Sub lbl_Click(sender as Object, e as EventArgs)
> Dim lbl = TryCast(sender, Label)
> Dim Index = Array.IndexOf(labels, lbl)
> ・・・・
> End Sub
>
> のようにすればよいです。
>
>
>
>
引用返信 編集キー/
■75631 / inTopicNo.8)  Re[6]: TextBoxArray を取得したいんですが
□投稿者/ 魔界の仮面弁士 (290回)-(2015/04/16(Thu) 10:46:54)
No75630 (良い湯 さん) に返信
> 少しの修正で可能であれば、次の段階で・・・と思っていたのですが。

TextBoxArray のまま修正する案は既に提示されているようですが、
その結果はどうだったのでしょうか?
引用返信 編集キー/
■75632 / inTopicNo.9)  Re[7]: TextBoxArray を取得したいんですが
□投稿者/ 良い湯 (4回)-(2015/04/16(Thu) 11:13:05)
No75631 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士 様

申し訳ありません。遅くなりました。
ご指摘の通りの

>操作される側のフォームにあらかじめ、
>  「TextBox を追加するための Public なメソッド」
>を定義しておき、それを呼び出すべきだと思いますよ。

を考えていますが、
問題はFORMの外部moduleでの共通関数でのActiveFormからの参照で
FORM側のPublicメソッドが呼び出せない事です。(方法がわからないだけかも)
やはり、外部Moduleでは無理でしょうか.



> ■No75630 (良い湯 さん) に返信
>>少しの修正で可能であれば、次の段階で・・・と思っていたのですが。
>
> TextBoxArray のまま修正する案は既に提示されているようですが、
> その結果はどうだったのでしょうか?
引用返信 編集キー/
■75633 / inTopicNo.10)  Re[7]: TextBoxArray を取得したいんですが
□投稿者/ 魔界の仮面弁士 (291回)-(2015/04/16(Thu) 11:26:37)
No75631 (魔界の仮面弁士 さん) に返信
>>少しの修正で可能であれば、次の段階で・・・と思っていたのですが。
> TextBoxArray のまま修正する案は既に提示されているようですが、
> その結果はどうだったのでしょうか?

PANG2 さんの案にて VB2010 で実験。
少し修正が必要でしたが、一応取得され、その後の Load にも成功しました。


(修正案1)
親TextBoxArray = ACTform.GetType().GetField("_TEXTI", Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).GetValue(ACTform)

(修正案2)
親TextBoxArray = ACTform.GetType().GetProperty("TEXTI", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance).GetValue(ACTform, Nothing)


# よもやプロパティ化されているとは思わなかった。(汗)
引用返信 編集キー/
■75634 / inTopicNo.11)  Re[8]: TextBoxArray を取得したいんですが
□投稿者/ shu (733回)-(2015/04/16(Thu) 11:33:52)
No75632 (良い湯 さん) に返信

> >操作される側のフォームにあらかじめ、
> >  「TextBox を追加するための Public なメソッド」
> >を定義しておき、それを呼び出すべきだと思いますよ。
> 
> を考えていますが、
> 問題はFORMの外部moduleでの共通関数でのActiveFormからの参照で
> FORM側のPublicメソッドが呼び出せない事です。(方法がわからないだけかも)
> やはり、外部Moduleでは無理でしょうか.
> 
ActiveFormはForm型であり、Form型にはそのPublicメソッドは当然定義されていないので
呼ぶことは出来ません。このような場合はInterfaceを使うか共通のベースフォームを定義するか
してActiveFormをそのInterfaceまたはベースフォームへとキャストすることによりメソッドの使用が可能です。


Interfaceの例)

Public Interface ITest
    Function TestMethod() As Integer
End Interface

Public Class Form1
    Inherits Form
    Implements ITest

    Public Function TestMethod() As Integer Implements ITest.TestMethod
    End Function
End Class

Public Module Module1
    Public Sub Test()
        Dim test = TryCast(System.Windows.Forms.Form.ActiveForm, ITest)
        If test IsNot Nothing Then
            Dim a = test.TestMethod()
        End If
    End Sub
End Module

時下打ちの為、動作は保証しませんがこんな感じです。

引用返信 編集キー/
■75635 / inTopicNo.12)  Re[8]: TextBoxArray を取得したいんですが
□投稿者/ 魔界の仮面弁士 (292回)-(2015/04/16(Thu) 11:38:24)
No75632 (良い湯 さん) に返信
> >操作される側のフォームにあらかじめ、
> >  「TextBox を追加するための Public なメソッド」
> >を定義しておき、それを呼び出すべきだと思いますよ。
> を考えていますが、
> 問題はFORMの外部moduleでの共通関数でのActiveFormからの参照で
> FORM側のPublicメソッドが呼び出せない事です。(方法がわからないだけかも)

たとえば、個々のフォームに
 Public Sub TextBox追加メソッド(パラメータ As Short)
などを追加しておいて、Module 側からは
 CObj(ActiveForm).TextBox追加メソッド(5)
などという感じですね。
ただし、メソッドを実装していないフォームに対して呼び出すと
当然エラーになりますので、その点は注意が必要です。


レイトバインドが気持ち悪いのであれば、
 Public Interface ITextBoxArrayLoader
  Sub TextBox追加メソッド(パラメータ As Short)
 End Interface
こんな感じのインターフェイスを用意しておき、各フォームでは
 Public Class Form2
  Implements ITextBoxArrayLoader
  Private Sub TextBox追加メソッド(パラメータ As Short) Implements ITextBoxArrayLoader.TextBox追加メソッド
  End Sub
 End Class
などのようにして実装していけば OK 。この場合、呼び出し側は
 Dim loader = TryCast(ActiveForm, ITextBoxArrayLoader)
 If loader IsNot Nothing Then
  loader.TextBox追加メソッド(5)
 End If
などと書けます。インターフェイスを実装しているかも If 文で調べられます。
インターフェイスを使う代わりに、基底のクラスを差し替える手法でもいけますね。


それ以外の別案としては、System.Windows.Forms.Form に対して、
拡張メソッド(すなわちExtension属性)を用いて定義する方法もありますが、
コントロール配列の扱いが画面ごとに異なる場合には、この方法だと扱いにくいでしょう。
引用返信 編集キー/
■75636 / inTopicNo.13)  Re[9]: TextBoxArray を取得したいんですが
□投稿者/ 良い湯 (5回)-(2015/04/16(Thu) 14:01:31)
No75635 (魔界の仮面弁士 さん) に返信
No75634 (shu さん) に返信

魔界の仮面弁士 様
shu 様

ご教授、ありがとうございます。
お二方とも素晴らしいです。
私は、VB4.0からVBにかかわってきましたが勉強不足ですね。

お二方の方法で成功しました。
各フォームに組み込みたいと思います。

ありがとうございました。

またの機会がありましたら、よろしくお願い致します。


>操作される側のフォームにあらかじめ、
>  「TextBox を追加するための Public なメソッド」
>を定義しておき、それを呼び出すべきだと思いますよ。
>を考えていますが、
>問題はFORMの外部moduleでの共通関数でのActiveFormからの参照で
>FORM側のPublicメソッドが呼び出せない事です。(方法がわからないだけかも)

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -