動的に作成したテキストボックスについて

解決


nao  2004-07-12 18:11:16  No: 84536  IP: [192.*.*.*]

動的に作成したテキストボックスにLostFocusのイベント
を反映させたいのですが、無理でしょうか。
以下がソースです。この内容では無反応でした。

Set TxtObj = Controls.Add("VB.TextBox", "Text1")

Private Sub Text1_LostFocus(Index As Integer)

    Text1.BackColor = 12632319

End Sub

※ ソース作成画面の上にあるオブジェクトには、Text1は出てこず
   TxtObjがでてきており、TxtObj_LostFocusにしても結果は同じでした。
   それが原因かも知れないと思っています。

どなたか分かる方教えて下さい。

編集 削除
nanashi  2004-07-12 18:23:03  No: 84537  IP: [192.*.*.*]

TxtObjにWithEventsを付けて宣言してますか?

あとソースも下記のようになります。

Private Sub TxtObj_LostFocus(Index As Integer)

    TxtObj.BackColor = 12632319
End Sub

編集 削除
nao  2004-07-12 18:56:11  No: 84538  IP: [192.*.*.*]

ご返答ありがとうございます。
うまくいきました。
実は、動的にテキストボックスを作成するのは、1つではなく
何個あるかは場合によって違うのです。(その為に動的にしています。)
以下のようにオブジェクトを宣言しないと無理でしょうか。
各々にLost_Focusがいります。

Private WithEvents TxtObj1 As TextBox
Private WithEvents TxtObj2 As TextBox
Private WithEvents TxtObj3 As TextBox

それとも配列をうまく使用する事はできるでしょうか。

編集 削除
魔界の仮面弁士  2004-07-12 19:27:15  No: 84539  IP: [192.*.*.*]

WithEvents変数は、配列にできません。
Controls.Addメソッドで増やす替わりに、
コントロール配列を Load して使うことを検討してみてください。

編集 削除
nao  2004-07-12 19:58:53  No: 84540  IP: [192.*.*.*]

すいません、私はあまりVBの開発経験が少ないので
言われている内容がよく理解できないです。
すいません分かりやすく教えて下さい。

編集 削除
Dental  2004-07-12 20:58:29  No: 84541  IP: [192.*.*.*]

> 言われている内容がよく理解できないです。
という事は、まったく理解できなかった、という事では無いのですよね。
回答された内容の、どの部分が理解できなかったのですか?

「WithEvents変数は、配列にできません。」の行ですか?
「Controls.Addメソッド」という部分ですか?
それとも、「コントロール配列」や「Load」などの用語ですか?


わからないにしても、与えられたキーワードを元に、自力で調べましょう。
ヘルプを検索したり、googleで検索したり、過去ログを探したりすれば、
コントロール配列を動的に作成する方法が見つかるわけですし。

http://madia.world.coocan.jp/vb/vb_bbs/200208_02080010.html
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200301/03010051.txt
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200405/04050087.txt

それでもわからなければ、回答にあったどの部分がわからなかったのかを、
具体的に質問しましょう。曖昧な質問には、曖昧な答えしか返されませんよ。

編集 削除
nao  2004-07-13 12:46:43  No: 84542  IP: [192.*.*.*]

ありがとうございます。
load を使用する事で解決しました。
ありがとうございました。

編集 削除
ひろ  2004-07-29 10:35:53  No: 84543  IP: [192.*.*.*]

便乗質問です。

Set TxtObj = Controls.Add("VB.TextBox", "Text1")
で作成したテキストボックスは、Multiline = Falseで生成されてしまうようですが、
これをTrueにできないでしょうか?

Multiline = True, Visible = Falseで隠した雛形を用意しておいて、
Loadで増やすという手もやってみましたが、これだとコントロール配列になって、
機能追加のためのクラス(既存)をくっつけることができません。

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_STYLE = (-16)
Public Const ES_MULTILINE = &H4
Dim Style As Long
Style = GetWindowLong(Text1.hWnd, GWL_STYLE)
Style = Style Or ES_MULTILINE
SetWindowLong Text1.hWnd, GWL_STYLE, Style

ってのもなんだか効かないようですし……。

編集 削除
ガッ  2004-07-29 17:50:06  No: 84544  IP: [192.*.*.*]

良くわからんが、
>Set TxtObj = Controls.Add("VB.TextBox", "Text1")
これなら、

>SetWindowLong Text1.hWnd, GWL_STYLE, Style
こうじゃなく
SetWindowLong TxtObj.hWnd, GWL_STYLE, Style
か?

編集 削除
ひろ  2004-07-30 09:36:38  No: 84545  IP: [192.*.*.*]

すみません、テスト用のコードを貼ったせいでインスタンス名が食い違ってました。
実際はちゃんと統一されてます。

その後に試したのは、

・内在コントロールとしてMultiline = Trueにしたテキストボックスのみをもつ
  ユーザーコントロールの作成
→動的生成したときの、Left, Height, Visibleなど、Extenderのプロパティ操作法がわからず、テキストボックスと同じ扱いができるコントロール作成に失敗(デザインで配置しておけばOKだけど)
#ユーザーコントロール作成経験なしです。

・テキストボックスを持つフォームを非表示でこっそり生成し、
  SetParentを使って親フォームを付け替えて奪う
→付け替えてクラスでイベント処理させることには成功。
  しかし、イベントは元の親フォームに流れてしまうようで、挙動が変。

Loadで配列コントロールにしようかな……。
クラスが使えないんで、書き直しに手間がかかるけど。

編集 削除