ここから質問投稿すると、最大4000ポイント当たる!!!! >>

自作のユーザーコントロールをフォームに貼り付け、
それをクラスに渡してクラス内でそのコントロールのVisibleを制御しようとしておりますが、

フォームからコントロールのVisibleプロパティにアクセスできますが、
クラスからだと、
メソッドまたはデータメンバが見つかりません
とコンパイルエラーが出ます。

そこで、コントロールをControlやUserControlにキャストしてみましたが
型が一致しません
というエラーとなってしまいます。

コントロールにVisibleプロパティの追加を試みましたが、
ActiveXコントロールインタフェースウィザードの使用できる名前に於いて
それらのプロパティが列挙されません。

対象がユーザーコントロールでなく、ボタンなどの標準コントロールの場合は
できたのですが・・・

なにか方法をご存知でしたらご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Visibleプロパティを管理しているのがコンテナ側だからですよ


FormやPictureBoxはコンテナになりますのでフォームにはったUserControlの場合はVisibleプロパティが操作可能です

クラスに渡した UserControlですとこのコンテナが提供するExtenderプロパティを直接操作することが出来ないのではと思います


UserControlにVisibleを操作するプロパティを追加してみましょう

private bVisible as Boolean
Public Property Let MyVisible(value as Boolean)
  bVisible = value
  ' Extenderを通してVisibleを操作
  Extender.Visible = value
  PropertyChanged "MyVisible"
End Property

Public Property Get MyVisible() as Boolean
  MyVisible = bVisible
End Property

Private Sub UserControl_InitProperties()
  ' プロパティの初期化
  bVisible = Extender.Visible
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  bVisible = PropBag.ReadProperty("MyVisible", Extender.Visible)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  PropBag.WriteProperty "MyVisible", bVisible, Extender.Visible
End Sub
といった具合のコードを追加しておきます

クラス側では
obj.MyVisible = True
または
obj.MyVisible = False
といった具合で操作してみましょう
    • good
    • 0
この回答へのお礼

できました!!!

Extenderプロパティが要点なんですね。
どういうものかいまいちわかっていませんが。

とにかく、これを使ってActiveXコントロールインタフェースウィザードなんか気にせず無理やり実装しちゃえばよさそうですね。

実をいいますとVisible以外にもWidthとかHeightとか必要で結構面倒です(涙)。


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

お礼日時:2010/12/21 17:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QProperty Letについて

このようなステートメントがたくさんあります。
これはいったい何をしているのでしょうか?
Property Get と Property Setについても同様に分りません。
どなたか教えていただけないでしょうか。

Aベストアンサー

理解困難ですか?

些細な事でも、わからなかったら遠慮なく聞いてくださいね。

Property関係を熟知するVBプログラマは、ぼくの周りにも少ないです。
流れがわかっていても、どうやったら効果的/有効的になるかがわかってないのです。だから、そういう人はPropertyを使用しようともしません。
むやみやたらにPropertyを使用するのはお奨めしないけど、たくさんのサンプルプログラムを作成し、慣れない関数を多用し、研究する努力が必要だと思います。
Propertyを使用しなくても済む部分をPropertyを使用してみるとかするのもいいと思います。
作成した後、本当にPropertyは必要なのか、Propertyを使用することによって、プログラミング的に効果的であったかなどの検証をして学ぶと、より早く身に着くと思います。


むずかしい分野ですが、がんばってくださいね。

QVB.NETでActiveX(OCXファイル)作成

VB6のプロジェクトファイルで作成したOCXファイルがございます。これをVB.NETに移行したいの
ですが、アップグレードウィザードを使用しても同様のOCXファイルは作成できますか?
また、プロジェクトを新規作成する方法を教えていただけませんか?

宜しくお願い致します。

Aベストアンサー

>> .Netは.NET Frameworkのバージョンごどにテストが必要になります。
>> なので、C++でActiveXコントロール(OCXファイル)を作成することを検討します。
>> C++はActiveXコントロールのサポートをしているのは何故ですか?

単純に殆どの言語を.NET上で動くように改変したため、
C++以外ではネイティブなプログラムを作成できなくなったから、
自然にそうなったのだと思います。

逆に言えば通常のC++が、現在のVSに実装されていることの方が異色で、
互換性のために残されている物だという認識です。

>> また、VB6→C++のコード変換ツールがございましたら、教えていただけませんか?
こちらについては分かりません。

仮に存在していたとしても、VBとVC++ではメモリの管理方法が全く異なりますので、
両方の言語を扱える人間が作業するべきだと思います。

QVB6.0でのOCX・DLLの作り方

VB6.0でのOCX・DLLの作り方を
詳しくご存知の方
もしくは
HP等ご存知の方
教えてくださいませんか?
よろしくお願いいたします。

Aベストアンサー

↓ こちらのサイト等はいかがかな !? ↓(^o^)丿

参考URL:http://hp.vector.co.jp/authors/VA014162/hitch/ActiveX/activex.htm

QVB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?

VB6.0で、例:StrConv(Text, vbFromUnicode)とかで使用する、
「vbFromUnicode」(文字列を Unicode からシステムの既定のコードページに変換する)
は、VB.NETでは使用できないようです。(相当する定数はない?)

「vbFromUnicode」と同等の機能を、VB.NETで使用したいのですが、
どうすれば良いでしょうか?

Aベストアンサー

思いっきり、例文に「COM1」と書いてますが、USBに書き換えてくださいね^^;

それとふと思ったのですが
udtReaderWriterModeWithoutEncryption
変数は構造体ですよね?

メンバが
lngPortName
lngBardRate
というのは、型宣言をINTEGERに変換してますよね?

ちょっとばかり不安に思ったので、追記しておきました。

参考URL:http://okweb.jp/kotaeru.php3?q=1257613

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

QActiveX DLL と ActiveXコントロールの違い

VB6で開発をしています。
複数のEXEファイルを使用するシステムです。
各EXEファイルの共通のモジュールをライブラリ化しようと思っています。

これは [ActiveX DLL] 又は、[ActiveXコントロール] のどちらでも実現できると思うんですが、どちらで作成した方が良いのでしょうか?

それぞれのメリット、デミリットを教えて下さい。

Aベストアンサー

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定義)を
As Object
として、CreateObject("DLL定義")のように行うと、引数が一緒ならEXEはリコンパイルしないでもいいです。実例として、エクセルを参照設定して[as Excel]と宣言していたら、その参照設定に対応したExcelしか操作できませんが、[As Object]と[CreateObject("Excel.Application")]とすると、EXCEL95~XPまで扱えます。
不便なのは、タイプライブラリが未設定になるので、Excelの各プロパティ/メソッドを知らないといけないし、Excel固有の定数が宣言もされてないので、自分で定数値を調べなければいけません。でもバージョンの違いを気にしないでいけるのは、非常に便利です。


速さのことを言ったら、当然DLLが早いです。
OCXはプロパティにRight/Leftなどを持っています。変えて言うと実体を持っていると言うことです。非表示にしていても実体をもっています。DLLはインスタンスは生成されますが、OCXだって生成されるので、表示しないで使用するなら、OCXの意味があまりありません。


んで、私(個人)の考えとしては、、、
※オリジナルボタンなどの、画面上必要ならOCX
  理由:画面に必要だから
※画面に表示を行う必要がなくても、配布する気ならOCX
  理由:配布先のユーザが扱いやすい
※そうじゃなければDLL
  理由:OCXにする理由が見つからないから


余談です。
私はいつもCommonコントロールは使用しません。
  理由:簡単なAPIでも実現できるのに、機能が少ないCommonコントロールを追加して、EXEの容量を大きくしたくないから

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定...続きを読む

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

QVB6 ClassにてEnum(列挙型)のうまい使い方

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをしているわけですが、
Class(Dll)とExeは別プロジェクトで生成しており、
Dllはバイナリ変換、デバッグはExeを実行するように設定済です。
これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。

Exeのプロジェクトから、
「開始」・ステップ実行して確認しましたが、
正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で)

ActiveXDLLプロジェクトから、
「開始」後、「停止」をして、Dllを上書きしようとすると、
「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、
Msgboxが表示されてしまいます。
どうやらExeがDLLを離していないのでしょうか?
もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。
(他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。)


困っている点としては、
1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。
(DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも)

2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。

3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト

です。


いろいろとツッコミどころがあるかもしれませんが、
忌憚なくご意見下さい。


---Class-(test_Class)----
'列挙宣言
Public Enum Chiiki
Hokkaidou = 0
Aomori = 1
Akita = 2
End Enum

'プロパティ値を格納しておく変数
dim aaa as integer

'プロパティでEnum宣言した型を引数に指定します、
Public Property Get Shusshin() As Chiiki
Shusshin = aaa
End Property
Public Property Let WindowState(ByVal NewValue As Chiki)
aaa = NewValue
End Property
---Class-End--------------------

---Exe-----------------
'Classは参照設定にて
'参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢?

Sub a
'Class宣言
Dim a_class as test_Class
Set a_class = New test_Class

'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン
a_class.WindowState = Aomori

'プロパティ値表示(処理自体に意味無し)
'「1」 と表示される
Msgbox a_class.WindowState

'Class開放
Set a_class = nothing

End sub
---Exe-End----

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをし...続きを読む

Aベストアンサー

VB6が DLLを離していないためですよ
VB6のインスタンスが2つある状態なのですよね
VB6-ActiveXとVB6-TextExeが起動している状態で
VB6-TestEXEが参照設定のため DLLをつかみっぱなしになっています
DLLが開発途上なら プロジェクトグループで開発したほうが良いと思います
DLLプロジェクトとテスト用EXEプロジェクトを1つのグループにして開発orデバッグします

どちらでも良いですからプロジェクトを開いて
ファイル > プロジェクトの追加 で他方のプロジェクトを追加します
テスト用EXEプロジェクトに参照設定をして開発します

DLL側の修正はそのままコードウィンドウを開いて編集します
DLLファイルの作成し直しは
プロジェクトウィンドウで DLLプロジェクトをアクティブにして
ファイルメニューからDLL作成をします

テストEXEのデバッグには プロジェクトウィンドウでEXEプロジェクトをアクティブにしてからデバッグ実行などをします

Qオブジェクト(dll)のレジストリ登録について

いつもお世話になっております。

dllの使い方について教えてください。

vb5.0で開発を進めているのですが、
dllを呼び出す際に、レジストリ登録を
しなければいけないのでしょうか?

いくつかのサイトでは、参照設定際すれば、
実行できているようです。。

実行環境では、レジストリ登録しないと
動かない場合があるということでしょうか?

ご教授、よろしくお願いします。

Aベストアンサー

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「Successful」と出ればActiveX DLLだ。エントリポイントが見つかりません云々と言われたらそれはWin32ネイティブDLLという事。登録に失敗して環境を壊すという事はないのでとりあえず登録を試みてみれば良いのではないかな。

現在では大きく分けてDLLは3つある。
・Win32ネイティブDLL:レジストリ登録不要。パスの通った所に配置する。
・ActiveX DLL:レジストリ情報によって呼び出すDLL。レジストリに登録する。インプロセスCOMサーバと言っても差し支えないかもしれないがあるかもしれない。
・Microsoft .Net アセンブリ:レジストリの登録は不要。単純に実行ファイルと同じパスに配置するか、.Netにおけるレジストリといえるグローバルアセンブリキャッシュに登録する。

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「S...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング