トップページ⇒tech
1001コメント353KB

VBプログラマ質問スレ(6.0以前) Part33

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VB(6.0以前)の質問スレです。
VB.NETの話題はできるだけひかえてください。

前スレはこちら
(pc2サーバ壊滅で見れない。pc2をpc5に変えれば見れる。
過去ログの場所がどうなるのか良く分からんので次スレ立てる人修正よろ)
  Part25 http://pc2.2ch.net/tech/kako/1052/10526/1052627913.html
  Part26 http://pc2.2ch.net/tech/kako/1055/10551/1055145106.html
  Part27 http://pc2.2ch.net/tech/kako/1058/10586/1058674927.html
  Part28 http://pc2.2ch.net/tech/kako/1061/10612/1061296197.html
  Part29 http://pc2.2ch.net/tech/kako/1065/10654/1065446334.html
  Part30 http://pc2.2ch.net/test/read.cgi/tech/1069160036/
  Part31 http://pc2.2ch.net/test/read.cgi/tech/1073732636/
  Part32 http://pc5.2ch.net/test/read.cgi/tech/1077216109/


【VB.net関連スレ】
VB.net質問スレ (Part5)
http://pc5.2ch.net/test/read.cgi/tech/1078134703/
【Win32 API関連スレ】
Win32API質問箱 Build17
http://pc5.2ch.net/test/read.cgi/tech/1077470361/

心得
壱.質問する前に過去ログにも目を通してみる。
弐.質問する前に MSDN などで調べてみる。
参.VBScript もこのスレでOK。
四.インストーラーなどの質問もOK。
五.荒らしは相手しない。
六. VB情報募集中。
七.VB.NETの話題できるだけひかえる。
0153デフォルトの名無しさんNGNG
ttp://bookweb2.kinokuniya.co.jp/htm/4881354922.html
Visual Basicゲームプログラミング―Visual Basicで創るArtistic Game World

なんですが、DirextXを使ったものでしょうか?それとも初期のbitdrawのものでしょうか?
VB4のときに出たらしいのですが個人的には、ビットマップ作画だったらありがたいのですが。

この本を持っていらしてる方、ちょっと内容を教えてください。
通販しようかと思っているのですが。
0154デフォルトの名無しさんNGNG
VB4の時代には、DirectXはVBから使えなかったような気がする。
読んだことないけど、多分DirectXは使ってないんじゃないか。
0155デフォルトの名無しさんNGNG
>>152
ActiveReportって何?どこでダウンロードできるの?
0156デフォルトの名無しさんNGNG
>>153
VBからDirectXを扱えますが、きっとWinGでしょう
0157デフォルトの名無しさんNGNG
>>154
>>156

情報ありがとうございます!
使ってないだろうと言うことが分かって嬉しいです
検索してみたのですが、目次が載って無くて。当時だったらあったかもしれません。
個人的にはVBでビットマップ作画のいい参考書を探しているのですが。
(PDAで作ってるため VBに近い言語です)

親切にしていただけて嬉しく思います。ありがとう
0158デフォルトの名無しさんNGNG
>>152

外しているかもしれないが
二つ用意しておいて Visible の切替えってのはだめ?



0159デフォルトの名無しさんNGNG
>>150
有り難う御座いました。
0160デフォルトの名無しさんNGNG
private sub combo1_change()
this.text = "hoge"
end sub

みたいにそのイベントのコントロール、つまり自分自身を
指すthisみたいなのないですか?
0161デフォルトの名無しさんNGNG
デバッグ用にテキストを出力したいのですが、
現在実行中のファイル名と関数名って取得できないのでしょうか?
Cでいうところの__FILE__、__LINE__ みたなのが使いたいです
ご教示願います。
0162デフォルトの名無しさんNGNG
sSource = "http://xxx.xxx.xxx/index.html"

例えばこの文字列を例にとりますと
この文字列から"index"の部分と".html"の部分を抜き出すには
どうしたら良いでしょうか?
0163161NGNG
また、できれば現在のクラスモジュール名を得ることはできないのでしょうか?
0164デフォルトの名無しさんNGNG
>>162
a=split(sSource,"/") ' / で分解
b=split(a(ubound(a)),".") '.で分解

これで b(0) に "index" が b(1) に "html" が入る。
0165161NGNG
>>163
はわかりました。
TypeName(Me)
0166デフォルトの名無しさんNGNG
>>160
特定のスコープの中では、宣言されてもいない
暗黙のローカル変数が存在するような言語怖くて使えますかって。

>>162
そんなのヘルプ検索すればすぐわかるはず。
逆にいうとヘルプみても解決法がわかんないならプログラミングなんて
やめといた方が身のためと思う。

雑誌のおまけの試用版とか使ってるのならしょうがないけど、それなら
参考書ぐらい買えばいいのに。

InStrとかMid$とか、VB6ならSplitとか、使えそうな関数いっぱいあるじゃん。
0167デフォルトの名無しさんNGNG
>特定のスコープの中では、宣言されてもいない
>暗黙のローカル変数が存在するような言語怖くて使えますかって。

schemeのlambdaなんかはどうよ?ちょっと違うか。

というか話が違うんじゃない。
イベントを発生させたオブジェクトをsourceとかでイベントの引数に渡してくれたら
便利なケースは考えられると思うし、俺もあったらうれしいことはあるとは思う。
160への解答としては、そんなことはできないってことになる。
Combo1_Clickというプロシージャ名にイベント発生源のオブジェクト名が入っていて
ユニークになってるから、Combo1.Text="Hoge"で別に問題は無い。
何で困っているのかもう少し具体的に書いてもらえれば、なにか代替案を示すことはできるかもしれないが。
0168160NGNG
private sub combo1_change()
call hoge(me.activecontrol)
end sub

private sub combo2_change()
call hoge(me.activecontrol)
end sub

みたいなことがしたいんですが
me.activecontrol=そのイベントを呼び出したコントロール
でいいのでしょうか?
0169デフォルトの名無しさんNGNG
>>168
ActiveControlはフォーカスを持っているコントロール。
普通はイベントを起こすのはフォーカスを持っているコントロールだけど例外もあるから。
0170160NGNG
>>169
ですよねー
やっぱだめかな
0171デフォルトの名無しさんNGNG
>>170
コントロールをユーザコントロール(やクラス)でラップして、
イベントをユーザコントロール側で受けてそこでイベントを処理する方法もある。

もし違う処理を行いたければイベントの処理はイベントの処理を行うクラスを
ユーザコントロールに登録して行うという、Java風の仕組みを作れば
望みのことが出来なくは無い。

まあ一番手軽なのはコントロール配列にしてインデックスで区別する方法だけど。
0172デフォルトの名無しさんNGNG
現在グリッドを持つアプリケーションを作ろうと考えております。
コンポーネントを見ていると、いくつかグリッドが存在するのです、
それぞれの特徴があると思いますが、どれが使いやすいのでしょうか?

それぞれの機能を紹介したサイト等はないでしょうか?

0173デフォルトの名無しさんNGNG
>>172
そんなことをこんなところで聞くような横着な人に
グリッド系のコントロールなんて使いこなせないと思う。

簡単なことならどれ使ったって大差ないし。
0174デフォルトの名無しさんNGNG
グリッド系は重い
0175デフォルトの名無しさんNGNG
>>172
 使いやすさは人によって違うと思うから
 試用版とかまず試してみたら?
0176デフォルトの名無しさんNGNG
DataGridよりはMSFlexGridの方が好きだな
0177デフォルトの名無しさんNGNG
非常に基礎的な質問で恐縮なのですが宜しくお願いします。

フォーム1からフォーム2に設置してある
オプションボタンのValue値のTrue・Falseを読み取りたいのですが、
どうしたらいいでしょうか?

フォーム2内でグローバル変数を宣言してそれに値を格納してフォーム1で読み出す。
という方法は思いついたのですが、できれば直接読み取りたいです。
0178デフォルトの名無しさんNGNG
>>177
vb6以前ってコントロールは全部Publicじゃなかったっけ?
......って言ってもたぶんわからないんだよね。

上のコードエディタで"form2."って打ってみて。
インテリセンス働くと思うんだけど。
0179デフォルトの名無しさんNGNG
直接読み取りたいのなら直接読み取ればいいじゃない
0180178NGNG
「上の」って言葉は不要でした
0181デフォルトの名無しさんNGNG
Form2!Option1.Value
0182デフォルトの名無しさんNGNG
>>178-181さん
返信ありがとうございます。

コードエディタ上で form2 と打ち込んで実行するとエラーはでるのですが
インテリセンス(文法チェックですよね?)は働かないようです。

今まで
Form.Option1.Value と書いていたのを
Form!Option1.Value としてみたのですが
やはりForm2を閉じるとValueの値が真に戻ってForm1から真・偽を読み取る事ができません。
0183デフォルトの名無しさんNGNG
訂正

Form2.Option1.Value と書いていたのを
Form2!Option1.Value としてみたのですが

です。2が抜けていました…すいません。
0184デフォルトの名無しさんNGNG
えっ!閉じたform2の値を読もうとしてるの?
0185デフォルトの名無しさんNGNG
Form2閉じるときUnloadしてるんじゃないか?
で、Option1.Valueにアクセスしに行ったときに再度ロードされて、初期状態の
やつを参照してるとか。
今進んでいる所は、たぶん鬼門だろうから、初心者本でも読み返したほうが
いいかもしれんね。
0186デフォルトの名無しさんNGNG
定義されていない変数を読み取れないと言ってるようなもんでつね。
0187デフォルトの名無しさんNGNG
>>184
はい、その通りです。

>>185
その通りです。Unloadしております。
鬼門ですか…。初心者本を読んで調べたのですがよくわからないのです(汗
0188デフォルトの名無しさんNGNG
Property Getとかを使おうね。クラスのインターフェイスになるよ。
(Formモジュール)=(Classモジュール+Window)を理解しようね。

C++やJavaとかでいう他クラスとのやり取りに、Publicなインターフェイス用関数を使って、Privateな変数にアクセスする要領と同じ。
0189デフォルトの名無しさんNGNG
>>187
'Form1のコード
Dim Result As Boolean
Load Form2
Form2.Show vbModal ,Me
Result = Form2.Option1.Value
Unload Form2

'Form2のコード。OKボタンにでも書いといて
Me.Visible = False

Load,Unload,New,Nothingについて調べてみるといいよ。
0190デフォルトの名無しさんNGNG
上手く言えないんですが、フォームモジュール、標準モジュール、
クラスモジュールの使い分けと言うか、コードの書き分けって、どう
言う指針で行うのがいいんでしょうか?
0191デフォルトの名無しさんNGNG
ていうかもう釣り確定じゃん。なにマジレスしてんのみんなオボコいな。
しかしこの「別のフォームの......」って愚問は定期的に湧いてくるな。
次スレからは1のテンプレに入れてほしいよ。
0192187NGNG
>>186、188-189さん
ただいま教えていただいた事について勉強してきます(汗
こんな夜更けにご丁寧にありがとうございました。
0193187NGNG
>>191さん
いえ…釣りではないです。本当にわかってません(汗
ちなみに >>190さん は私ではないです。
0194デフォルトの名無しさんNGNG
本職なひとの辞書に、夜更けという文字はありませんでつ。_| ̄|○
0195190NGNG
>>193
(´・ω・`)ショボーン

0196187NGNG
>>190さん
あれ?何かまずい事書いたかな…(−−;
もし、私の質問だと思われてたら私の質問はもう区切りがついたので、このままスルーされそうだな〜
と思ったのでそう書いたのですが(汗
0197デフォルトの名無しさんNGNG
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
0198デフォルトの名無しさんNGNG
>>190
それぞれ「そうすべきもの」で使い分ける。
ウインドウを表示するならフォームを使うのが常道とかね。


ひょっとして釣られた?
0199デフォルトの名無しさんNGNG
>>191
オマエが釣り確定。あげんじゃねえよカス
0200デフォルトの名無しさんNGNG
>>199
ワラタ
0201デフォルトの名無しさんNGNG
191って臭そうw
0202デフォルトの名無しさんNGNG
とりあえず心得を読め
0203デフォルトの名無しさんNGNG
>>191
>> 「別のフォームの......」って愚問

これをまったく知らないで、
何から何までグローバル変数使ったり、
フォームイベントの発生要因とかまったく知らなかったり
する愚者が多数いるよ。

しかもそういう人に限って、VBだからVBらしくコーディングしているんだ、と意味不明なことを嘯くんだよな。
0204デフォルトの名無しさんNGNG
>>187
混乱させるようで悪いが・・・

'Form1のコード
Dim Result As Boolean
Form2.Show vbModal, Me
Result = Form2.Result

'Form2のコード
'関数の外に
Public Result As Boolean
'OKボタンに
Result = Me.Option1.Value
Unload Me
0205190NGNG
>>198
釣りじゃなかとですよ。

クラスモジュールはクラスを作るために使えばいいと思うのでまだいいのですが、
標準モジュールとフォームモジュールが曖昧になってしまうんですよね。

ぶっちゃげた話、>>198さんのいうとおり、フォーム周りのコードをフォーム
モジュールに書けば、フォームモジュールと標準モジュールを分離して再利用
する事も出来るはずなのですが、標準モジュールでフォームのインスタンスを
生成してフォーム上のコントロールにアクセスしたり、フォームモジュールから標準
モジュール上のパブリックプロシージャ-をコールしたりすると、標準モジュールと
フォームモジュールは独立しなくなる訳で。

かと言ってフォームモジュールに全部書く、ってのは宜しくないそうで、どのように
分ければいいのかなと悩んでしまう訳でして。

用法を間違ってるかも知れないですが、恐らくフォームモジュールと標準
モジュールとの間のインターフェイスが決まってないと言うか曖昧になってるのが
原因じゃないかなと思う(言葉の意味がよくわかってないので違ってるかも知れ
ない)のですが、標準モジュールからフォームのコントロールにアクセスしたい時に、
どのようにやるのがスマートなのかなぁ?

0206デフォルトの名無しさんNGNG
VBはVBらしく適当に作って破綻しそうになったら
思いつきでリファクタリングでもして
つないでいくのがよい
0207190NGNG
>>206
リファクタリングって、確か元の仕様を変えずに中身と言うか実現方法を変更
したり新たな仕様を追加する事でしたっけ? 似たような事はよくありますねぇ。
例えば、最初は独立したコントロールで書いてたけど、結局同じ処理のプロ
シージャ-になっちゃった、って場合にコントロール配列にしてIndexで制御する
方法に書き換えたりとか。(うわ、なんか違うっぽいしレベル低いなぁ俺(´・ω・`) )

最初に仕様をガチガチに決めればそう言う事にはならないのだろうけど、一人
で開発やってると、書いてる途中で、もっといいアイディアや実現方法を思い
ついたりすると書き直しちゃいますしねぇ。
0208デフォルトの名無しさんNGNG
以前に構造体のような宣言内部に定数をもたせたい
という件で質問させていただきました
Enumを使用するといい という回答を頂いていたんですが
この列挙型といわれる宣言内部に数値やアドレスではなく
文字列を持たせる事も可能なのでしょうか?
0209デフォルトの名無しさんNGNG
>205
そもそも、標準モジュールでフォームのコントロールを直接参照する必要があるのかって所から検討すべき。
コントロールを直接参照する事は即ちフォームに依存だからぬ。
そのへんのやり方は>188が指摘してるぞ。

標準モジュール上にForm1.TextBox1 = ・・・
なんて書くのは愚の骨頂。
無難な線として
Public Sub Hoge(ByRef frm As Form1)
みたいな感じで引数でフォームへの参照を受けて以後その引数を利用してアクセスすれば良い。
0210デフォルトの名無しさんNGNG
>>209
そこなんだよね、綺麗にできるかの違いって。
コントロール自身を引数にできるということを知らない人が多すぎ。

それをやるだけで、結構おしゃれな処理とかできるし、
グローバル変数とか馬鹿でかい参照範囲の変数とか、ほぼ撲滅できるし。
0211デフォルトの名無しさんNGNG
>Public Sub Hoge(ByRef frm As Form1)
これってフォームにオモイックソ依存してないか?
Form1ってハードコーディングしちゃってるし。
0212デフォルトの名無しさんNGNG
>>211
それは単なるタイプミスだと思われるけど、重大なバグになるタイプミスだな。
0213デフォルトの名無しさんNGNG
>>205
標準モジュールがあるからVBって気もするけどなぁ
うちの会社の先輩が言ってたけど、
VBは標準モジュールにバリバリ書いて、コントロールを使う形にするのが楽らしい
コントロールを使ってれば標準モジュールもそんなにひどくならないそうな
だから、設計してコントロールつくるやつが上にひとりいて、
それ使ってコーディングする奴が何名かいるのがいいらしい
実際、その人APIとかクラス化して投げてくるんだけど、やりやすいのはたしか
ただ、そういうやりかただと悲しいかな、俺の勉強になんないんだよな(w
0214デフォルトの名無しさんNGNG
>211
>209の趣旨は、引数として受け取るようにする事で、少なくとも暗黙のインスタンスを
参照するという行為は避けられるよ、って事でつ。
インタフェースの使い方覚えるのは次の段階かなと思ったんで。
0215デフォルトの名無しさんNGNG
>>214
引数で受け取るのも「暗黙のインスタンス?」を参照してるってことに
早いとこ気付けよ。
VB6.0ではオブジェクトの解放がどの時点で行われるか知ってっか?
0216デフォルトの名無しさんNGNG
スレの流れ理解してなくて申し訳ありません。
皆様の知恵を拝借したいと思って来ました。

テーブル1のフィールドAの値に対してテーブル2のフィールドBの付随情報を
抽出したいと思っています。双方のフィールドは0から始まる電話番号形式の文字列です。

フィールドAには正式な電話番号(09012345678とします)が格納されており
フィールドBには電話番号の範囲になるような4桁以上11桁以下のデータが格納されています。
例えば「09012」のようなデータです。

フィールドBのデータをDBから抽出後に降順でソートし、フィールドAのデータの
先頭数文字(フィールドBの文字数)を検索条件とし、最初に合致したものに対するデータを
さらに抽出したいと思っています(例えばCSV形式のファイル等に)

長すぎると怒られたので分けます。
0217デフォルトの名無しさんNGNG
以下は例です

例→フィールドAの格納データ「09012345678」に合致するフィールドBの付随データを抽出

フィールドB   データ
0902    付随データ  この場合「0902」と「0901」2345678で比較→合致しないので次へ
09013   付随データ  この場合「09013」と「09012」345678で比較→合致しないので次へ
09012   付随データ  この場合「09012」と「09012」345678で比較→合致するので抽出
09011   付随データ

合致するデータがない場合はエラー処理になります。
フィールドAのデータ分だけ抽出処理をして終了という形です。
ただしフィールドBのデータの桁数は一定しておらず4桁の場合もあれば
5桁の場合もあるという感じになっております。
こういった処理を行なう場合、どのような感じで作ればよいのでしょうか…。

フィールドBのデータを毎回Len関数でチェックしてフィールドAのデータをLen関数で
返ってきた値だけ切り出してチェックとかがいいんでしょうか…。

VB6.0、DBはOracleでADO接続でやるつもりです。
VBから離れて期間も経っており、ほとほと困り果ててこちらに参りました。
詳しい方いらっしゃったら宜しくお願いします。スレ違いでしたら申し訳ありません。
0218209NGNG
>215
>209の引数frmはあくまで呼び元から渡されたインスタンスを参照するのであって、
暗黙のインスタンスを参照する訳では無いと思うのだが・・・
呼び元で
Call Hoge(From1)
とか
Dim f As New From1
Call Hoge(f)
なんてやられたらそりゃNGだけど、それは呼び元の責任でぁ。
もっと良いやり方があればご教授願いたい。

オブジェクトが解放されるのは参照カウンタがゼロになった時。
だが少なくとも、>209のメソッド内では解放を意識する必要は無い。
間違ってる所があったら指摘キボンヌ。
0219デフォルトの名無しさんNGNG
初心者でよくわからんのだが
標準モジュールでForm1を参照するのって悪いの?
AS Objectとかにして、クラス使って再利用性を高めるんならそれもそうだろうけど
メモリに常駐してる時点でグローバル関数とかわらんと思って
標準モジュール上でForm1参照しちゃってるんですけど
やっぱ関数化すべきなのかな・・・
0220デフォルトの名無しさんNGNG
>219
Form1のインスタンスはLoadされている保証は無いし、複数ある可能性もある。
0221デフォルトの名無しさんNGNG
>>216,>>217
VBで判断するのか、SQL(DB側)で判断するのかをまず決める。
まあ、普通にDB上でやればいいんじゃないの?
前方一致検索でしょ。
0222デフォルトの名無しさんNGNG
>>221
激しく同意
せっかくオラクルを使うのならちんたらコーディングするよりSQL
でするべき
オラクルならADOよりoo4oのほうが親和性がたかいよ、、
0223デフォルトの名無しさんNGNG
ORACLEのバージョンにもよるけど、一時表とか駆使すれば一回で取れると思うんだけど。
検索された中で最大の云々かんぬん

まあ、ここを見て参考にしてみれば?
ttp://homepage1.nifty.com/kojama/works/rdbms/ont.html
0224デフォルトの名無しさんNGNG
>>222
懐かしいフレーズを聞かせてもらったよ、ありがとう。
0225デフォルトの名無しさんNGNG
醜いSQLはあまり好きではありません。
0226デフォルトの名無しさんNGNG
リストビューのカラムヘッダーの幅が変更されたことを
知るイベントはありませんか?
0227226NGNG
何がしたいかといいますとリストビューの変更された幅を
iniファイルに保存して次回起動時にはその幅に戻したいのです。
0228226NGNG
ちがった。
2つのリストビューを片方が変更されたらもう一方も
追従するように同じ幅にしたいのです。
0229デフォルトの名無しさんNGNG
>>44
とんでもなく遅レスがありがとうございます。
なるほどです。
0230デフォルトの名無しさんNGNG
>>216-217
AからBを引っ張ると考えるからややこしく思えるんだろうけど
実際は単純な総当り検索で、条件を前方一致にして(+)付けるだけ。
0231デフォルトの名無しさんNGNG
指定した色を透明色にする方法はありますか?
0232デフォルトの名無しさんNGNG
>>226
ない。

と思う。
0233デフォルトの名無しさんNGNG
>>231
ある。
0234226NGNG
(´・ω・`)ショボーン
0235デフォルトの名無しさんNGNG
>>226
イベントは無いけどメッセージは飛んでる。
なんか面倒な気もしたが、がんばれ。
0236231NGNG
ゲームを作っているのですが、キャラの背景の透明化に
使いたいと思ってます。VB初心者なものでよろしければやりかたを教えてください。
0237226NGNG
>>235
じゃあ、サブクラス化すればゲットできますね!
0238デフォルトの名無しさんNGNG
サブクラス化なんてキッケンなことしなくても
タイマイベントでカラムヘッダが変更されてないかチェックして
変更があったら同期するようなコード書いたらいいんじゃない?

秒五回ぐらいなら遅延もそんなに気にならないし、
cpu時間の消費もほとんど無視できるレベルだと思うけど。

エレガントじゃないのはいや、ってか。
それをいうならサブクラス化だってそれ以上に.....。
0239デフォルトの名無しさんNGNG
>>238
VBのサブクラス化がエレガントじゃないっていのは同意するけどタイマーはなぁ。
業務でそれやったら「こいつ大丈夫か?」って思われちゃうだろうな。
自分しか使わないツールだったら許せるけど。
0240240NGNG

MDIアプリで、OracleのDBをいじるアプリを書いています。
漏れが担当しているのは、その一部の画面なんですが、
そのフォームから、更に別のフォームを子フォームとして
開いて、public 変数を介して情報のやり取りをしようと
しているのですが、うまくいきません。

親フォームを frmParent、子フォームを frmChild とします。

うまくいかないのは
・親フォームの Public strPText As String を子フォームから
 frmParent.strPTest の形で参照すると、何も入っていない文字列
 になる。(親フォームでは文字列を代入しています。)
・親フォームのサードパーティ製のスプレッドを子フォームから
 frmParent.Spread の形で操作しようとすると何も反応がない。
などで、

0241240NGNG
・子フォームの Public strCText As String には、親フォームから
 frmChild.strCText の形で代入できる。
・同様に子フォームの Public objForm As Form にもアクセスできる
 ので、親フォームから、親フォーム自身を objForm に代入して、
 これを使って上記のうまくいかない形のアクセスを行うと、ある程度
 はうまくいく。(プロパティの代入と参照)
  例) objForm.strPText
    objForm.Spread
・この方法でもスプレッドのメソッドは動作しなかった。

・親フォームの Public Function は子フォームから実行可能。

上記のような状況です。Visual Soucesafe を使って、複数人で
開発しています。
0242240NGNG
同じような経験をされた方、おられないでしょうか?
シンプルなプロジェクトを使って試したら、Public 変数には
何の問題もなくアクセスできたので、いったい何が問題なのか
検討もつかない状況です。

objForm を使うと冗長になりますし、IDEのインテリセンスが
使えなくてやりづらいです。
0243デフォルトの名無しさんNGNG
>240
 frmParentがfrmParentとして宣言されて開かれたのではなく・・・

 Dim objForm As frmParent
 Load objForm
 objForm.Show

 と言う風に開かれているのでは無いかと思えるが。
 LoadされていないフォームのPublic変数にアクセスした
場合と同じ動きをしているような感じだから。
 試しに、親フォームのPublic変数を参照しても空文字が
帰ってくる部分の直後にfrmParent.Showってやってみて
くれないかな?
0244240NGNG
>>243
Childではなく、Parentの方ですよね?
私も全体像は分からないのですが、起動(エントリポイント)は
標準モジュールから行っているみたいなので、そういう形で
起動している可能性はあります。

いまは自宅で、会社にいかないと詳細が分かりませんので
後で確認したいと思います。

ちなみにChildの起動は
frmChild.Show 0
で起動しています。

0245240NGNG
>>244
うーん。子ウインドウは frmChild.Show でやってるから、
親から子には問題なくアクセスできるのかな。
少し暗雲に光明が差し込んできた感じです。
ありがとうございます。

今日はこのワケワカメなバグでぐったりしてしまいました。
0246デフォルトの名無しさんNGNG
>>240
原因はたぶんフォームの「クラス」と「インスタンス」を混同していることと、
変数のスコープを忘れていることにあると思う。

フォームのインスタンスへの参照が常にグローバルレベルへで存在しているとは
限らないよ。

Form1内の複数のスコープから、Form2型のForm2という名前の同一のオブジェクトに
アクセスしたいなら、「オブジェクトForm2」への参照をForm1のモジュールレベルで
保持しなきゃ。

そうでなきゃ、たとえば同じ"Form2"にアクセスするつもりのコードを
Form1のロードイベントとForm1のコマンドボタンのクリックのイベントハンドラに
書いても、それぞれ「暗黙の宣言」によって生成された別々のForm2型の
インスタンスに対するアクセスになってしまうよ。
0247デフォルトの名無しさんNGNG
>>245
 それなら、子ウィンドウをfrmChildで呼び出しても
問題なくアクセスできますね。
 やっぱり、最初に親ウィンドウを開いている所に
原因がありそうですね。
0248190NGNG
>>209
> 無難な線として
> Public Sub Hoge(ByRef frm As Form1)
> みたいな感じで引数でフォームへの参照を受けて以後その引数を利用してアクセスすれば良い。

なるほど、そのHogeプロシージャーをフォームモジュールに書くんですね?
フォームのコントロールを触る処理はフォームモジュールに書いて、フォーム
に依存しない処理を標準モジュールに書けばいいのかな。


>>210
コントロールを引数にするのは非常に便利なのでしょっちゅう行ってるんですよ。
フォームに載ってるコントロールの特定のプロパティやオブジェクトを一斉に操作
したい時なんか、For eachと組み合わせて使うととても重宝してますです。Fontオ
ブジェクト弄ったり、MouceIconプロパティ弄ったりと。
0249240NGNG
>>246
なんか難しいんですね。C++の経験はあるんですが、
VBはじめて2ヶ月くらいなので、暗黙の宣言とかはまだ
よく分かってないです。
0250デフォルトの名無しさんNGNG
いや、>>210の意見はずれてると思うよ。
彼自身が冒頭に書いているとおり、(つまり>>210の文章は矛盾してるんだが)
いったいどこにフォーム上のコントロールをいじるコードを
フォームモジュール以外に書いてわざわざ見通しを悪くする必要がある。

それに標準モジュールにはAPI宣言と構造体の定義、サブクラス化するときの
ウィンドウプロシージャ等、VBの言語仕様上標準モジュールにしか
書けないコード以外書くべきでない。

当該のフォーム以外で発生するイベントをトリガーにして
フォーム内のコントロールをいじりたい、ってのなら相手に自分の参照を
引数で渡すなんてわけの分らんことしないで、フォームモジュール自身に
イベント発生源のオブジェクトへの参照をメンバ変数としてもたせて
イベントを受信するようなコードを書けばいい。

もっとも、これらはある程度の規模以上のプログラムを設計する場合の話で、
「〜を標準モジュールに書くべきかどうか?」なんて悩んでいるってことは
つまりどこに何を書こうと十分に見通せる程度の規模のコードってことで、
それなら「言語厨」に何を言われようと別に好きなように書けばいいと思うんだが。
0251デフォルトの名無しさんNGNG
>>249
 いや、>246の意見は一見正しいけど、VB6.0(以前含む)での
挙動ではない。(Unloadを実行していれば別だが)
 VBのフォームは暗黙にPublic宣言されている様な存在なので。

 試しに、検証してみたら、Form1.Showで開いた場合、何処からでも
Form1のPublic変数はForm.hogehogeで値が取れる。
 それぞれのプロシージャ内でローカルに宣言したオブジェクト変数の
Form1なら話は別だがね。
 もひとつ検証して、>243で書いた通りの事をすると、確かに
frmParent.strPTextでは空文字になる。
 >243では、Loadの直前に「Set 〜 = New frmParent」が必要ですが。
0252本日新規NGNG
VBというかVCというかどっちの問題なのかわからないのですが
ピンときたら教えてほしいっす
VCで作成したDLLをVBからデクレア?で宣言してその関数をフォームから
呼び出すと ファイルが(関数をもっているDLL)みつかりません
ってでるんすよ パスの通った場所にいれてるのですが
再起移動かけようが環境変数追加しようが事象がかわりません
ちなみにMFC DLL作成スケルトンで作ったファイルでTelnetの処理をしてます
■ このスレッドは過去ログ倉庫に格納されています