• ベストアンサー

ActiveX EXEのオブジェクトに渡したオブジェクトが微妙

またまた微妙な質問ですみません。 ------- ActiveX EXEプロジェクト Class Hoge Public Sub Moge(lst) Dim Cast As ListBox MsgBox TypeName(lst) 'ListBoxと表示される Set Cast = lst 'ここがエラー Cast.List(2) = "hogehoge" 'キャストはできないがVariant型のままのアクセスは可能 End Sub ------- 標準EXE Class Form1 (List1を配置) Dim X As New Hoge Private Sub Form_Load() X.Moge List1 End Sub ----- このように、アウトプロセスのオブジェクトにフォームのコントロールを渡しました。 引数の型をAs ListBoxにしたかったのですが、それだとまずそこで型が一致しないといわれます。 しようがないのでVariantで引数を宣言し、渡した後にキャストしようと思ったのですが、そこでも型が一致しないといわれます。 TypeName関数は "ListBox" を返すし、Variant型のままメンバにアクセスすることはできるのですが、ListBox型の変数に代入することだけできないのです。 別プロセスのオブジェクトには、オブジェクトの参照は渡せないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

リストボックスをオブジェクト変数にセットして、何をしたいのでしょうか? それがわかった方が、求める動きが可能かもしれません。 別プロセスでオブジェクトを渡すのは無理かと思います。 もしできるとしたら、オブジェクトのハンドルを取得し、オブジェクト変数の領域を確保。そこに代入という方法が思いつきますが、領域確保が思うようにならないVBでは落ちると思います。 ただリストボックスの選択している場所を得たいとか、選択させたいとか、そういう操作なら別プロセスなら、ハンドルだけで操作する方法もあります。 結局結末は何がしたいのでしょうか?

haporun
質問者

お礼

Variantのままlst.List(5)というアクセス方法はできるのですが、受け取ったリストボックスの参照に対して、非常に多くの動作をしたいので、Variant型で実行時バインドされると、ちょっと気持ちが悪いのです。

haporun
質問者

補足

コントロールではなくクラスなら普通に渡すことができました。 しかし、コントロール変数をメンバに持っていても、エディタでその変数のメンバを表示しようとしても出ませんでした。 具体的にやりたいことですが、制御を返すのに時間がかかるAPIを読んでしまった場合、VBではタイマーを使ったりしても、どうしてもプログラム全体が止まってしまいます。 通常はそのような関数は別スレッドで呼ぶべきなのでしょうが、VBにはスレッドがありませんので、ActiveX EXEを使って、擬似スレッドにしようと思ったのです。

その他の回答 (8)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.9

順次はいつも使用していないので、わかりません。。。^^;

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.8

アクセス=管理できている とは言いません。 先にも挙げたように LB_GETCOUNT         'ListCountの取得 LB_SELECTSTRING       'ListIndexの指定 LB_GETTEXTLENとLB_GETTEXT  'テキスト取得 LB_RESETCONTENT       'Clear LB_GETCURSEL        'ListIndexの取得 と言う定数があります。別にオブジェクトの型にセットできなくても、処理は可能です。 だから別にActiveXでなくても、アクセスができます。 値の設定・情報の取得ができることが、管理できているとは言うことにはなりません。 例えば、List1.ListIndex = 5とするとLB_SELECTSTRINGが投げられます。 VBはCで言うマクロを行っているだけです。 ListCountやClearなども一緒です。 管理できているから可能というわけでなく、ハンドルさえ取得したらできることです。 >Dim X As 外部ActiveXEXEのクラス >Set X = New 外部ActiveXEXEのクラス >とした時点で、Xが外部のプロセスの情報を持つことができるはずで、すでに持っていると考えられないでしょうか? ActiveXを自分(本体EXE)の子として扱う場合は話が別です。それが売りのActiveXなのですから・・・・ それができないなら、ActiveXじゃなくて、標準EXEでもいい事になります。 しかし外部EXEでオブジェクトを参照可能なのは、自分がインスタンスを作成したActiveXだけです。 A.EXE(標準) B.EXE(ActiveXAから派生) C.EXE(標準) D.EXE(ActiveXCから派生) AからBは管理できる CからDは管理できる AからDは無理 という事が言えます。

haporun
質問者

お礼

色々とアドバイスありがとうございます。 ちょっとリストから離れますが、やっぱり同じエラーを出すコード。 ------ client.exe Public Sub main() Dim Thread1 As New Class1 Dim Thread2 As New Class2 Dim Thread3 As New Class3 Thread1.Init Thread3 Thread2.Init Thread3 Thread3.Init Thread1, Thread2 'ここでエラー End Sub ------ server.exe ------ Class1, Class2(本当は同じじゃないけど) Private C3 As Class 3 Public Sub Init(c As Class3) Set C3 = c End Sub ------ Class3 Private C1 As Class1, C2 As Class2 Public Sub Init(cc1 As Class1, cc2 As Class2) Set C1 = cc1 Set C2 = cc2 End Sub ------ このようなコードが、なぜか完全コンパイルなしだと、通ることがあります。 >しかし外部EXEでオブジェクトを参照可能なのは、自分がインスタンスを作成したActiveXだけです。 どうもこれが原因みたいな気がします。 ひとまず、オーバーヘッドがあってもいいので、なんとか目的を達成できるようにがんばります。 私の微妙な疑問に付き合ってくださって、どうもありがとうございました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.7

質問: >ActiveX EXEのオブジェクトに渡したオブジェクトが微妙 したい事: >Variant型のままメンバにアクセスるとオーバーヘッドがあるので、ListBoxにちゃんとキャストしてから呼びたいといいたいのです。 回答:#4より >もし >Dim Cast As ListBox >と宣言して、この変数に別プロセスのリストボックスをセットできるとしたら、 ・・・・ >イベントを取得できないVBのオブジェクトを、コントロールの型の変数にセットするのは、皆無かと思います。 ということなのですが、、、 もう一度言います。 VBのコントロールの型(as listbox,as commandbuttonなどなど)は、他のプロセスでコントロールの受けでは使用できないと思います。 VBが内部でプロセス監視などをしていると思いますが、他のプロセスからはそこまでのサポートを行っていないからという状況のようです。 #4で「リストボックスのイベントが必要ですか?」と質問したわけではありません。「リストボックスのイベントを拾えない他プロセスのリストボックスを、コントロールの型にはセットできない」と言ったつもりなのですが・・・ それと、、、やはり題意からそれた部分ですが・・・ 本体EXE(リストボックスあり) ActiveXEXE(NET SENDを使用するEXE、本体EXEのリストボックスにステータスを送る) という作りですよね?(違っているかもしれませんが、そうだと思って、勝手に書きます。) ユーザが本体EXEで操作し、裏でActiveXEXEが何個も起動して進捗状況やステータスを本体EXEに送りたいということですよね? この2EXE間のやり取りには、お約束が定められていないと、非常に厳しいように思います。 本体EXEがActiveXを起動したときプロセスIDを取得しておく。 ActiveXがリストボックスに記す時、自プロセスIDを冠につけるとかすると、多少は融通が利くと思いますがどうでしょうか?

haporun
質問者

お礼

>そうだと思って、勝手に書きます。 これは意図したとおりです。 >この2EXE間のやり取りには、お約束が定められていないと、非常に厳しいように思います。 えーと、お約束はすでにVBが定義済みなのでは? ActiveX EXEは別プロセスと言えど、ActiveX DLLのコンポーネントとほとんど同じように扱うことができるではないですか。 ActiveX EXEがエクスポートしたコンポーネントは、クライアントで参照設定することにより、別プロセスであると言うことを除けば、普通にメンバにアクセスできます。 プロセスIDなどのやり取りは、すでに変数内部でVBが勝手に行っているような気がするのですが・・・。 Dim X As 外部ActiveXEXEのクラス Set X = New 外部ActiveXEXEのクラス とした時点で、Xが外部のプロセスの情報を持つことができるはずで、すでに持っていると考えられないでしょうか?

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

だんだん題意からそれてきた気が・・・^^; ListBoxの型は無理というのはOKだったのでしょうか? まぁそれはそれとして、管理者以外はたぶん見てないだろうから、まぁいいかw NetApiBufferSend とは NetMessageBufferSendの事だったのですね? それとも別にあるのかな? http://vbvbvb.com/jp/gtips/0251/gNetMessageBufferSend.html ↑こんな感じで使用されているのですよね? 整理したいのですが、二つのEXEがあり、 一つはActveXを呼ぶEXE 一つはActveX(EXE)※こちらで送信する ということですよね? それと私が#4で述べたのは、この二つのEXEの連携部分であって、他のマシンへの送信方法ではありません。「別プロセスのコマンドボタンを押す 」は完全に別プロセスです。 オーバーヘッドが起こるのは作りの問題のように思えるのですが・・・ ActivX側でインスタンスが作成するたびに、それまでのオブジェクトを破棄させてはいませんか?全体的なソースの公開がないと、これ以上の発言は難しいです ーー;

haporun
質問者

お礼

>だんだん題意からそれてきた気が・・・^^; いえ、それてるつもりはないのですが・・・。 Variant型のままメンバにアクセスるとオーバーヘッドがあるので、ListBoxにちゃんとキャストしてから呼びたいといいたいのです。 ごめんなさい、最初からこれを言えばよかったんですよね。 >NetMessageBufferSendの事だったのですね ごめんなさい、いつもマップ関数を通していたので勘違いしていました。 >こんな感じで使用されているのですよね? ちょっと違います。 UNICODE関数を呼ぶときはいつもバイト配列を渡していますから。 Declare Function NetMessageBufferSend Lib "netapi32.dll" ( _ ByVal servername As Long, _ msgname As Byte, _ fromname As Byte, _ buf As Byte, _ ByVal buflen As Long _ ) As Long Dim usr() As Byte, from() As Byte, msg() As Byte usr = "ゆーざー" + vbNullChar from = "じぶん" + vbNullChar msg = "めっせいじ" + vbNullChar ret = NetMessageBufferSend(0, usr(0), from(0), msg(0), Len("めっせいじ") * 2) >整理したいのですが、二つのEXEがあり・・・ということですよね? はい、そのとおりです。 >オーバーヘッドが起こるのは作りの問題のように思えるのですが・・・ やはり、関数を呼び出すために、文字列のハッシュから関数ポインタを見つけ出すのは・・・。 実際に気持ち悪いと思います。 PerlやJAVAScriptとかは全部文字列→関数で呼んでいますが、VBはスクリプトではないですし。 >全体的なソースの公開がないと じつは、まだUMLもどきで設計段階で、実際のソースはぜんぜん書いていません。 しかし、Variant型とListBox型の変数を用意して、ループの中でそれぞれのメンバにアクセスするコードを書いてみると、明らかな違いは現れます。 Dim x As ListBox, y, n as long, t As String Set x = Form1.List1 Set y = Form1.List1 For n = 0 To 100000 t = x.List(0) Next For n = 0 To 100000 t = y.List(0) Next

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

>NetApiBufferSend は使用したことがない事と、文献が周りに無いのでコメントできませんが。。。 それとCallByName関数も初めて知りました。 しかしCallByName関数の必要性がよくわかっておりません。 ちなみに私の場合は、他のプロセスのコントロールはほとんどAPIで制御します。 以下の定数をSendMessage関数で使用すると、リストボックス構造持ったオブジェクトの属性設定/取得が可能です。 LB_GETCOUNT         'ListCountの取得 LB_SELECTSTRING       'ListIndexの指定 LB_GETTEXTLENとLB_GETTEXT  'テキスト取得 LB_RESETCONTENT       'Clear LB_GETCURSEL        'ListIndexの取得 他にリストボックスのハンドルを取得さえできれば、必要なことはできると思います。 他のプロセスとの連携を図るなら、DDE通信やWinSockを使用した通信もあると思うのですが。。。 もしくは、本体のフォームにコマンドボタン二つ用意(成功/失敗)を用意しておいて、NetApiBufferSendを使用している方から、終了するたびにボタンを押してもらうとか? Sock通信 http://oshiete1.goo.ne.jp/kotaeru.php3?q=155606 DDE通信 http://oshiete1.goo.ne.jp/kotaeru.php3?q=233790 別プロセスのコマンドボタンを押す http://oshiete1.goo.ne.jp/kotaeru.php3?q=199357

haporun
質問者

お礼

何度もアドバイスありがとうございます。 NetApiBufferSendはDOS窓でnet send ユーザー名 メッセージとやるのと同じ関数です。 CallByName関数は、実行時に呼び出すメンバを決定できる関数で、ユーザーが呼び出すクラスのメンバを指定できたりします。 関数をハッシュで呼び出してるようなものです。 これはVariant型やObject型、Control型にオブジェクトの参照が入っているとき、そのメンバにアクセスするときに暗黙に使われているはずです。 通常は関数はポインタを使って呼び出されるでしょうが、これを使うと文字列からハッシュなどで対応している関数を探さなければならず、多用したときのオーバーヘッドが気になるのです。 WinSockでの通信は考えましたが、やはりオブジェクト指向言語ですし、遠回りなのでこの方針は変えたくないです。 >本体のフォームにコマンドボタン二つ用意・・・ net send通信を別スレッドでバックグラウンドにやってもらいたいので、これは目的にかなっていません。 APIはある程度使いますが、できればVB内部の仕様で行きたいです。 特に構造体+APIの使用は、コード量増加につながりますし。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

>時間のかかるAPI とは? もしかしてSendMessageで行っているからとか? PostMessageで送ることで回避というわけにはいきませんか? それと調査した結果を述べます。推測部分が多いのですが、勘弁してください。 ウォッチウインドウで表示される型は、あくまで型です。 だからといって、その型にセットできるわけではないようです。 もし Dim Cast As ListBox と宣言して、この変数に別プロセスのリストボックスをセットできるとしたら、 WithEvents Cast As ListBox でもセットできることになります。 そうなると、別プロセスのリストボックスのイベントを拾うことができることになります。 おそらく、VBがそのようなことをサポートしていないので、コントロールの型での宣言ができないのではないでしょうか? 別プロセスのリストボックスだから、派生させた元が違うということが大きく影響します。 VB内部では、派生させた瞬間にプロセス監視を行っているはずです。同一プロセス内では、WithEventsでのコントロール型の変数にセットしたら、そのプロセス監視を新たに起こすのではなく、使いまわしていると思います。 別プロセスだと、そこまで融通が利かないと思います。 ただし、受けをVariantにしていると、構造とメモリエリアを取得します。その構造がVBのリストボックスなので、TypeNameはきちんと表示されるのだと思います。 そのリストボックスのリストインデックスや、リストの値、リスト件数などはプロセス監視をしなくてもできる部分なので、問題なくリストを操作することができるものだと思います。 イベントを取得できないVBのオブジェクトを、コントロールの型の変数にセットするのは、皆無かと思います。 それと気になったので・・・ クラスファイルのメンバにあっても、通常は問題ないです。

haporun
質問者

お礼

>もしかしてSendMessageで行っているからとか? 違います。 NetApiBufferSendです。 ネットワークでNETBIOS over TCP/IPを使うようになってから、NetApiNameAdd/Delも含めて、これらのAPIの同時使用をすると、関数が必ず失敗するという症状があらわれるようになったため、これらの関数をシングルスレッドに任せることになったのです。 かといって1つ1つの関数が終了するまで2秒間など止まられては、ユーザーインターフェースは機能しなくなってしまいますから。 >そうなると、別プロセスのリストボックスのイベントを拾うことができることになります。 Variant型のままアクセスしたりはできるんです。 Variant型のままアクセスすると、CallByName関数が暗黙のうちに使われると思うのですが、これだと実行時に関数名、プロパティ名の解決が行われるので、何度も使う場合オーバーヘッドが気になるのです。 べつにリストボックスのイベントがほしいわけではありません。 リストボックスのプロパティとメソッドにアクセスしたいだけなのです。 そのたびに名前解決を行っているのは、ちょっと問題があると思ったので。 >受けをVariantにしていると、構造とメモリエリアを取得します Variant型だから別プロセスのメモリ位置まで同時に保持しているというのは理解しました。 まぁ、別プロセスのメモリ内容にアクセスしているということ自体、今回驚きなんですが。

  • Ulrika
  • ベストアンサー率45% (59/129)
回答No.3

#1です。 コントロールは普通フォームオブジェクトの下のオブジェクトとして使うもの、ということで クラスのメンバに持っていても表示されないのだと思います(ということに今気がついた)。 時間がかかるAPIを呼んだ時の処理ということであれば、もう1つ別の監視&巡回型の Exeを噛ませてもいいかも。その中にタイマーを仕込んでおいて、一定時間ごとに 処理が終わったかどうか見に行くのは? Public WithEvents aaa As Timer ←こんなので宣言。 DoEventでとりあえず次を処理してて、APIが終わったらイベントを発生させるような。 質問にあるリストボックスを受取ってやりたいこととは違うかもしれませんが…。

haporun
質問者

お礼

返事が遅くなってすみません。 >もう1つ別の監視&巡回型のExeを噛ませてもいいかも すでにそのとおりです。 別の監視EXEがActiveX EXEなのです。 そこでAPIを読んでAPIから制御が返ってきたら、受け取っているListBoxに対して、処理を行います。 WithEventsははじめて知りました。 試してみますが、タイマーはもうできるだけユーザーインターフェースを含むスレッドで使うと、イベントが発生した時にIME入力などがキャンセルされてしまうので、できるだけ使いたくないです。

  • Ulrika
  • ベストアンサー率45% (59/129)
回答No.1

こんにちは。 Public Sub Moge(lst) と宣言しているのを Public Sub Moge(lst as ListBox) とやってもダメですか? 呼ぶ方と呼ばれる方の宣言が同じでないとうまく参照できなかったような記憶があります。 ListBoxがControlという宣言と見なされて受取っているからSetできないのではないかと。

haporun
質問者

お礼

そうすると、Mogeを呼び出す時点で型が違うといわれてしまいます。

関連するQ&A

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • エクセルVBAでのwitheventsについて

    お世話になります。 エクセルVBAでクラス側で ListBoxにたいしてwitheventsは使用 できないのでしょうか? Private WithEvents lst As ListBox Public Sub Class_Initializa() Set lst = UserForm1.ListBox1 End Sub 上記コーディングで実行時に 「オブジェクトはオートメーションイベントを 発生させることができません」 になります。 クラス側でダブルクリックイベントを拾いたいのですが。 宜しくお願い致します。

  • 標準モジュールからフォームをコントロールしたい

    こんにちは。 標準モジュールからフォームのリストボックスに文字を追加したいんですが、うまくいきません。 まず、button1をクリックすると、共通モジュールのサブルーチンを呼び出します。そして引数"0"を渡すと、Form1のListBox1に"hello"を追加したいのです。 実行させると、エラーはでないのですが、追加されるはずの"hello"がListBox1に追加されません。 たぶん     frm1.ListBox1.Items.Add("hello") あるいは    Dim frm1 As New Form1() あたりの宣言の仕方がまずいのだと思うんですが... どなたか、ご教授よろしくお願いします。 ■共通モジュール Module Module1 Dim frm1 As New Form1() Sub PC(ByVal PCrecieve As String) If PCrecieve = "0" Then frm1.ListBox1.Items.Add("hello") End If End Sub End Module ■フォーム Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call PC("0") End Sub End Class

  • リストのダブルクリックイベントをフォーム起動時に発

    アクセス2010です。 Private Sub Form_Load() Call lst_test_DblClick End Sub Private Sub lst_test_DblClick(Cancel As Integer) MsgBox "" End Sub このような事は出来ないのでしょうか? リストのダブルクリックイベントをフォーム起動時に発動したいのですが このコードを書くと Call lst_test_DblClick の部分で引数を省略できません。 になります。 どちらもフォームモジュールに書いています。

  • ListBox内の並び替えで実行エラー

    OSはXP、 Excelは2003を使用しています。 ユーザーフォーム内のListBox内で、コマンドボタンをクリックして行を上や下に並び替えたく、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1041407835 を参考にして、下記の通りに組んだのですが、 下に並び替えるCommandButton2を実行時や、 上に並び替えるCommandButton1を「2回目」に実行時に 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 となってしまいます。 Private Sub CommandButton1_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ上げる。 i = Me.ListBox1.ListIndex If i > 0 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i - 1, j) Me.ListBox1.List(i - 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i - 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i - 1, k) Me.ListBox2.List(i - 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i - 1) = True Next k Next j End If End Sub Private Sub CommandButton2_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ下げる。 i = Me.ListBox1.ListIndex If i < Me.ListBox1.ListCount - 1 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i + 1, j) Me.ListBox1.List(i + 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i + 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i + 1, k) Me.ListBox2.List(i + 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i + 1) = True Next k Next j End If End Sub 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

  • 配列の参照渡しで型が一致しません。

    エクセル2003です。 いつもお世話になります。 以下のコードを実行すると「配列の型が一致しません。」というエラーが出ます。 typeNameで確認しても配列の型はvariant()で正しいと思うのですが。。。 皆様のお知恵を拝借させていただけないでしょうか。 -------------------------------------- Sub main() Dim e As Variant e = fuN() Call pRo(e)  '←ここでエラーになる。 End Sub Function fuN() As Variant Dim a(0) As Variant a(0) = "zero" fuN = a End Function Sub pRo(ByRef c() As Variant) '処理っす End Sub --------------------------------------

  • オブジェクト型の変数にフォームを入れて操作した

    オブジェクト型の変数にフォームを入れて操作したいのですが Sub アクセス() Dim F As Form Set F = "フォーム1" End Sub 以下省略 フォーム1の部分が 「型が一致しません」と言うエラーになりまず。 どこが間違ってるのでしょうか?

  • ボタンをクリックしても空白をリストに追加しないようにしたい

    初心者ですのでよろしくお願いいたします。 以下のようなコードでボタンを押すとテキストボックスに入力してあるテキストをリストに登録したいのですが、空白の場合は追加したくありません。どのように書けばいいでしょうか? よろしくお願いいたします。 (ちなみにLabel3にはリストに登録された数が出ます) Public Class Form1 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ListBox1.Items.Add(TextBox1.Text) TextBox1.Clear() Label3.Text = ListBox1.Items.Count End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ListBox1.Items.Remove(ListBox1.SelectedItem) Label3.Text = ListBox1.Items.Count End Sub End Class

  • ActiveXコントロールでフォームを参照するには?

    VB6SP5を使用してActiveXコントロールを勉強中です。 ActiveXコントロールを作成(OCX化)して、そのコントロールを別のプロジェクトのフォームで使用しようと思っています。 このコントロールの機能は、使用するフォーム上の「ラベル」や「テキストBOX」の情報(Caption、サイズ、位置、色 etc...)を取得して、いろいろと処理を行いたいのですが、取得方法がわかりません。 一応、次のようにコントロールのメソッドの引数でフォームを受け取ろうとしたのですが、下記のコンパイルエラーが出てダメでした。  Public Sub ABC( ByRef frmMain As Form )    :  End Sub --- コンパイルエラー!! -------------------------------------------  "プライベート オブジェクトモジュールを、  パブリック オブジェクトモジュール内で、  パブリック プロシージャの引数または戻り値、  パブリック データメンバ、またはパブリックのユーザー定義型のフィールドとして、  使用することはできません。" ------------------------------------------------------------------ ところが、"As Form" を "As Object" にすると、上手くいきました。  Public Sub ABC( ByRef frmMain As Object )    :  End Sub この違いは何なんでしょうか? この使い方は正しいのでしょうか? もし、別の方法があれば、教えて下さい。

  • メソッド(Object... params)

    ■環境 Android(Java) ■前提 HogeClass hoge = new HogeClass(); hoge.execute();  public class HogeClass extends AsyncTask<Object, Integer, List<Item>> {   @Override   protected List<Item> doInBackground(Object... params) { ・引数の「...」初めて見ました ・調べたら、可変長引数、と書いていました ■質問1 ・「...右のparams」は、ユーザーが任意でつけて良い文字列でしょうか? ■質問2 ・executeで引数指定していないので、doInBackgroundには引数は渡っていない、と考えて良いでしょうか? ■質問3 ・executeで引数指定していないのにdoInBackgroundで可変長引数対応している理由は、このメソッド元である抽象メソッド「doInBackground (Params... params)」が可変長引数形式になっているためでしょうか? http://developer.android.com/reference/android/os/AsyncTask.html#doInBackground(Params...) ■質問4 ・この場合の「AsyncTask<Object」は何をしているのでしょうか? ・可変長引数で、0個以上の引数を受け付ける際、その型がObjectであることを保障しているだけでしょうか? ・つまり、絶対にObject型の引数を渡すなら、この記述は省略しても良いのでしょうか? ■質問5 ・ジェネリクスの使い所について ・型を絶対に保障したい時ってどんなときでしょうか? ・基本的にどんな時でも型は保障した方が良いと思うのですが、そうするとジェネリクスだらけにならない?

    • ベストアンサー
    • Java

専門家に質問してみよう