過去のQ&A

掲示板に戻る

Q1:VBでDirectXは使えないんですか?なんか、雑誌で見たような気がして・・・。(KATさん [98/12/28])
A1:VBを使用している環境に DirectX のコンポーネントをインストールすると、関連するDLL が Windows の System フォルダにコピーされます。

これを使用するためには、VBのメニューの[プロジェクト]−[参照]、または[プロジェクト]−[コンポーネント]で、該当するものを探してみて下さい。もし "Direct ----" と書かれた項目があれば、それをチェックします。

コンポーネントから指定した場合はツールボックスに新しいアイコンが表示されているはずですので、これを使ってコントロールをフォームに貼り付けられます。

参照で指定した場合は、オブジェクトブラウザの該当する項目を開いて、公開されているオブジェクトや、そのプロパティ、メソッドなどを調べて、それをコードとして記述することで使用できます。

たとえば、DirectKats というオブジェクトに KatsStart というメソッドがあったとすると、以下のように記述します。

---------------------------

Dim MyObject As New DirectKats

MyObject.KatsStart

---------------------------

具体的なメソッドやプロパティの動作や仕様については、オブジェクトブラウザの説明を読むか、テストプログラムで試行錯誤するしかないかも知れません。

<続報> VB6 で DirectX7.0a を利用できる Dx7vb.dll というDll があります。
工学社刊「I/O別冊 Visual Basic による DirectX7活用術」に DirectX7.0a SDK と詳しい解説が載っています。

Q2:VB6.0のランタイムのフルセットが公開されているサイトを教えてください。(暁の傭兵さん[98/12/28])
A2:Vectorにあります。基本パックと拡張パックがあるようですよ。
Q3:以下の症状が出ます。
1.VB5を入れた環境に、IE5を入れると、VB5が起動しなくなりました。
2.この後、VB5を再インストールすると、Win98が壊れました……(汗)
  うまくVB5とIE5を共存させる方法はないものでしょうか?(暁の傭兵さん[99/03/27])
A3:いくつか考えられる原因がありますが、未確認の部分もありますので、詳細はぜひとも Microsoft社のほうにお問い合わせください。

さて、考えられる原因その1は、DLLのバージョンです。

VB5が使用しているOCX(ActiveXコントロール)の中には、コモンダイアログ・コントロールのように、他のWindowsアプリケーションからも参照されるものがあります。

IE5.0をインストールすることにより、VB5が使用していたOCXの新しいバージョンが上書きされて、VB5から使用できなくなった可能性があります。

その場合、VB5を再インストールすることでWindows98の標準OCXが旧バージョンで上書きされてしまうために、2.の症状が出たものと思われます。

解決方法ですが、おそらく次の方法が有効と思います。

1.VB5をアンインストールする。
2.IE5.0をインストールする
3.VB5を再インストールする。
4.VB5のサービスパックであるSP3をインストールする。

ただし、これは未検証の方法ですので、確実に有効である保証はありません。

できるかぎり、Microsoft社の技術情報を参照するようにしてください。

Q4: 1.今テキストエディタを作ってみたんだけど、Undo機能の作り方が分かりません。

メニューの編集のとこに元に戻すってつけたいんだけどどうすればいいの?教えてください!

2.名前をつけて保存っていうのは作れたんだけど上書き保存が作れません(;_;)ファイルネームをどうこうするんだとは思うんだけど・・・どうすればいいのでしょうか?

3.Q1でも言ったけどテキストエディタ(メモ帳みたいなの)をとりあえず作ったのはいいんだけど、exeファイルにドラックドロップしてテキストファイルを開くにはどうしたらいいのでしょうか?教えてください(^^)

以上の点について教えてください(^^; (キッキさん[99/03/29])

A4:ええっと、3つの質問ですねぇ(^^; とりあえず一つづつ回答しましょう。

1.まず、そのテキストエディタのすべての機能について、実行する前にある関数をコールするようにします。

その関数では、現在のテキストの状態をテンポラリに書き出す処理を記述します。これはWindowsAPIを使用してテンポラリフォルダのパスを取得してもよいですし、アプリと同じ場所(App.path)でもいいでしょう。

複数回のUndoを有効にしたいなら、ファイル名の末尾に通し番号をつけて、たとえば MyEdit01.tmpのようにして、変数で番号を管理すれば大丈夫ですね。

もちろん、アプリの起動時か終了時にこれらのテンポラリファイルは削除しましょう。

そして、Undoが選ばれたときに、このテンポラリファイルを編集中のファイルに上書きしてやれば、いかにもUndoしたように見えるわけです。

複数回Undoなら、インデックスを処理してずらすことを忘れずに!

ちょっと動作が遅くなってしまいますが、一番簡単な方法はこれでしょうね。

2.まず、ファイルを開いたときと、名前をつけて保存したときに、開いたまたは保存したファイル名を文字列変数に保持しておきます。

ファイルをセーブするときにどのメソッドあるいはステートメントを使用しているかにもよりますが、そのファイル名で保存するようにすればだいじょうぶなはずです。

3.これはCommand関数を使うことで、そのExeが起動されたときのコマンドライン引数を参照すれば簡単にできます。

MS−DOSの時代の、 C:¥MyApp.exe /P:200 みたいなのがわかれば、コマンドライン引数という意味がぴんとくるでしょう。

VBのCommandの場合は、Exeやショートカットにドロップされたファイル名を与えます。これを文字列変数に代入してやれば送られたファイルを知ることができます。

注意したいのは、複数を同時にドロップできるようにするかどうかです。複数のファイルを同時にドロップすると、Commandの値はスペースまたはタブで区切られたファイル名の羅列になります。これをうまく切り出すようにコードを書かなければいけません。

ちなみに、この機能を組み込めば、Windows の Sendto フォルダにショートカットを作ることで、右クリックメニューの「送る」で使用できるようになりますよ。

Q5:実は、必要に迫られてWWW自動収集ソフトを作成しているのですが、画像ファイルの保存と「見たまま保存」の方法が分かりません。

HTMLファイルはinetコントロールで保存することが出来ますが、画像は一体どうやって取ればいいのでしょう……。(かなさん[99/04/04])

A5:ええっと、インターネット関係のコントロールは、実のところ私は使ったことがありません。(^^;

ですが、たぶんこれでいいだろうと思われる方法をご紹介します。

目的のページのHTMLのテキストを取得して、InStr関数などで img src タグを検索し、画像のURLを取得します。これを文字列変数の配列に格納して、ダウンロードのターゲットにすればよいのではないでしょうか?

いちおう、成功例のソースを下に示しますね。

Dim Da() As Byte

Da() = Inet1.OpenURL("http://www.domain.com/folder/file.jpg", icByteArray)

Open "C:\Windows\Temp\file.jpg" For Binary Access Write As #1
Put #1, , Da()
Close #1

Q6:現在、VB5.0にていろいろとプログラムを作成しているのですが、印刷前に、コモンダイアログを表示した場合に不思議な現象が出るときが有ります。

現象:印刷ボタン押下時に、印刷コモンダイアログを表示しているが、 印刷コモンダイアログが画面上に表示されない場合がある。

        よく見ると、タスクバーには「印刷」のタスクがあり、選択すると 印刷コモンダイアログが表示される。 表示される様子を見るとどうも小アイコン化されているようです。

        この現象は、発生するときとしないときがあります。

        コモンダイアログは、モーダルで表示されており小アイコン化 などしないと思っていましたが、実際どうなんでしょうか。(森一生さん[99/07/23])

A6:基本的にコモンダイアログが最小化の状態で表示されることはないと考えられます。

ヘルプにもそのような記述はありませんし、わたしも一度も見たことがありません。

可能性としては、コンソール(キー入力優先受付)を持ったウィンドウがすでに開いており、開かれたコモンダイアログのウィンドウがアクティブウィンドウにならなかったため、アクティブウィンドウの裏側(表示順下位)に表示されているケースです。

このような現象は見たことがあります。

コモンダイアログのオープン中にキー入力やマウス入力により他のウィンドウがアクティブになった場合などもそういう現象が起きることがあります。

ご質問の内容だけでは断定はできませんが、おそらく最小化ではなく、裏画面ではないか、というのは可能性が高いと思います。

Q7:VB、または、Win32APIでフォルダサイズを取得する方法をご存知ではありませんか。

方法が分からないのファイルサイズを合計していますが、処理時間がかかるため使いものになりません。(Koji Yamasakiさん[99/08/20])

A7: Win32API に GetFileSize 関数と GetCompressedFileSize 関数がありますが、おそらくこれらで調べられるのではないかと思います。

わたしも実験してみたのですが、他の原因でうまくいかないらしく、ファイルを指定してもフォルダを指定してもエラーになってしまっているので、検証未済ではありますが(^^;

ただ、GetFileAttribute などでフォルダもファイルの一つであるかのような扱いをしているようですし、特にフォルダに限定 してサイズを取得する関数が用意されていないことを見ても、おそらくファイルサイズ取得用関数にフォルダ名を指定することで可能なのではないでしょうか?

一点気になるのは、エクスプローラの右クリックでフォルダのプロパティを見たとき、ファイルのサイズを合計する処理が行われているらしいことです(サイズ欄が少しずつ増える現象が確認できます)。

VBでファイルを検索して合計するよりは多少速くなるでしょうが、劇的な速度向上が望めないかも知れませんね。

Q8:日本語版VB6.0を使って、開発をしております。 この日本語版で英語表示のセットアップディスクを成したいのですが、方法が分かりません。 ご存知であれば教えてください。(みつなべ かおりさん[99/09/17])

A8: そういえば英語版のソフトを作ることはできても、セットアップ自体を英語表記にするのは標準のディストリビューション・ウィザードではできませんよね。

わたしの場合、フリーウェアやシェアウェアのセットアップツールを利用しています。まだ未確認ですが、こういったツールの中に、セットアップ実行時のメッセージを指定できるものがあるかも知れません。

あるいは英語版のセットアップ作成ソフトを利用されれば、確実な解決になろうかと思いますが、その場合は英語版Windowsでしか動作確認されていない、などの問題に留意しなければならないでしょう。

Install Shield などはわりと広く利用されているソフトですね。試用版を使ってみたこがありますが、かなり細かい部分まで指定が可能で、利用価値は高いと思いますが、そのぶん価格もそうとうなものです。

ともあれ、Web でいろいろ探してみられることをお勧めいたします。

Q9:シリアル通信を行っている最中にスクリーンセーバーに入ると通信エラーになってしまいます。どうゆう状態になっているのでしょうか?(okaさん[99/10/06])
A9:はうっ・・・(^^; プログラミングというよりWindowsの仕様関係のご質問ですね。

うーん、どうなんでしょう?

まず、スクリーンセーバーも基本的にはWindows用EXEファイルです。試しに適当なEXEファイルを作り、コマンドラインが/Sのときに実行するよう作って拡張子をSCRにすれば、最低限セーバーとして動作します。

ということは、okaさんのご利用のセーバーのプログラムに、たとえば通信状態を監視して遮断するとか、そういうアルゴリズムが実装されている可能性が考えられます。

どのセーバーでも同じ現象が起きるとすれば、アイドル時間を感知してセーバーを実行するWindowsの制御のほうに原因があると考えられます。

なんですが・・・すみません m(_ _)m これから先はわたしもちょっとわかりません。

もう少し勉強してみます。何かわかったらここに情報を追加させていただきます。

Q10:実行中にコントロールパネルでシステムカラーを変更したのですがSSTABの色が変更されません。一度終了してから再度実行すると変更されます。なにか良い方法はないでしょうか?(okaさん[99/10/06])
A10:手元に開発ライセンスつきの Sheridan3DControls がないので(T-T)確認できなかったのですが、VBの標準コントロールでは更新されるようですね。

SSTABってAutoRedrawプロパティってありましたっけ? もしあるようでしたらそれで解決できるかも知れません。

それがない、あるいはあっても効果がない、そのときは・・・

かなり高度なことになってしまいますが、APIとか市販のコントロールでWindowsメッセージをフックして、画面のプロパティ変更がされたときに強制的にRefreshをかける、とか、どうでしょう?

あるいはタイマーで一定時間ごとにRefreshをかけてやるとか・・・なんか画面がちかちかしてしまいそうですね(−−;

むー、そこまでして色を変えるべきかどうか、難しいところではありますが・・・

方法としてはそんな方法が考えられますが、どうでしょう?

Q11:vb5.0を使用しています。プログラムのフォーム全部をBMP方式などの画像保存したいのですが、どうすればいいのですか?(Fumiaki Yamatoさん[99/10/07])
A11:ええと、手動で行うのであればイメージを保存したいウィンドウをアクティブにして、Alt + PrintScreen (DOS/V機の場合)でクリップボードにビットマップがコピーされますので、ペイントなどに貼りつけすればOKです。

プログラムで自動的に行うには少々手間がかかります。・・・そうです、APIを使います(^^;

まず FindWindow 関数でウィンドウタイトルを元にウィンドウのハンドルを取得します。さらに GetWindowDC 関数にそのハンドルを渡して、フォーム全体に対するデバイスコンテキストのハンドルを取得します。

もし可能であればピクチャボックスだけ持つウィンドウを用意します。このウィンドウを最大化させ、取得したフォームのデバイスコンテキストハンドルからこのピクチャボックスのhDCプロパティあてに BitBlt 関数を使ってイメージをコピーし、最後にこのピクチャボックスのイメージを VBの SavePicture でファイルに保存すれば、できあがりです。

むむ、かなりややっこしいですねぇ(^^; もっといい方法がありそうな気もするのですが、今はこのくらいしか考えられません。ごめんなさい m(_ _)m

Q12:Shellで、バッチファイルを起動して、そのバッチファイルが終了したか調べたいんですけど、どの様にしたら、いいのですか?(K.Kさん[99/10/07])
A12:ひゃぁああっ!二日で四つのご質問が殺到、しかも難しいのばっかりだぁ(^^;;

失礼 m(_ _)m

いろいろ試してみたのですが、どれもうまくいきません。これはたぶん機能として実装されていませんね。

それではどうするか。やはりWindowsメッセージのフックをするしかなさそうです。そして、バッチファイル実行ウィンドウに送られるWM_CLOSEメッセージを検出するまでプログラムを待機させる(ループするとか)しかなさそうです。

メッセージをフックするコントロールは市販のものにありますし、確か(=不確か)オンラインソフトにもあったような気が・・・

よかったら探してみてください。

Q13:初めまして私は滋賀県にてVB6環境で医院向けのソフト作成を行っております。
実はVB音声認識プログラムを構築する必要があります。
あまりお金がありませんのでViaVoiceのエンジンを使用したいと考えております。
IBMのホームページから何時間もかけて資料をダウンロードしましたがはっきり言ってわかりませんでした。
こちらのニーズはたくさんの話者がいますが(15名程度)使う際にその人物の学習機能を利用できたらと考えております。
また入力すべきごくは限られて登録した単語以外が認識されても困ってしまいます。
SAPIの資料も拝見しましたが、私には高級すぎてむずかしかったです。どなたか良い参考書や
情報を教えて下さい。
他にもっと簡単な方法がありましたら、どなたかご指導いただきたいと考えております。
よろしくお願いいたします。(るーさん[99/10/16])
A13:お、音声認識ですか?(^^;

ずいぶん難しいことをなさってるんですね。

さて、わたしはIBMのViaVoiceのエンジンについてはよく存じ上げませんので、一般論を申し上げますね。

VBで他のアプリケーションのコンポーネントを利用するときにはおよそ以下の二通りの方法があります。

1.ActiveXコントロールで提供されている場合はプロジェクトにコントロールを追加して使用する。

2.DLLなどの外部ライブラリで提供されている場合はプロジェクトに参照を設定してAPIのように関数をコールして使用する。

1.のほうはコモンコントロールなどでおなじみでしょうから、あえて説明不要でしょうか。

メニューの「プロジェクト」−「コンポーネント」でコントロールを追加し、ツールボックスからフォームに貼りつけるだけです。

あとはテキストボックスのような標準コントロールと同じようにプロパティやメソッド、イベントを操作することでカスタマイズして使用できます。

2.のほうは、少々ややこしいですが、Win32APIをお使いになったことがあればほぼ同じようにできます。

つまり標準モジュールの宣言部で Declare Function でDLL内の関数への参照を作成し、あたかもプロジェクト内部で宣言された関数であるかのようにコールするだけです。

このDeclare Function の定義法についてはVBのヘルプやアドインの「APIビューワ」などを参照してみてください。

(例) Declare Function GetVoiceInput Lib "vvoice.dll" Alias "vvGetVoiceInput" (ByVal pWait as Long, ByVal buff as String ) As Long

ご参考になるかどうかわかりませんが、ぜひがんばってよいソフトを完成させてくださいね (^-^)

Q14:仕事の上でWWW収集ソフトをinetコントロールを使用して作成しているのですが、CGIを含んだURLのHTMLデータの取得がうまくいきません(文字化け及び最後まで取得できません。)
よろしく御指導願います。(村上さん[99/10/17])
A14:WWW収集ソフトって、なかなか需要があるんですねぇ。

さて、ご質問の件ですが、こちらでも検証してみました。

まず文字化けの件ですが、これはinetコントロールが Internet Explorer のエンジンを使用していることが原因で、特にCGIだからというわけではなさそうです(Yahoo!Japanは文字化けしやすいサイトの代表です ^^; )。

これを解決するには、IEのように、ユーザがエンコードを選択できるようにするほかないでしょうね。

それから、最後まで取得できないのも、エンコードの問題のようです。たとえばS-JISでEOFになるコードを含むEUCのサイトなどを取得するときなどに起きるようです。

サイトのほうでMETAタグなどでエンコードを明示しない限り、100%正確にエンコードを取得する方法が今のところなく、最終的にはユーザに選択してもらうしかないでしょうね、残念ながら…。

Q15:Access5.0で開発を行なっています。
追加クエリーでクエリーの結果(27万件)をテーブルに格納したいのですが、テンポラリファイルが不足しているというエラーログが出てしまいました。
23万件で試したところ、正常に動作したのですが・・・
テンポラリファイルというのは、設定できるのでしょうか?
また、設定できるのなら、すいませんが詳しく教えてください。(M.Cさん[99/10/19])
A15:VBの質問ではないのですが、勢いで答えてしまいます(笑)。

ええっと、AccessはOracleなどと異なり、どちらかというと小規模データベース用に設計されているような印象があります。

わたしも以前仕事でAccess1.1のアプリを触ったことがありますが、もとのテーブルが2200件のときに2〜3分で終了するクエリーが、テーブルが2300件になった途端に1時間以上かかるようになる、といったような現象を経験しました。

テンポラリファイルはご存知のようにWindowsフォルダのTempフォルダ内に作成され、アプリケーションの終了などのタイミングで削除される、文字通り「一時的」ファイルです。

データが27万件とのことですから、ざっと見積もっても100MBくらいのMDBファイルになっていませんか?

それがさらに作業用のテンポラリファイルを次々に作成していくと、当然ディスク領域の不足が発生するものと考えられます。

一つ便利な方法は(ご存知かも知れませんが)、Accessのメニューの「データベース」−「ツール」−「最適化」を実行すると、速度向上のために展開されたインデックスなどを削除することで、多少ファイルサイズを抑えることができますので、これをお試しになられることをお勧めします。

また、テーブル構成や設計を見直して、結果テーブルの件数が少なくてすむようであれば、それもお試しになられるとよいかもしれません。

ただ、根本的に巨大なデータベースを扱うのにAccessは向いていないこともご留意されたほうがよろしいかと思います。

Q16:Inetコントロールを使って、ダウンロードソフトを作ろうと思うのですが、OpenURLでは、同期転送のため進行状況がわからないため、非同期転送のExecuteメソッドを使おうと思っています。
なんですが、Executeを使ってダウンロードしようとするとファイルだけ作られてファイルの大きさも0バイトのままです。
VBのヘルプどうりにやっているのですが、どうもうまく行きません。
いろいろな書籍も調べたんですが、GetChunkメソッドを使ったり、とか良く分かりません。
どうしたら、Executeメソッドを使ってファイル(TXTではなくバイナリ)をダウンロードできるか教えてください。 こんな感じでやっているんですが

<ヘルプにのっていたもの>

Inet1.Execute "FTP://ftp.microsoft.com", _
"GET disclaimer.txt C:\Temp\Disclaimer.txt"

<自分のソース>
Inet1.Execute "http://www.yahoo.co.jp/images", _
"GET " & main5.gif & " " & "C:\Temp\main5.gif"

出来ないんです。
Executeメソッドは http のほうは使えないんでしょうか? お願いします。教えてください。(PICOさん[99/10/19])
A16:あ、Inetコントロールがらみ、多いですね(^^;

確かにわかりにくいんですよね、あれって…(笑)。

ところで、このソースにある main5.gif のところは、エラーになりませんか?

ファイル名はダブルクォーテーションで括ってるんですよね、おそらく。

で…実はわたしはExecuteは使ったことがありません(−−;

というのも、ご指摘のとおりGetChunkがどうとか、いまいちヘルプの説明じゃわけがわかんないからです。

なのでこの先は想像で書いておりますので(無責任)、どうぞご了承くださいませ m(_ _)m

おそらく GET というのは、FTPによってファイルを取得するコマンドではないでしょうか?

であれば、HTTPダウンロード用のコマンドが別にあることになりますが、ありますかね?

…う、やっぱだめだ、想像じゃわかんない…

ちょっと宿題ってことで、もうちょっと調べてみます、すみません m(_ _)m

Q17:ACCESS2000でデータベースを作成し、クリスタルレポートにODBC経由で、印刷さしたいのですが、 ACCESS2000側だと思うんですが、トランザクションをウエートで発行しても、恐らくまだ、物理的にデータベースに データが、書き込まれないうちに書き込み済みのステータスだけが、先に帰りレポートのアクションを起こします。
その結果クリスタルレポートの項目に何も編集されず、枠のみ印刷されます。
その為トランザクション完了直後にウエート命令を置いたところMDBの情報を取り込みデータベースの内容が、 ちゃんと編集されました。
なにか、完全にACCESS2000にデータが書き込まれたことをトランザクション以外に確認する方法は、ないでしょうか? よろしくお願い致します。  (ティー・アイ・シーさん[99/10/28])

A17:Access2000ですか。まだ使ったことないですね、わたしは。

まず、なぜ書き込み済みが早く戻るかというと、それはAccessがデータベースのアクセスにキャッシュを使っているからなんですね。

つまり、メモリ上のエリアにデータを格納した時点で「書きこみ完了」とみなしているわけで、メモリのデータをディスク上の実データに書き出すタイミングとは異なってしまうんですね。

では明示的に実データの更新を確定するにはどうするかというと、すでにご確認のようにトランザクションを使うのが通常です。

トランザクションの利点はデータの最新性の保証や、排他処理による「戻り」発生の防止、予想外のエラーによるプログラムの中止などのときに変更を反映させずに終わる、などがありますが、このようなデータ更新の確定にも有用なわけです。

もしトランザクションを利用しないようにしたいのであれば、VBなどでDAOとクリスタルレポートコントロールを利用されてみてはいかがでしょうか。

Q18:さて、質問ですがRS232C(シリアルポート)を利用して外部機器を制御したいのですが、この種の内容に関しては参考図書も非常に少なくなかなかはかどりません。
RS232C(シリアルポート)から受信するBINARYデータ(常に受信している)の中である特定のデータ(たとえば、A5)を受け取ったときに、アプリ側でイベント(beep音を出す等)を発生させたいのですが、イベントを発生させることは簡単ですが連続で受信するデータのうち特定の1BYTEデータの受け取り方が分かりません。
よろしくお願いします。  
A18:RS232Cですか。これはわたしもやったことないですね。

データの受け取りにどういう方法を使っているか、によって違ってくるとは思うんですが、このご質問から最初に考えたのはタイマーを使う方法です。

タイマーでポートから受け取ったデータを見るプロシージャを呼び出して、InStr関数などで特定のバイトを探す方法はいかがでしょうか?

たとえば

Private Sub Timer1_Timer()

  Dim RcvdData as String   ' ポートから受信するデータ

  RcvdData = GetPortData() ' ポートからデータを受け取る関数をコール

  If InStr(0, RcvdData, Chr(Val("&HA5"))) > 0 Then Beep

End Sub

というふうにしたらできると思います。

あるいは文字列でなく ByteArray で受け取る場合には、For Next ループでインデックスをインクリメントしながら探していくことになるでしょうね。

Q19:JPEGの縦横のサイズを簡単に取得するようなAPIまたは、関数または手段はないでしょうか? (K.Mさん[00/01/17])
A19:ファイルだけ指定してサイズを取得することはできないようですが、意外と簡単な方法で調べることができます。

まず、フォーム(非表示でもよい)にピクチャボックスを貼り、AutoSize プロパティを True にしておきます。

このピクチャボックスに対象となるJPEGファイルを LoadPicture 関数でロードします。

そうです、実はJPEGだろうとGIFだろうと、VB4 以後のピクチャボックスはビットマップとしてロードできてしまうんです。

で、AutoSize プロパティが働いてサイズが自動的に対象のファイルのサイズと同じになります。

そこでピクチャボックスの Width プロパティと Height プロパティを取得すればOKですね。

ピクセル単位に直したいときは Screen.TwipsPerPixelX と Screen.TwipsPerPixcelY でそれぞれ割ってやるだけです。

Q20:VBでNTサーバーにだけセットアップして、クライアントから使用するようなアプリケーションは作成できるのでしょうか?

ランタイムやDLL等はクライアントにもないと実行はできないような気がします...

本当は、クライアントにはなにも置かずにサーバーのEXEだけを実行したいのですが、それは無理なのでしょうか?

仮に、クライアントにランタイムやDLL等をコピーするとしたら、サーバーにセットアップした後で、サーバーにあるクライアントセットアップEXEを実行するとクライアントにコピーされるという方法がとれるのでしょうか?

VBのヘルプとかを探したつもりなんですが、わかりませんでした。 (K.Mさん[00/01/19])

A20:いちおう可能なようです。

VB5以降から追加されたプロジェクト形式に ActiveXドキュメントEXE というのがありますが、それを使用すればセットアップなしでサーバにある実行ファイルを利用できます。

ただし、実際にはバックグラウンドで実行ファイルやランタイムをローカルにコピーしているので、正確には「セットアップをユーザが意識することなく使用できる」ということになります。

やり方としては、新規プロジェクトで ActiveXドキュメントEXE を作成し、ユーザードキュメントにコマンドボタンを配置します。
さらにそのプロジェクトに実行させたいアプリのフォームやらモジュールをプロジェクトに追加します。
そしてユーザードキュメントのコマンドボタンのクリックイベントに、そのアプリのスタートになるステートメント、たとえば
Form1.Show とか Call Main などを記述してやればOKです。

この ActiveXドキュメントEXE のプロジェクトをセットアップウィザードで開き、「インターネットセットアップ」を選択すると、必要なファイルをまとめて圧縮したCABファイルと、ユーザドキュメントから生成されるVBDファイル、そしてHTMLファイルの3つが作られます。

この3つをサーバに配置して、クライアントからHTMLファイルにブラウザでアクセスすると、ユーザドキュメントでデザインした画面がブラウザに表示されます。
そこでコマンドボタンをクリックすると、ファイルのコピーをバックグラウンドで行いつつ、アプリがクライアント側で起動します。

この場合にいくつか注意すべき点があって、まずブラウザのセキュリティ設定が「低」でないと実行できないこと、またパブリック変数をモジュールをまたいで利用するときにはユーザドキュメントにプロパティを記述しなければならないこと、など、通常のプロジェクトとは異なる部分があります。

ActiveXドキュメントEXE のネットワークでの使用については Visual Basic Books Online に詳細に(わかりにくいですが)記述されていますのでご参考になさってみてください。

Q21:VBでエディタを作っているのですが、URLやメールアドレスを書くとそれをクリックしたらIE、メーラーなどが起動するようにする方法がわかりません。
あらかじめ決められたページに飛ぶというのはできるのですが、エディタに書かれた本文中からそれを検出して実行する方法を知りたいのです。
文字列検索関数を使って、それをShellExecuteで起動で起動したいと考えているのですが、まったくうまくいきません。(「よっさん」さん[00/02/07])
A21:なるほど、確かにテキスト中からURLを検出することや、それをもとにブラウザやメーラーを起動することはできますが、クリックされた部分のテキストを取得する方法がないわけですよね。

VBに標準で用意されているテキストボックスコントロールやリッチテキストコントロールは、MouseDown イベントでマウスの押下位置を取得することはできても、その下にあるテキストまでは取得できませんね。

わたしもいろんな方法を考えてみましたが、どんな方法でもどこかにかならずネックがあり、簡単には実現できそうにありません。

まだ未確認ですが、インターネット関連コントロールの中に、HTML形式をサポートしたものがあったかも知れません。

あるいはそれを使用すれば可能かも、と思うのですが。

もう少し引き続いて調べてみますね。

Q22:セットアップ画面で、インストールフォルダなどを聞いてきますが、それを聞くことなく、たとえばインストールボタンなどを押せば、勝手に指定のフォルダにインストールする(要するに、ボタン一つで、全てのセットアップが完了する)セットアップ画面って、作れないのですか。もし作れるのだったら、その方法まで教えていただきたいのですが。 (青木 育也さん[00/02/18])

A22:方法はいくつかあります。

1.セットアッププログラムを自作する。あるいはバッチファイルなどを利用する。

2.LHA形式の自己解凍形式書庫を作成するとき、「自動実行」をチェックする。
  こうすると、書庫ファイルを実行すると同時に指定のフォルダに解凍します。

ただし、これらの方法はあまりおすすめできません。

というのも、ユーザそれぞれに使用環境が異なるため、どんなユーザにも対応できるフォルダの指定ができないからです。

たとえば、DOS/V機のHDDドライブはCが第一ドライブですが、NECのPC-98シリーズの古いシリーズなどではAが第一ドライブです。
もし、インストールフォルダに C:\Program Files\MyApp のように指定すると、PC-98シリーズの場合にはFDDになってしまい、ソフトを利用できなくなります。

また、DOS/V機ユーザでも、パーティションを切ってCドライブは Windows などのシステム用、アプリやデータはDドライブ、というように分けている方も多いので、勝手にCドライブにインストールされては困る、ということになります。

通常、フォルダの概念がわからない方は、そのままOKボタンを押すと思われますので、あえて指定できなくする必然性はないと思われますが、いかがでしょう?

Q23:NT4.0 VB6.0にて先物取引のグラフを自動生成する プログラムを 作成しています。
web上でグラフを表示できるよう、gifファイルに出力したい のですが、 やり方がわかりません。
只今の手順としてはChartFXというアプリケーションのコンポ−ネントを使用して グラフを作成し、 それをクリップボードに貼り付け、GetData()関数を使用して、ピクチャーボックス に読み込み、 SavePictureにて、bitmapとして出力しています。
ネット上のフリーのDLL を使用させていただいて jpegファイルにはうまく出力できているのですが、ファイルサイズの割には画像がに じんで きれいに表示できません。(Maedaさん[00/02/25])

A23:まず、GIFという画像形式は特許技術なので、その変換をサポートするアプリは特許料を支払わなくてはならないのです。

そのため、オンラインソフトなどでも、かつては Susie という画像ビューワのプラグインなどで GIF 変換できるものがあったのですが、公開を中止しているようです。

あるいは市販の ActiveX コントロールなどでは、ちゃんと特許料を支払ったものがあるかもしれません。
ただ、お仕事とのことですから、客先に配布するにはライセンス料を取られることになるでしょうね。

アプリケーションの設計段階での検討であれば、グラフの作り方から見直せば、いろんな方法があるのですが、とりあえずすでにビットマップにグラフが出力された状態での解決法ということで考えます。

それには、ActiveXドキュメントを使用する方法があります。

あまりスマートな方法ではないのですが、ピクチャーボックスのみを持つフォームをActiveXドキュメントEXE のプロジェクトに追加して、そのピクチャーボックスにビットマップを表示させれば、ブラウザでもビットマップを表示できる、ということですね。

VB Books Online などに ActiveXドキュメントについて解説が載っていますので(わかりにくいですが)、そちらをご参考になさってみてください。

Q24:VB6でフォーム上に例えば
1.「MSchart1」と「Command1」とを配置します
2.MSchart1のプロパティーページでチャートの種類を棒にします。
そして以下のコードを実行しコマンドボタン1をおすと 棒グラフが表示されます。

Private Sub Command1_Click()
  Dim d(10)
  For i = 1 To 10
    d(i) = i
  Next i
  MSChart1.ChartData = d
End Sub

ここまでは理解しました。
ただ、チャートの種類を散布図(XYグラフ)にした場合、 チャートへのデータの渡し方が分かりません。
例えばX値の系列が1列あり、 これに対してY値の系列が複数列ある場合の データの渡し方を教えてください。 (小川琢司さん[00/03/03])

A24:検証はしていないのですが、VB Books Online によると、二次元配列でデータを与えることが可能なようです。
つまり、

  Dim d(10,10)
  For i = 1 To 10
    For j = 1 To 10
      d(i, j) = i * j
    Next j
  Next i
  MSChart1.ChartData = d

このようにして行・列などを持つグラフでもデータを渡すことができるようです。

たぶん、3次元配列以上でも同じように可能と思われます。

Q25:VB6でMSComm.OCXを使い通信部分をスレッド化したい為、 ActiveX.DLLorEXEで実現しようと思ったのですが、 ActiveX内でのMSCommのオブジェクト定義が判りません。
クラス内でのOCXオブジェクトの定義は出来ないのでしょうか。
ちなみにPublic MSComm1 as MSComm とし 標準EXEより実行したら オブジェ変数が未定義のエラーが帰ってきます。
何か良い方法はないでしょうか教えて下さい。(「まっちゃん」さん[00/03/05])

A25:まず、ActiveX DLLまたは ActiveX EXE のプロジェクトに新規フォームを作成して、そこに MSComm コントロールを貼りつけます。
そしてクラスモジュールに、MSComm のプロパティやメソッド、イベントなどをラップするプロシージャを記述します。
その場合には、たとえば Form1.MSComm1.xxxx のように記述することで、クラスモジュール内でコントロールを利用できます。

プロパティなら Property Get と Property Let のプロパティ関数コンビを作ります。
メソッドなら Public Sub または Public Function で記述します。
イベントは宣言部で Public Event として宣言しておいて、発生させる場所で RaiseEvent MyEvent のように記述します。

これらは、ご自分で利用されるものだけ用意してやればいいでしょう。

ちなみに、ActiveX DLL や ActiveX EXE を使用するより、ActiveX コントロールにしたほうが、本家のプロジェクトにコントロールを貼りつけるだけで済みますので、かなり簡単になりますよ。

Q26:Inet1コントロールを使用しようとしたら、ライセンスがありませんと表示されます。
どのように対応すれば使用できるうのでしょうか?わかる方がいれば教えてください。
vbのバージョンは、vb5 proです。(はらぴーさん[00/03/11])

A26:ActiveXコントロールには、2種類のライセンスがあります。

ひとつは使用時ライセンスで、そのコントロールをプログラムから呼び出して実行することができるライセンスです。

もうひとつは開発時ライセンスで、そのコントロールを自分のプログラムに使用して、プログラムといっしょに配布することができるライセンスです。

さて、ご質問のケースですが、Inetコントロールが何らかの原因で開発ライセンスを与えられていないようです。
考えられる原因は以下のようなものです。

1.VBのインストール時にコントロールをインストールしていない
2.VBをインストールした後で、IEなどをバージョンアップしたため、新しいコントロールで上書きされた
3.Inet コントロールを使用するオンラインソフトをインストールしたとき、新しいコントロールで上書きされた

まず1.のケースですが、VBのインストールのときにオプションでインストールするコントロールを選択できるようになっていて、標準インストールではインストールされないコントロールがあったりします。

また、2.や3.のケースでは、他のソフトが使用するコントロールのほうがバージョンが新しいときには、その新しいバージョンのコントロールで上書きされてしまい、開発時ライセンスを失ってしまうことがあります。

解決法としては、VBのCD-ROMから再度 Inet コントロールを追加インストールすればよいはずです。

ただし2.や3.の場合には、新しいバージョンを使用しているアプリケーションが正常に動作しなくなる可能性もあります。

ですので、念のため先に VB のサービスパックを Microsoft のサイトからダウンロードしてインストールされておくことをおすすめします。
これは、たとえば VB付属のコントロールが ver.6.00 だったとして、他のアプリケーションの使用するコントロールが ver.6.01だったような場合、サービスパックをあてることで、コントロールが ver.6.00 から ver.6.01 にアップグレードされる可能性があるからです。
そうすればバージョンの競合は避けることができます。

Q27:VB6.0のフォーム上でBMP(JPEG/GIFなどでも)を並べて表示することって可能ですか??
ちょうどWindowsの壁紙をタイル上に表示みたいな感じです。(さとまるさん[00/03/13] )

A27:そのものずばり、の機能はないんですが、コードをうまく書くことで似たような動作をさせることは可能です。

まず、表示させたい画像を Autosize プロパティを True に設定した非表示のピクチャボックスに読みこみ、そのピクチャボックスの Width プロパティと Height プロパティから幅と高さを取得します。

つぎに、Form_Load イベントと Form_Resize イベントで、フォームのクライアント領域の幅と高さを取得し、それぞれをピクチャボックスの幅と高さで割ることで、縦横いくつずつ表示させればよいかを計算します。

そしてその回数で二重のループを作り、X座標とY座標にその幅と高さを加算しながら、ピクチャボックスのデバイスコンテキスト(hDCプロパティ)からフォームのデバイスコンテキストへ API の BitBlt 関数でイメージを転送してやればOKです。

コードを書いてみるとこんな感じですね。

Private Sub Form_Resize()

  Dim wWd As Single    ' ウィンドウの幅
  Dim wHt As Single    ' ウィンドウの高さ
  Dim pWd As Single    ' ピクチャの幅( Twips )
  Dim pHt As Single    ' ピクチャの高さ( Twips )
  Dim pWd_L As Long   ' ピクチャの幅( Pixel )
  Dim pHt_L As Long    ' ピクチャの高さ( Pixel )

  Dim idx1 As Integer    ' ループカウンタ
  Dim idx2 As Integer    ' ループカウンタ

  Dim xCnt As Integer   ' 横方向のピクチャ数
  Dim yCnt As Integer   ' 縦方向のピクチャ数
  Dim LocX As Long    ' 描画するX座標位置
  Dim LocY As Long    ' 描画するY座標位置

  ' ウィンドウサイズの取得
  wWd = Me.Width
  wHt = Me.Height

  ' ピクチャサイズの取得
  pWd = Picture1.Width
  pHt = Picture1.Height

  ' ピクチャサイズのピクセル数変換
  pWd_L = CLng(pWd / Screen.TwipsPerPixelX)
  pHt_L = CLng(pHt / Screen.TwipsPerPixelY)

  ' 縦横のピクチャ数計算
  xCnt = CInt(wWd \pWd)
  yCnt = CInt(wHt \pHt)

  ' ループ
  For idx1 = 0 to yCnt - 1
    ' 描画位置Y
    LocY = pHt_L * idx1
    For idx2 = 0 to xCnt - 1
      ' 描画位置X
      LocX = pWd_L * idx2
      ' ビットマップ転送
      BitBlt GetDC(Me.hwnd), LocX, LoxY, pWd_L, pHt_L, Picture1.hDC, 0, 0, SRCCOPY
    Next idx2
  Next idx1

End Sub

Q28:現在、VB6でアプリケーションを作成し、配布するところなのですが、うまくいきません。
「Microsoft Visual Studio 6.0」の「ディストリビューション ウィザード」でインストーラーを作成しているのですが、正常な場合、CABファイルが8つくらい作成されてインストールもできるのですが、PCによってはCABファイルが3つしか作成されずに当然、インストールもできない状態です。
OSもVB等のVerも同じなのですがどうしてこんな現象が起こるのかわかりますでしょうか?
また「インストーラー」をサーバにのせてクライアントはサーバからインストールさせたい場合はどのようにすればよろしいのでしょうか?(新米プログラマーさん[00/04/12])

A28:ディストリビューションウィザードは、デフォルトでは一つのCABファイルを作成する設定になっていて、FDD配布を選択した場合には複数に分割されるものと思います。

さて、WindowsもVBも同じバージョンでありながらセットアップの作成ができる場合とできない場合があるとすれば、考えられる原因は以下のようなことです。

1.VBのインストールオプションやエディションが違う
  つまり、「標準インストール」「フルインストール」「最小インストール」などの選択により、ActiveXコントロールやコンポーネントが 省略されてしまうと、そのアプリで使用されているコンポーネントが見つからないためにセットアップを作成できません。
  また、Professional Edition と Enterprise Edition では使用できるコンポーネントの種類が異なっていますので、同じようなことが起きる可能性があります。

2. VB以外のコンポーネントのインストール状況が違う
  DAOやODBCドライバのような、VB以外の環境に依存するコンポーネントをアプリケーションで使用している場合、それらがインストールされていない環境ではセットアップを作成できません。

次に、サーバからインストールする方法ですが、LAN環境であれば、サーバの共有フォルダにセットアップを配置し、クライアントが「ネットワークコンピュータ」アイコンからアクセスしてSetup.exe を実行するだけでセットアップできます。
インターネット環境での場合の方法は、Q20を参照してください。

Q29:大学の研究でデータを管理するプログラムを作成しようとしています。
VBに関しては全くの初心者なのですが、バイナリで読んだ数値を実数型( single)に変換したいのです。
バイナリで4バイト読み込んで、この4バイトに 対応する実数型の数値を知りたいのですが、どうしたらよいのでしょうか?(がやさん[00/04/13])

A29:通常、変数の型を意識してデータを読み込むためには、ランダムアクセスモードでデータを書き込むことによって、「記述子」も同時に書き込んでおき、ランダムアクセスモードで開くことで、書き込んだときと同じ型でデータを取得できます。

バイナリーで開く場合、記述子が保存されていないので、型を判別できません。

その場合、バイトデータとして値を取得し、Single型のフォーマットに従って解析・変換をする必要があります。
フォーマットの仕様については公開されていないので、テストプログラムをいくつか作成して解析するしかないでしょう。

Q30:NT4.0で構築されたLAN環境でVB5を使用して開発しています。
管理上、共有ファイルの使用状況が分かればと思い、 「対象のファイルが開かれているかどうか」を取得したいのですが、 現状ではその方法が分かりません。
実際、使用中のファイルをデリート、または名前を変更しようとすると 「編集できない」とWindowsで警告メッセージがでるので、 なんかしら方法が有ると思っているのですが・・・。
APIとかで可能なのでしょうか?よろしくお願いします。
あと、NTのLAN環境ということで、使用ユーザー名が分かれば更に理想なのですが。(さん[00/04/17])

A30:いろいろ調べてみたのですが、特定のファイルが開かれているかどうかを得る方法というのはなさそうです。
これはネットワーク上、ローカルを問わず、です。

Windows が警告を出すのは、ファイルそのものに情報が設定されているのではなく、カーネルかシステム(おそらく常駐しているExplorer.exe あたりでしょう)が情報を保持しているものと思われます。

ひとつの方法として、Windowsのメッセージをフックする、という方法があり、ネットウォッチャーなどはどうもそれを利用しているように見えるのですが、残念なことにそのAPIはVBからは使えないのです。

とういのも、VBではAPI関数からコールバックされるメッセージを受け取ることができないからです。

そういうことで、VBではお尋ねの機能を実装するのは不可能ではないかと思われます(VC++なら可能かも)。

Q31:いま、VB6.0で、DBに接続・・・・・などをやっていますが、 疑問が浮かびました。
DAO、ADO、RDO、OLEの、違いや利点がわかりません。
教えてください。(よしさん[00/04/18])

A31:ぶっちゃけた話、たいした違いはありません(笑)。

基本的には内部的にシステムがどうDBとVBアプリの橋渡しをするか、が違うだけで、インタフェースなどが若干異なる以外、あまり意識する必要がない違いがほとんどです。

ただ、RDO経由でODBC接続をする場合、セットアップに組みこまなければいけないISAMドライバやDLLなどがかなり多くなるようです。

わたし個人としてはDAOでMDBを使用するのが一番簡単な気がします。

Q32:現在、ActiveXコンポーネントを使用したWebアプリを作成しているのですが、 バグ(バージョンアップ)等を考慮し、自動的にファイルをダウンロードする 仕組みを考えています。
ブラウザにコンポーネントが表示された状態で、コンポーネントファイルの ダウンロード(上書き)を行いたいのですが、「書き込みエラー」となって しまいます。(過去のレス OpenURLを使用する方法を引用)
コンポーネントの メソッドに、アップデート機能を付加したいのですが、コンポーネントが表示 された状態では、無理なのでしょうか?(とまとさん[00/04/21])

A32:自分自身が起動している状態では、その実行ファイルそのものをアップデート(上書き)することはできません。
ウイルスバスターや翻訳ソフトの「Babylon」 などでも、プログラムのアップデートを行うときはいったん本体を終了させています。

考えられる方法としては、アップデートプログラムをアプリに同梱しておきます。
アップデートを実行するときは、 テンポラリフォルダに新バージョンの実行ファイルをダウンロードさせます。
その後、アップデートプログラムを Shell 関数などで起動し、すぐに自分自身を終了させます。
アップデートプログラムのほうでは、「本体が終了したらOKを押してください」などと表示させ、OKが押されたら、テンポラリフォルダにある新バージョンのファイルを旧バージョンをインストールしたフォルダ(アップデートプログラムから見た App.Path )にコピーさせます。
コピーが終了したらメッセージを表示し、OKを押したら本体を起動した後、自分自身を終了させます。

カップルで、お互い相手が寝ている間に寝言を録音するようなものでしょうか(笑)。

Q33:VB6.0でActiveXを作成し、 ActiveXコントロールインターフェースウィザードで使用するプロパティを決め、 プロパティページウィザードでプロパティの実装をしました。
ディストリビューションウィザードでインターネットパッケージを作成し、 IE5.0でインターネットオプションのセキュリティレベルを低に設定参照して OBJECTタグの埋め込まれたHTMLを読みこむと、 CABファイルのダウンロードが始まり、ActiveXコントロールが表示されたが、 ページの再読み込みをすると以下のメッセージが現れました。

「このページのソフトウエア(ActiveXコントロール)のいくつかは安全でない可能 性があります。
実行しないことをお勧めします。実行を許可しますか?」

ベリサインなどの会社の認証はとっていないので、メッセージがでたのだと考えられ ますが、 PARAMタグの記述をすべて削除するとメッセージでないことがわかりました。
もし、VBで作ったActiveXをIEで表示する際に、上記メッセージがでないようにする 方法をご存知でしたら教えて頂けませんか?(鈴木さん[00/04/28])

A33:う〜ん、これが問題なのですよね、ActiveX認証問題・・・

なんせ、Microsoftのサイトから Windows のアップデートを Activeセットアップしようとしても、
「このActiveXコンポーネントには署名がありません」と警告されるくらいですから(笑)。

ヘルプやVB Book Online などを見ますと、ディストリビューションウィザードで署名を入れることができるかのように書いてあるのですが、実際やってみるとそうはなりません。

所詮、個人が作るソフトなど、安全でない可能性があってあたりまえなのですが(いきなりシステムを破壊するプログラムだってほんの数行で書けますし)、どうしても「危険なもの」と思われたくなければ、どうにかしてメッセージが出ないようにしたいのですよね。

わたしとしてはまだこれについてはいい方法を知りません。
もう少し勉強してみて、なにかわかりましたら、すぐにお知らせいたします。

Q34:すごく、単純なことで申し訳ないのですが、 何をどう頑張ってやっても、Enabledの値が変更できません。
わたしの使ってるVBがおかしいのですかねぇ。
ちなみにバージョンは6.0です。
サンプルのコードを下に書きます。

Private Sub cmdStart_Click()

frmMain.cmdExit.Enabled = False
frmMain.cmdHelp.Enabled = False
frmMain.cmdMelt.Enabled = False
frmMain.cmdNewsPaperPrint.Enabled = False
frmMain.cmdSyutubahyou.Enabled = False
frmMain.cmdWARS.Enabled = False
frmMain.cmdYosou.Enabled = False

   …

End Sub

ってな感じです。
助けてください。(MSさん[00/05/01])

A34:む〜、不思議な現象ですねぇ。

ひょっとして、と思っていろんなパターンを試してみたのですが、変更できないことはありませんでした。
考えられるのは、なんらかのイベントプロシージャに、同じコントロール群の Enabled プロパティを True にするコードが書かれていないか、とういことです。

たとえば Timer イベントであったり、LostFocus イベントであったりすると、他のプロシージャの実行中でもジャンプしてしまう可能性もありますから。

あるいは、Enabled プロパティを False に設定する直前になんらかのイベントが発生し、そちらに制御が移ったまま戻ってこない場合もあり得るでしょう。

デバッグモードのステップ実行で一行一行、F8キーで経過を見ながら実行してみてください。
.Enabled = False の実行直後でなおコントロールが有効で、かつエラーメッセージも出ないようであれば、何かがおかしいか壊れている可能性があります。

あと、Windowsカラーなどを変更した場合で、256色環境などの場合、有効と無効が外見的に区別できないこともあるかも知れません(まずないと思いますが)。
これについては、実際にコントロールが使用できるかどうかで確認するしかないですね。

Q35:どうも上手くいかない部分が有ってご質問させていただきます。

@会社で、OCXで、パスワードを入力する部品を作りました。
 そのコード、OCXはネットワークにあります。
AそのOCXを使用したプログラムを作成しこれもネットワーク上に置きました。
BVB付属のセットアップウイザードでOCXのセットアップファイルを作成しました。
Cクライアントにセットアップして、AをのプログラムからOCXを起動したところ、OCXの設定が適切に登録されていません。というメッセージが表示されてしまいます。

そもそも、OCXの作成の仕方自体あまりよくわからなかったので、ネットワークを使用した 場合のOCXの作り方が違っているのでは?と考えています。
思い当たる部分があれば、ご教授願えますか?(新米プログラマさん[00/05/02])

A35:ええっと、ちょっと話がややこしいのですが、ActiveXコントロールをプログラムで使用するには、そのプログラムが実行される環境に ActiveXコントロールがセットアップされている必要があります。

たとえば、クライアントからサーバにあるプログラムを実行する場合、クライアントにそのコントロールがセットアップされていなければいけません。

これはなぜかというと、クライアントのメモリにプログラムがロードされ、クライアントで実行されるので、そのプログラムはクライアントにコントロールのインスタンスを要求するからです。

簡単にうまくいく方法としては、プログラム本体のセットアップを作成すれば、それに使用されているコントロール(自作も含めて)のセットアップも同時に取りこんでくれるので、確実に動作可能な環境を作ることができます。

作成した環境でプログラムが正常に動作しているのなら、それで間違いないはずです。
もし作成した環境でも正しく動作しないのであれば、OCXの作り方を間違えたか、プログラムのほうの呼び出し方に誤りがある可能性もあります。

Q36:シリアルポートを利用して外部機器(テスター)からデータを受け取ってそれを表示させたいんですが、 どうもシリアルポートの設定などがわかりません。
いろいろな参考文献を調べているんですがどれも詳しく載っていません。是非教えてください。(タクターさん[00/05/11])

A36:シリアルポートを利用したデータ通信は、VBの標準パッケージではサポートされていません(と思います・・・)。

技術的にはおそらくシステムがシリアルポートと通信するときに使用しているドライバから情報を受け取るような形になるのではないでしょうか。
これは推測ですが、CやC++でこの機能を実装する場合には、Windowsからのメッセージを取得することでデータを受け取れるのだと思います。ですが、VBにはWindowsのメッセージをフックしたりコールバック関数に引き渡す機能がありません。

いちばん簡単な解決方法は、市販のActiveXコントロールを利用することです。
こういったVBで実現の難しい機能は、ひととおりサードパーティ製のActiveXコントロールが揃っています。

Q37:インターネットから、どこかのパソコンにアクセスして、ファイルを印刷するには、(スプールを使って)どうしたら良いでしょうか.
使っている環境は、NT4.0servicepack5です.(hiromuさん[00/05/11])
A37:まず、Winsockコントロールを利用して通信アプリを作成し、プリンタサーバとクライアントの両方でそのアプリを起動しておきます。
アプリの仕様は、サーバ側はある一定のヘッダーを持ったメッセージを受信した場合に、本文の部分をデータとして印刷する、というもの、クライアント側は指定したサーバにヘッダーを付加して印刷データを送信するものにしておきます。
両方である決まったポートを利用するよう設定し、ネットワーク管理者にはファイアウォールのそのポートが使えることを確認しておきます。
これで、クライアント側でファイルを開き、データにヘッダーをつけて送信してやれば、それを受信したサーバ側でアプリがそれを認識し、印刷してくれる、というわけです。
セキュリティが心配なら、ヘッダーに認証情報や暗号キーなどを埋めこむことで対処できるでしょう。
Q38:VB(Windows32API)で、プロセスの状態を見るプログラムを作りたいと思っています。
で、よく、APがフリーズしたときに、 Ctrl-Alt-Delで、プロセスの一覧を出して 「応答なし」になっているのを見かけるのですが、 それを、プログラムで実装することはできないでしょうか?
プログラムで外部APを立ち上げるところがある のですが、どうもそのAPの調子が悪くて、すぐフリーズしてしまいます。
なので、そのプロセスを監視していて、応答なしになったら、強制終了 させるようにしたいのです。 (「よろしくです」さん[00/05/15])

A38:まず先に、外部プロセスを終了させる方法を説明します。
APIのFindWindow関数で、クラス名やウィンドウキャプションから目的のウィンドウのハンドルを取得し、そのハンドルを利用してPostMessage関数で WM_DESTROY メッセージを送ってやれば、強制的にそのウィンドウを閉じることができるはずです。

問題は応答なしかどうかを取得する方法ですが、他の質問・回答でも触れているように、VBではWindowsの任意のメッセージを受け取ることができません。
その相手プロセスが、自分でVBで作成した(または作成する)アプリであれば、 一定時間ごとに WM_MBUTTONDOWNメッセージ(マウスの中央ボタンが押された、の意)を送り、それを Form_MouseDownイベントで取得してやることで、生存確認ができますが、そうでないアプリの場合にはそれができません。

Q39:VB6.0のチャートコントロールで、一つのSeriesCollectionで特定のデータポイントだけ マーカーのスタイルを変えるか、またはそのポイントだけ データラベルを付ける方法はありませんか?(ヤマモさん[00/05/18])

A39:一つの項目だけにデータラベルをつけるには、以下のようにします。

MSChart1.RowLabelIndex = 4
MSChart1.RowLabel = "このデータに注目!"

この例では、4つめの項目のみにデータラベルを設定しています。
要するに RowLabelIndex プロパティを設定したあと、その位置のラベルを設定する、というコードですね。

Q40:VBでのサムネル映像って皆さんどうやって作成しているのでしょうか?
画像を縮小しほぞんできるのでしょうか?
こちらまったくの初心者でどうやっても出来ません。(hisashiさん[00/05/21])

A40:ピクチャボックスではなく、イメージボックスを使えば簡単にできます。
イメージボックスは、StretchプロパティをTrueに設定しておくと読みこんだ画像を自動的にボックスのサイズに合わせて拡大・縮小して表示してくれます。
縦横の比率を変えたくないときは、一度VisibleプロパティをFalse、AutoSizeプロパティをTrueに設定したピクチャボックスに読みこんでやって、そのピクチャボックスのWidthプロパティとHeightプロパティを調べると画像の縦横のサイズがわかりますので、それをもとに計算して(たとえば0.5をかけてやる、など)、イメージボックスのサイズを変更しておいてから画像を読みこめばいいわけです。

表示は以上の方法で可能ですが、縮小されたイメージを保存するには別の方法が必要です。
簡単なのはAPIのStretchBlt関数を使って画像を縮小してもうひとつのピクチャボックスにコピーし、ImageプロパティをPictureプロパティに代入してからSavePicture関数で保存してやればOKです。
ただし、この方法ではWindows標準の拡縮アルゴリズムが適用されるので、あまり画質的にはよくないです。

Q41:今、VB6でAcviteドキュメントを作成しています。 作成は、通常のEXEを変換させて結構簡単にできてしまいました。
しかし、ディストリビューションウィザードでwwwサーバーに、設定することができません。 手順は、 「パッケージ」-->画面従う。 「配置」-->画面従う。
としたのですが、「配置」の最後の「完了」ボタンをクリック すると、 「予期せぬエラーC0042116が発生しました。パラメーターが正しくありません。」
と、なってしまいます。 開発は、Win98SP1、wwwサーバーは、NT4.0SP6+VS6.0の サーバー...をセットアップして有ります。
「パラメーターが正しくありません」といわれてもウィザードがやってるんだから...よくわかりません? ウィザードの途中の指定がいけないのか?
この位の状況説明でわかるでしょうか? Acviteドキュメント関連は書籍でもさらっとしか記載がなく、 ディストリビューションウィザードのインターネットの方も
あまり乗っていません。 この手の、情報って皆さんはどうやって仕入れてるんでしょう? ちなみにxxx.vbdをCopyして、関連DLL等がクライアントに
あれば、IEで動作はできてます。(Hopeさん[00/05/24])

自己レスです。 ディストリビューションウィザードで「配置」のなかで、 urlを、「http://192.158.1.1/aaa」としていたを、
「http://192.158.1.1/aaa/」と、最後に"/"を入れたらWWWサーバーに配置できました。
しかし、そこに配置したxxx.vbdをIEで見ると、関連のActivexがDownloadされない様で、開くアプリケーションを 聞いてきます。
これではウィザードを使わずにftpでコピーしたのと同じだ!!! ウィザードが、その辺をうまくやってくれるんじゃないの?
一歩進んですぐ止まった。この辺のこと何かご存知ですか?(Hopeさん[00/05/25])

A41:まず、ActiveXドキュメントに関する資料ですが、Visual Basic Books Online が最も詳しく説明しているかと思います。
VBのインストール時にオプションでインストールできます。
ただ、詳しいと言っても、簡単な手順の解説と例が載っているだけで、それ以上のトラブルシューティング的なものは期待できませんのであしからず。

それから、vbdファイルにアクセスしたときのIEの動作なのですが、どうにも不思議なことに、環境によって動作が異なります。
なぜ?と聞かれたらまったくお手上げで、Microsoft の技術担当者にでも聞かないとわからないかも知れません・・・。

考えられる原因としてはサーバがActiveXをサポートしているかどうか(Webサーバの大半はLinuxなのであまり期待できないが、奇特なWindowsNTサーバであれば可能かも)がカギかも知れません。

このへんの情報はさらに詳しく調査をすすめますので、解り次第改めてお答えしたいと思います。

Q42:ODBCを使用し、ORACLEのデータを変数に格納していますが、LONG型のフィールドが取得できません。
マニュアルを読むと、GetChunkで取得すると書いてありますが、エラーになってしまいます。
申し訳ございませんが、教えてください。(寶正智弘さん[00/05/26])

A42:これだけでは状況がよくわからないのですが、考えられる問題としては「変数の型変換をしていない」ということです。
オブジェクト変数にダイナセットを読みこみ、フィールドにアクセスする場合、フィールドの値はすべてVariant型になっているはずです。
これをLong型にするには CLng関数で変換をしてやる必要があります。
これが抜けていると、「型が一致しない」というエラーになります。

Q43:VB5で作られたプログラムで、クリスタルレポートを使った帳票印刷があります。
この処理をACCEES97に移行して同じようにActiveXのクリスタルレポートを使って印刷するようにしたのです。
処理自体はうまく動くのですが、処理を終わらせるとACCESSが残ってしまって終わりません。(デスクトップ上では終わっているように見えるが強制終了の画面を開くとMSACCESSが残っていてメモリーもちゃんと食っている)
ACCESSが終わらない現象は、サブフォームからメインフォームの関数の戻り値云々で発生することはあるのですが、今回はあきらかにクリスタルレポートに原因があるようです。
どなたか、ACCESS97のコードでクリスタルレポートで印刷するときの正しいコードの書き方をご存知の方がいたら教えてください。(はかまたひとしさん[00/05/26])

A43:う〜ん、これは技術うんぬんより、Accessのバグの可能性のほうが高いですね・・・。
VBというよりVBAなわけですが、VBAで End ステートメントって有効に使用できるんでしたっけ?

ちょっとイマイチこれはわからないです。ごめんなさい m(_ _)m

Q44:WindowsNT4.0上でVB5.0 Enterpriseを使用して開発をしようとしているのですが、RDOを使用しているプログラムのEXEファイルを作成しようとすると、コンパイルエラー書き込みできません。と表示されてしまいます。
エラーの場所は、set En = Rdoenviroments(0)の行で止まります。
何がいけないのか困っています。
ちなみに、他の開発環境では問題ありません。(n.maruyamaさん[00/06/01])

A44:実行はできるわけですね?
となると、RDOのオブジェクトを参照するところがエラーになっているわけですから、参照ができない状態になっているのではないかと思います。
NTの場合はDLLの実行や更新などにユーザごとの権限が設定できると思いますが、もしかするとAdministrator権限でないと許されないようにできているのでしょうか?そんなことあるかな?ん〜〜
他の環境で問題がない、ということですから、NTの特性に関係ありそうな気がするのですが。

Administratorで実行して試してみるとよいかも知れません。
また、VBアプリのEXE作成はやはりWindows9Xで行ったほうが無難かも知れません。

Q45:現在VB4.0でACCESS95(V7)のテーブルを登録、更新、削除 しているのですが、会社の標準OFFICEをOffice2000にする方向で考えているのでVB4.0でACCESS2000のテーブルを変更するようにしたいのですが、うまくいきません。
DAOを使ってやるにはどのようにしたらよいのでしょうか?(NORIさん[00/06/01])

A45:ん〜、Access2000使ったことないんですよね〜。
今までに聞いた話では、従来のAccessとの互換性はあまり期待できないらしいんですが。

わたしが未知の参照オブジェクトをVBで使うときによく使う手は、オブジェクトブラウザでプロパティやイベント、メソッドを解析することです。
説明は不十分なことが多いですが、とりあえず呼び出し形式や返値の型などはわかりますので、あとは名前による類推と試行錯誤 でなんとか方法を覚えていくわけです。

あくまで想像ですが、基本はたぶん今までの方法と大差はないはずです。
一番簡単なのは.ExecuteSQLでSQL文を発行し、返値のオブジェクト変数でレコードセットを取得し、それぞれの値にアクセスする方法です。
SQLはDBの基本操作一式を使うことができますし、同じ方法で異なるDB機能が使えるのでラクです。

Q46:VisualBasic6.0Proを使っているのですが、Excelのマクロで言うとこの、「Rank」みたいな関数は、ありませんか?

配列変数 a(1 to 10)の中に入っている値を小さい順(又は大きい順)ランク付けしていって、配列変数 Rank(1 to 10) の中に、そのランクを代入したいのです。

何か、良い例題などありましたら、ご指導のほど、よろしくお願い致します。(MSさん[00/06/03])

A46:ずばり、そういう機能を持った関数、というのはありません。残念ですが。
いわゆる「ソート」というやつですが、N-BASICの時代からプログラマが苦心していろんな方法を考え、使用してきました。
プログラミングの世界では初歩的なアルゴリズム研究の第一歩という感じです。

実際にどうやるかですが、たとえば上記の例でいくと、以下のようになります。

◆最初にRank() のすべての要素を、0(配列aがすべて正の場合)で初期化しておく
◆n=1〜10までのループの中で以下の処理を繰り返す
 1.a(n)をRank(n-1)からRank(1)へと逆順に比較していく
 2.初めてa(n)より小さい値が現れた位置がmの場合
  (1) s=2〜mのループ内で以下の処理
    ・Rank(s)の値をRank(s-1)にコピーする
  (2) Rank(m)にa(n)の値をコピーする

この方法でRank(1〜10)は小さい順に並んだ値となるはずです。
一度お試しになってみてください。

Q47:環境:VB6.0(SP3)、WIN98SE
標準EXEで作成したアプリケーションを参照設定でActiveXEXEコンポーネントを追加して、そのコンポーネントをモーダル設定で呼び出したのですが呼び出したコード(クラスモジュール)
Public Sub frmZsituChgShow()
Load frmZsituChg   <-----ActiveXEXE
frmZsituChg.Show vbModal
End Sub

デスクトップなどウィンドウと違う個所を何度かクリックすると「コンポーネントを使用を使用できません」をダイアログボックス「切り替え」「再試行」「キャンセル」のボタンが表示
モーダル表示で常に出力して欲しいのですがどのようにすれば良いのでしょうか?(みよさん[00/06/06])

A47:frmZsituChg.Show vbModal の部分で、親フォームの指定が抜けていますよね?
親となるフォームを省略した場合、ハンドル0、つまりデスクトップを指定したことになるのではないかと疑われます。

まず、 vbModal, Me あるいは vbModal, frmMain のように明確に親フォームを指定して試してみてください。

Q48:ActiveXの.cabファイルはデジタル署名というのが必要らしいというところまではいったのですがそのやり方に手間取ってます。 それで調べた結果わかった手順は
1、証明機関から証明情報を取得(自分でも作って発行できた)
2、ActiveX SDKにコードに署名するのに必要なツールが含まれているので署名するファイルを作成する。
  .cabファイルに署名するには.dllファイルに次のエントリを追加して.cabファイルを再作成する。
.SetReservePerCabinetSize=6144
3,ActiveX SDRのツールを使用してファイルに署名、例は
Signcode -prog myfilename -name displaymame -info http://www.mycompany.com
-spc mycredentials.spc -pvk myprivatekey
4, chktrust -c cabfilename.cab を実行してテストしてみる。
するとテスト実行後、認証情報が表示

らしいです。 しかしよく分からなくて出来ないでいます。
掲示板で調査中となっていたので、この方法で試してみてほしいのですが・・・(成田広昭さん[00/06/07])

A48:え〜〜っと・・・ActiveX SDKというのが手元にないもので、試すことができません。
しかし、この方法が正しいとすれば、ActiveX認証問題でお悩みの方には朗報だと思います。

わたしもいずれ機会があれば試してみたいと思います。
ただ、ActiveXドキュメントやActiveXを利用したWebアプリケーションは、あまり作りたくないというのも本音ですが(苦笑)。

Q49:当方は、最近VB6.0のIISアプリというのを使ってwebアプリをつくっています。
従来、ASP+VBScriptをテキストエディタで記述していたので、デバッグが大変でした。
この、VB6.0のIISアプリ+ASP dllを使うと、従来のVBアプリ作成と同様の環境になり重宝しています。

質問というのは、VB+IISアプリ+ASP dll + ADO dllのことで、webアプリで動的なページを作成するにはデータベース導入が不可欠です。

それでADOを使う場合、ConnectionオブジェクトとRecordsetオブジェクトを多用するのですが、このConnectionオブジェクトの変数スコープがうまくいきません。

従来のASP + ADOなら、 あるASPファイルの先頭行あたりに
dim cn
set cn = Server.CrieateObject("ADODB.CONNECTION")
cn.Open ,"database;pass....."

のようにConnectionオブジェクトをモジュール変数にて生成しておけば、以下のプロシージャーからは、接続済みのConnectionオブジェクトをcnという変数名にて使用できますが、VBのIISアプリでつくった場合、ASPファイルというのは、VBが勝手につくって、作者がここに手を加えるようなものでないし、また、VBのモジュール内にモジュール変数としてConnectionオブジェクトをつくって、WebClassスタートイベントにて、Connectionオブジェクトを作成しても、webページを移動すると、作成したConnectionオブジェクトの参照ができなくなります。(参照ができないというより、OpenしたはずのConnectionオブジェクトがOpenされていない、といわれます)

ですので、解決策として、dbアクセスをするプロシージャごとにConnectionオブジェクトを宣言し、その中で逐一接続します。
webアプリの動作の中で反応スピードに影響するのは、この接続に要する時間です。
現状だと、その都度、接続時間を要していますから、とても無駄に思います。
なんとか、WebClass内で接続を継続させておく手だてはないものなのでしょうか?

苦し紛れに、標準モジュールを追加し、そのなかでPublic 変数でConnectionオブジェクトを定義しましたが、ローカルマシン上ではうまくいくようですが、サーバーにアップするとどうもうまくいきません。

使用環境
web Server : WinNT 4.0 IIS4.0

(平山さん[00/06/08])

A49:ん〜、だいたい問題の本質はわかった気がするのですが・・・。

これはやっぱりそういう仕様なんじゃないでしょうか?
つまり、ブラウザで特定のページにアクセスしている間は明確なサーバとクライアントのコネクションが成立しているので、データベースとのコネクションに問題はなさそうですが、他のページに移動した場合には、サーバとクライアントの接続が保証されないため、データベースとの接続を継承するわけにいかないのではないかと思うわけです。

そうしないと、何をもって、どのタイミングで接続を閉じるのかといった問題が逆に発生するわけですよね?

で、この場合、サーバアプリケーションなので、データベースのレコードセットなどはサーバのメモリ上に展開されるのですから、セキュリティ上もそういう設計にせざるを得なかったのではないかと推測されます。

Q50:VB6でLabelのCaptionにワードなど文章作成ソフトで作ったテキストをコピーして張り付けると、一部のPCで文字化けが起こってしまいます。
ちなみに相手は皆Windows98です。 対策として以下のコードを書いてみたのですが、エラー13が表示されてしまいます。 どうしたらよいでしょう。 (ペルシャさん[00/06/08])

Private Sub Label1_Click()
  Dim a As String
  Dim StrUnicode As String

   a = Label2.Caption
  ReDim bytSJISArray(80)
  bytSJISArray = StrConv(a, vbFromUnicode)
  StrUnicode = StrConv(bytSJISArray, vbUnicode)
End Sub

A50:このコードではUnicodeをShiftJISに変換しているようですが、おそらく文字化けの原因はそれではないと思います。

MSWordで作成する文章は、いわゆる「書式つきテキスト」というやつで、たとえばHTMLであるとか、リッチテキストのようなものなわけです。
これには文字サイズや文字色、フォントなどが含まれており、普通のプレーンテキストとは異なっています。
リッチテキストファイル(rtf)をテキストエディタで開くとわかりますが、何やらタグのようなものでそれを表現しているようですね。

クリップボードのデータ形式にも RTF(リッチテキスト形式)と TEXT(プレーンテキスト形式)がありますので、単純にWordからコピーすると、クリップボードのデータは RTF になります。

これを回避するには、ClipboardオブジェクトのGetTextメソッドで形式に vbCFTextを指定してやれば、RTF形式のデータであっても、書式を取り除いたプレーンテキストとして読み出すことができます。

strMyString = Clipboard.GetText(vbCFText)

こんな感じですね。

Q51:はじめまして、VB6(SP3)での質問なのですがデータコントロールでExcel2000扱うにはどうすればいいのでしょうか?
RecordSourceを設定しようとすると、"組み込み可能なISAMドライバがみつかりません"との、エラーがでます。
ConnectではExcel8.0を選択しています。
Excelなどは、Office2000で標準インストールしました。

A51:VBからExcelやAccessなどのデータを利用するには、VBに付属しているデータドライバが必要です。

VB6の発売開始当時、Office2000は発売されていませんでしたので、VB6のパッケージには当然Excel2000に対応したドライバが含まれていないはずです。
おそらく、Microsoftのサイトで対応ドライバのダウンロードが可能ではないかと思いますので、探してみてください。

Q52:VBアプリの配布FDを作ろうとしたのですが、なんと、セットアップウイザードが立ち上がりません。(^^;;
とても困っています。

メッセージは:
   プロパティが不正です。
   予期せぬエラーが発生しました。
とでます。
何か考えられる原因等がおわかりでしたら
ご教授いただけませんか?(E.Dannoさん[00/06/16])

VB5.0(SP3)・Windows98

A52:VBからの実行はできるのですよね?
何か自作のActiveXコントロールが含まれていたりしますか?
それにしても「プロパティが不正」というメッセージは解せませんね・・・。

可能性としては、フォームやモジュールの名前が、それ自体に記録されているものとvbpファイルのものとで食い違っているとか、名前が長すぎる、あるいは日本語の名前をつけている、などということも考えられますが・・・。

何かお心当たりありますか?

Q53:さっそく質問なんですが、VBでの印刷についてです。
環境は、下記の通りです。

=====================  WindowsNT4.0 WS SP3  IE 4.0  VB5.0 SP3 =====================
=====================  Windows2000 Pro  IE 5.0  VB6.0 SP3 =====================

VB5.0でPrinterオブジェクトを使用してネットワークプリンタから印刷を行うとき、用紙サイズの変更が行えません。MSのサイトをみると「NT4.0では印刷ダイアログで設定した値は有効にならない..とか、VB5/VB6のPrinterオブジェクトでいろいろ問題がある...とか...書かれています。」
http://www.microsoft.com/JAPAN/support/kb/articles/J041/4/03.htm
http://www.microsoft.com/JAPAN/support/kb/articles/J045/7/77.htm
http://www.microsoft.com/JAPAN/support/kb/articles/J042/9/59.htm
上記URLを参照して下さい... そこで、本題ですが上記URLを参照するとVB6においては全てAPIで印刷しなければならないというような事が書かれています。私のレベルではもうお手上げです...(o_o;
VBで全てAPIより設定、印刷する方法をご教授下さい。参考になるサイトや、書籍、及びサンプルコードなどがあればぜひ!よろしくお願い致します。(まことさん[00/06/16])

A53:そうですねぇ、通常の印刷なら Printer オブジェクトでもほぼ問題なくできます。
ただ、確かに用紙サイズの変更とか、プリンタの設定にアクセスするのはVBでは限界があります。

これは、プリンタの機種ごとの機能の違いや、ドライバがサードパーティ製であったりすることに起因しているようです。

APIで印刷するとなると、プリンタのデバイスコンテキストを取得し、そこにイメージを転写するような処理が必要かと思います。
DOS時代にC言語でやっていたようなことをやるわけですが・・・これはけっこう難儀だと思います。

やはり多少難があっても、Printerオブジェクトを利用して印刷するようにして、問題のある部分は他のことで対処するしかないかも知れません。
ちなみに、わたしも仕事でVBから印刷する部分でつまったとき、VC++で印刷用モジュールを作ってもらったことがあります。(^-^;

Q54:VBを始めて間もないのですが今、インターネットの登録フォーム(懸賞とかの)にクリップボードの情報を貼り付けるツールを作っているのですが、コピー&ペーストでの貼り付けには成功したのですがドラッグ&ドロップの機能をもたせたいのですがどうしても出来ません。どうか教えてください。(のりさん[00/06/19])

A54:まず、対象はテキストボックスであるという仮定で説明します。

テキストボックスにD&Dされたテキストを取得して表示させるには、まずOLEDropModeプロパティの設定を「1−手動」にします。
そして、 OLEDragDropイベントにドロップされたときの処理を記述します。
このイベントの引数にあるDataというオブジェクト変数に、ドロップされたデータの内容が格納されています。
まず GetFormat メソッドでデータの形式がテキストであるかどうかを判別します。

If Data.GetFormat(vbCFText) <> 0 Then Exit Sub

↑これはテキストでないときは処理を抜ける、という意味ですね。
あとはGetTextメソッドで実際のデータを受け取り、テキストボックスのTextプロパティに入れてやるだけです。

テキストボックスから他のアプリにD&Dした場合には、OLESetDataイベントが発生します。
このイベントの引数にある Data というオブジェクト変数にデータをコピーして、DataFormatに形式を表す定数 vbCFTextを入れてやれば、相手アプリにデータが送信されます。
テキストボックスの内容すべてをコピーするときはTextプロパティの値を直接入れればOKですが、選択範囲だけをコピーしたときには次のようにします。

Data.SetText txtEdit.SelText

SelTextプロパティは、選択されて反転している部分の内容を示します。

Q55:新しい月になったという、判定がしたいのですが。。
たとえば6月から7月に変わるとき、レジストリを変えたりしたら一番初めの状態に戻したりしたいんです。(ありありさん[00/06/19])

A55:これだけでは実際にどういう処理をしたいのかがよくわからないのですが、実行中にリアルタイムで月の変わり目を知りたいのであれば、次のような方法があります。

・タイマーを配置する
・タイマーイベントで次のように現在の月を取得する
 CurrMnth = CInt(Val(Format(Now, "m")))
・取得したら、前回取得して別の変数に保存しておいた内容と比較して、変化していれば月が変わったことになるので、目的の処理を実行する。

あるいは、アプリの起動ごとにチェックしたいのであれば、Form_Load または Sub Main でレジストリに前回保存した情報と、上記のようにして今回取得した内容を比較すればOKです。

Q56:こんにちは 現在バーションが古いですが機種 :コンパックDeskpro Pentium333Mhz アプリケーション : VB4.0 、クリスタルレポート4.5、 MS-Access97 OS : WindowsNT4.0 SP5 で開発しています。
VBよりmdbファイルにデータを保存してクリスタルレポートで出力をしようとしていますが、以下のエラーが発生しています。
「20534:データベースDLLからエラーがかえされました。」 別のマシン(コンパックDeskpro Pentium450Mhz)で上記プログラムを実行するとエラーが発生しません。
クリスタルレポート関係のDLLのバージョンを確認していますが同じのようです(見落としがあるかもしれませんが)
上記のようなエラー発生についてご返答いただければ幸いです。 よろしくお願いいたします。(「どくちゃん」さん[00/06/20])

A56:Q44にもあるように、どうもDB関係のモジュールとNTとは相性が悪そうですね・・・。
で、DLLのバージョンの確認ですが、クリスタルレポート関係のものより、DAOやODBC関連のものをチェックしたほうがいいかもしれないですね。Jet関係もアヤシイ場合がありますし。

具体的な詳しいことはわかりません。ごめんなさい m(_ _)m

Q57:起動されるEXEの引数にスペースがある場合うまくいきません
例えば、ワードの引数に "C:\Program Files\TEST.doc" を入れた場合 Shell、ShellExecute、CreateProcess などを使ってみたけれどだめでした。
うまくいく方法ありますか?(chiba atsushiさん[00/06/23])

A57:これはロングファイルネームに絡んだ問題です。
このケースに限らず、たとえば MDIコマンドの呼出しでのファイル指定でも同じ問題が起きます。

答えは簡単です。ファイル名の前後に「”」ダブルクォーテーションをつけるだけです。

コマンドラインでは、スペースはファイル名や引数の切れ目として認識されるため、スペースを含むパスを指定するときにはダブルクォーテーションで囲む、という規則があるのです。
DOS時代にはスペースを含むパスは存在し得なかったので、問題がなかったわけですね。

「ファイル名を指定して実行」のときにも関係しますので注意しましょう。

Q58:始めてで お聞きするのですが すいません。

マウスの動作を バックグラウンドで 動かすには どうすれば
いいのでしょうか?と いうより 出来るのか?

お手数ですが、教えて頂けないでしょうか?(北川智晴さん[00/06/24])

A58:「バックグラウンドで」の部分の意味がちょっとわからないのですが、こちらで解釈した意味で説明します。

1.マウスカーソルを非表示にする
 スクリーンセーバなど、全画面を占拠するアプリの場合なら、フォームのMousePointerプロパティを「99-ユーザ定義」にして、MouseIconプロパティに透明色だけで塗りつぶしたアイコンファイル(.curではなく.ico)を読みこんでやればOKです。
アイコンはアイコンエディタなどで作成します。

2.マウスポインタを任意の位置に移動する
 APIのSetCursorPos関数で、スクリーン座標(デスクトップの座標系)の任意の位置にマウスポインタを移動させることができます。

1.の方法は拙作のスクリーンセーバなどで実際に使用しています。

Q59:ACCESS2000のレコードが正常に削除できません。
Dataコントロールを使うと問題なく.deleteで削除できましたが、adodcを使って削除しようとすると、[クエリーが複雑すぎる][設定が不十分][すでに削除されている]のエラーが発生する時と問題なく削除できるときがあります。
解決策を教えてください。(hkawaさん[00/06/25])
A59:ん〜、エラーの種類が違うのと、出ないときがあるのと、ということであれば、やり方になにか不備があると考えるのが普通のような気がします。
Dataコントロールで正常動作するのであればなおさらです。
もう一度コードや設定を見直してみてください。
Q60:現在、ActiveXコンポーネントを作成して、ブラウザ上で動作するアプリケーションを作成する予定なのですが、何点か質問があります。
・同一ページ内に異なるActiveXコントロールを複数 配置した状態で、それぞれ異なるコントロールの メソッド、プロパティを更新することは可能なの でしょうか?
・また、別ウインドウのコントロールを同様に 操作することは可能なのでしょうか? (とまとさん[00/06/28])

A60:これは検証したわけではないので何とも言えないのですが、まず同じページの複数のActiveXコントロールの場合、おそらく互いのプロパティにアクセスすることはできないと考えられます。
同じドキュメントに複数のフォームやコントロールが配置されていて、そのドキュメントがWebページに配置されているのであれば可能かもしれません。

また、別ウィンドウについてはほぼ間違いなくできないものと思います。

Q61:先日、VB6でプログラムを作成して客先に納品しました。OSはNT4.0 SP5 です。
プログラムの中でファイルコピー処理を行うのに、SHFileOperation関数(Shell32.dll)を使用しています。
ところが、ファイルのコピー実行中のダイアログで以下の現象が報告されました。

 1.「キャンセル」ボタンが効かない
 2.フレームリレーを介したネットワークドライブへのファイルコピー中にロックする

1.については、早速自社で調査したところ、どうやら Shell32.dll のバージョンの問題のようです。
Shell32.dll を Ver4.0 から Ver4.72.3110.6 に差し替えると解消しました。
2.については、自社に環境がないこともあって、Shell32.dll を差し替えての調査はできていません。

そこで教えていただきたいのですが、Shell32.dll は、バージョンによってはバグがあるのでしょうか?
また、上記の現象について、何か他に考えられる原因が分かれば教えてください。(太田垣さん[00/06/30])

A61:バグ、というよりは設計ミス、仕様ミスかも知れませんね。
Shell32.dll は、基本的にOSそのもののバージョンと並行してバージョンアップしています。
NTの場合だと、サービスパックでバージョンアップしていることもあると思いますし、Windows9XでもWindowsUpdateの修正モジュールなどを導入するとバージョンが上がっていることがあります。

Microsoftは常に最新のモジュールを使用することを推奨していますが、それはつまりいつまでたってもバグがある、ということを言っているのと同じことです(決して認めようとはしないでしょうが^^;)。

ネットワークがらみの不具合のほうは、それだけが原因とは断定できないかもしれません。
LANボード(カード)やドライバの問題、ネットワーク設定の問題など、チェックすべき点はたくさんありますね。

Q62:VB6のセットアップディスクの容量を最小化する方法で困っています。
VB6で簡単なアプリ(MS-DE対応)のセットアップディスクが10Mbytesもあり、困っています。
原因は、DBアクセスするためのオブジェクトというところまでは、解ったのですが、MS-DEを使用するアプリでセットアップディスクを3Mbytes程度まで縮小する方法をご存知ではありませんでしょうか?(「はるちゃん」さん[00/07/05] )

A62:最初に結論から言うと、ありません。
できることは、たとえば以下のようなことです。

1.セットアップ先にVB6ランタイムが既に入っているか、あるいは別に入れるようにしてもかまわない場合、下記のファイルをセットアップから除外できます。
 AsycFilt.dll
 Comcat.dll
 Msvbvm60.dll
 Msvcrt40.dll
 OleAut32.dll
 OlePro32.dll
 VB6jp.dll

2.コモンダイアログコントロールや Windows Common Controls などを使用している場合、面倒でも標準コントロールの組み合わせで同機能のものを作ることで、Ocx と dll をセットアップから除外することができます。

この2つを実行しても、おそらく2〜3MBくらいしか減らすことができません。
どうしても大き過ぎて話にならない、ということであれば、他のDBを利用することをお勧めしますが・・・。
いずれにせよ、DBを利用するアプリが巨大化するのは避けられない宿命のようです。

Q63:ODBC経由で、クリスタルレポートに印刷させたいのですが、うまくいきません。
印刷用のデータはACCESS2000のテーブルを基にしています。
ちなみに下記のコードで試しているのですが、Actionの行でSQLサーバーエラーが表示されます。
ACCESS97だとうまく印刷してくれるのですが・・・
CrystalReport1.ReportFileName = App.Path & "\report\zaikoprn.rpt"
CrystalReport1.DataFiles(0) = App.Path & "\DATA\JDATA.MDB"
CrystalReport1.Action = 1
(じぇっとさん[00/07/05])

A63:Access2000とVBのトラブルは他の質問にもありましたね。
経験がないので何とも言えないんですよ。
ただ、VBにしろクリスタルレポートにしろ、Access2000より先に存在していたものですから、整合性が取れないのもありえない話ではないわけで、もともと期待通りの動作をするものではないのかも知れません。

このへんは宿題ということで、さらにいろいろ調べるつもりではいますが、いかんせん実環境が手元にない・・・とほほ