| 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 があります。 |
| 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をアンインストールする。 ただし、これは未検証の方法ですので、確実に有効である保証はありません。 できるかぎり、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 |
| 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側だと思うんですが、トランザクションをウエートで発行しても、恐らくまだ、物理的にデータベースに
データが、書き込まれないうちに書き込み済みのステータスだけが、先に帰りレポートのアクションを起こします。 |
| 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 を作成し、ユーザードキュメントにコマンドボタンを配置します。 この 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が第一ドライブです。 また、DOS/V機ユーザでも、パーティションを切ってCドライブは Windows などのシステム用、アプリやデータはDドライブ、というように分けている方も多いので、勝手にCドライブにインストールされては困る、ということになります。 通常、フォルダの概念がわからない方は、そのままOKボタンを押すと思われますので、あえて指定できなくする必然性はないと思われますが、いかがでしょう? |
|
Q23:NT4.0 VB6.0にて先物取引のグラフを自動生成する プログラムを 作成しています。 |
|
A23:まず、GIFという画像形式は特許技術なので、その変換をサポートするアプリは特許料を支払わなくてはならないのです。 そのため、オンラインソフトなどでも、かつては Susie という画像ビューワのプラグインなどで GIF 変換できるものがあったのですが、公開を中止しているようです。 あるいは市販の ActiveX コントロールなどでは、ちゃんと特許料を支払ったものがあるかもしれません。 アプリケーションの設計段階での検討であれば、グラフの作り方から見直せば、いろんな方法があるのですが、とりあえずすでにビットマップにグラフが出力された状態での解決法ということで考えます。 それには、ActiveXドキュメントを使用する方法があります。 あまりスマートな方法ではないのですが、ピクチャーボックスのみを持つフォームをActiveXドキュメントEXE のプロジェクトに追加して、そのピクチャーボックスにビットマップを表示させれば、ブラウザでもビットマップを表示できる、ということですね。 VB Books Online などに ActiveXドキュメントについて解説が載っていますので(わかりにくいですが)、そちらをご参考になさってみてください。 |
|
Q24:VB6でフォーム上に例えば Private Sub Command1_Click() ここまでは理解しました。 |
|
A24:検証はしていないのですが、VB Books Online によると、二次元配列でデータを与えることが可能なようです。 Dim d(10,10) このようにして行・列などを持つグラフでもデータを渡すことができるようです。 たぶん、3次元配列以上でも同じように可能と思われます。 |
| Q25:VB6でMSComm.OCXを使い通信部分をスレッド化したい為、 ActiveX.DLLorEXEで実現しようと思ったのですが、 ActiveX内でのMSCommのオブジェクト定義が判りません。 クラス内でのOCXオブジェクトの定義は出来ないのでしょうか。 ちなみにPublic MSComm1 as MSComm とし 標準EXEより実行したら オブジェ変数が未定義のエラーが帰ってきます。 何か良い方法はないでしょうか教えて下さい。(「まっちゃん」さん[00/03/05]) |
|
A25:まず、ActiveX DLLまたは ActiveX EXE のプロジェクトに新規フォームを作成して、そこに MSComm コントロールを貼りつけます。 プロパティなら Property Get と Property Let のプロパティ関数コンビを作ります。 これらは、ご自分で利用されるものだけ用意してやればいいでしょう。 ちなみに、ActiveX DLL や ActiveX EXE を使用するより、ActiveX コントロールにしたほうが、本家のプロジェクトにコントロールを貼りつけるだけで済みますので、かなり簡単になりますよ。 |
|
Q26:Inet1コントロールを使用しようとしたら、ライセンスがありませんと表示されます。 |
|
A26:ActiveXコントロールには、2種類のライセンスがあります。 ひとつは使用時ライセンスで、そのコントロールをプログラムから呼び出して実行することができるライセンスです。 もうひとつは開発時ライセンスで、そのコントロールを自分のプログラムに使用して、プログラムといっしょに配布することができるライセンスです。 さて、ご質問のケースですが、Inetコントロールが何らかの原因で開発ライセンスを与えられていないようです。 1.VBのインストール時にコントロールをインストールしていない まず1.のケースですが、VBのインストールのときにオプションでインストールするコントロールを選択できるようになっていて、標準インストールではインストールされないコントロールがあったりします。 また、2.や3.のケースでは、他のソフトが使用するコントロールのほうがバージョンが新しいときには、その新しいバージョンのコントロールで上書きされてしまい、開発時ライセンスを失ってしまうことがあります。 解決法としては、VBのCD-ROMから再度 Inet コントロールを追加インストールすればよいはずです。 ただし2.や3.の場合には、新しいバージョンを使用しているアプリケーションが正常に動作しなくなる可能性もあります。 ですので、念のため先に VB のサービスパックを Microsoft のサイトからダウンロードしてインストールされておくことをおすすめします。 |
| 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() ' ウィンドウサイズの取得 |
| 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のインストールオプションやエディションが違う 2. VB以外のコンポーネントのインストール状況が違う 次に、サーバからインストールする方法ですが、LAN環境であれば、サーバの共有フォルダにセットアップを配置し、クライアントが「ネットワークコンピュータ」アイコンからアクセスしてSetup.exe
を実行するだけでセットアップできます。 |
| Q29:大学の研究でデータを管理するプログラムを作成しようとしています。 VBに関しては全くの初心者なのですが、バイナリで読んだ数値を実数型( single)に変換したいのです。 バイナリで4バイト読み込んで、この4バイトに 対応する実数型の数値を知りたいのですが、どうしたらよいのでしょうか?(がやさん[00/04/13]) |
|
A29:通常、変数の型を意識してデータを読み込むためには、ランダムアクセスモードでデータを書き込むことによって、「記述子」も同時に書き込んでおき、ランダムアクセスモードで開くことで、書き込んだときと同じ型でデータを取得できます。 バイナリーで開く場合、記述子が保存されていないので、型を判別できません。 その場合、バイトデータとして値を取得し、Single型のフォーマットに従って解析・変換をする必要があります。 |
|
Q30:NT4.0で構築されたLAN環境でVB5を使用して開発しています。 |
|
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:自分自身が起動している状態では、その実行ファイルそのものをアップデート(上書き)することはできません。 考えられる方法としては、アップデートプログラムをアプリに同梱しておきます。 カップルで、お互い相手が寝ている間に寝言を録音するようなものでしょうか(笑)。 |
|
Q33:VB6.0でActiveXを作成し、 ActiveXコントロールインターフェースウィザードで使用するプロパティを決め、 プロパティページウィザードでプロパティの実装をしました。 「このページのソフトウエア(ActiveXコントロール)のいくつかは安全でない可能 性があります。 ベリサインなどの会社の認証はとっていないので、メッセージがでたのだと考えられ ますが、 PARAMタグの記述をすべて削除するとメッセージでないことがわかりました。 |
|
A33:う〜ん、これが問題なのですよね、ActiveX認証問題・・・ なんせ、Microsoftのサイトから Windows のアップデートを Activeセットアップしようとしても、 ヘルプやVB Book Online などを見ますと、ディストリビューションウィザードで署名を入れることができるかのように書いてあるのですが、実際やってみるとそうはなりません。 所詮、個人が作るソフトなど、安全でない可能性があってあたりまえなのですが(いきなりシステムを破壊するプログラムだってほんの数行で書けますし)、どうしても「危険なもの」と思われたくなければ、どうにかしてメッセージが出ないようにしたいのですよね。 わたしとしてはまだこれについてはいい方法を知りません。 |
|
Q34:すごく、単純なことで申し訳ないのですが、 何をどう頑張ってやっても、Enabledの値が変更できません。 Private Sub cmdStart_Click() … End Sub ってな感じです。 |
|
A34:む〜、不思議な現象ですねぇ。 ひょっとして、と思っていろんなパターンを試してみたのですが、変更できないことはありませんでした。 たとえば Timer イベントであったり、LostFocus イベントであったりすると、他のプロシージャの実行中でもジャンプしてしまう可能性もありますから。 あるいは、Enabled プロパティを False に設定する直前になんらかのイベントが発生し、そちらに制御が移ったまま戻ってこない場合もあり得るでしょう。 デバッグモードのステップ実行で一行一行、F8キーで経過を見ながら実行してみてください。 あと、Windowsカラーなどを変更した場合で、256色環境などの場合、有効と無効が外見的に区別できないこともあるかも知れません(まずないと思いますが)。 |
| Q35:どうも上手くいかない部分が有ってご質問させていただきます。 @会社で、OCXで、パスワードを入力する部品を作りました。 そのコード、OCXはネットワークにあります。 AそのOCXを使用したプログラムを作成しこれもネットワーク上に置きました。 BVB付属のセットアップウイザードでOCXのセットアップファイルを作成しました。 Cクライアントにセットアップして、AをのプログラムからOCXを起動したところ、OCXの設定が適切に登録されていません。というメッセージが表示されてしまいます。 そもそも、OCXの作成の仕方自体あまりよくわからなかったので、ネットワークを使用した 場合のOCXの作り方が違っているのでは?と考えています。 思い当たる部分があれば、ご教授願えますか?(新米プログラマさん[00/05/02]) |
|
A35:ええっと、ちょっと話がややこしいのですが、ActiveXコントロールをプログラムで使用するには、そのプログラムが実行される環境に ActiveXコントロールがセットアップされている必要があります。 たとえば、クライアントからサーバにあるプログラムを実行する場合、クライアントにそのコントロールがセットアップされていなければいけません。 これはなぜかというと、クライアントのメモリにプログラムがロードされ、クライアントで実行されるので、そのプログラムはクライアントにコントロールのインスタンスを要求するからです。 簡単にうまくいく方法としては、プログラム本体のセットアップを作成すれば、それに使用されているコントロール(自作も含めて)のセットアップも同時に取りこんでくれるので、確実に動作可能な環境を作ることができます。 作成した環境でプログラムが正常に動作しているのなら、それで間違いないはずです。 |
|
Q36:シリアルポートを利用して外部機器(テスター)からデータを受け取ってそれを表示させたいんですが、 どうもシリアルポートの設定などがわかりません。
|
|
A36:シリアルポートを利用したデータ通信は、VBの標準パッケージではサポートされていません(と思います・・・)。 技術的にはおそらくシステムがシリアルポートと通信するときに使用しているドライバから情報を受け取るような形になるのではないでしょうか。 いちばん簡単な解決方法は、市販のActiveXコントロールを利用することです。 |
| Q37:インターネットから、どこかのパソコンにアクセスして、ファイルを印刷するには、(スプールを使って)どうしたら良いでしょうか. 使っている環境は、NT4.0servicepack5です.(hiromuさん[00/05/11]) |
| A37:まず、Winsockコントロールを利用して通信アプリを作成し、プリンタサーバとクライアントの両方でそのアプリを起動しておきます。 アプリの仕様は、サーバ側はある一定のヘッダーを持ったメッセージを受信した場合に、本文の部分をデータとして印刷する、というもの、クライアント側は指定したサーバにヘッダーを付加して印刷データを送信するものにしておきます。 両方である決まったポートを利用するよう設定し、ネットワーク管理者にはファイアウォールのそのポートが使えることを確認しておきます。 これで、クライアント側でファイルを開き、データにヘッダーをつけて送信してやれば、それを受信したサーバ側でアプリがそれを認識し、印刷してくれる、というわけです。 セキュリティが心配なら、ヘッダーに認証情報や暗号キーなどを埋めこむことで対処できるでしょう。 |
| Q38:VB(Windows32API)で、プロセスの状態を見るプログラムを作りたいと思っています。 で、よく、APがフリーズしたときに、 Ctrl-Alt-Delで、プロセスの一覧を出して 「応答なし」になっているのを見かけるのですが、 それを、プログラムで実装することはできないでしょうか? プログラムで外部APを立ち上げるところがある のですが、どうもそのAPの調子が悪くて、すぐフリーズしてしまいます。 なので、そのプロセスを監視していて、応答なしになったら、強制終了 させるようにしたいのです。 (「よろしくです」さん[00/05/15]) |
|
A38:まず先に、外部プロセスを終了させる方法を説明します。 問題は応答なしかどうかを取得する方法ですが、他の質問・回答でも触れているように、VBではWindowsの任意のメッセージを受け取ることができません。 |
| Q39:VB6.0のチャートコントロールで、一つのSeriesCollectionで特定のデータポイントだけ マーカーのスタイルを変えるか、またはそのポイントだけ データラベルを付ける方法はありませんか?(ヤマモさん[00/05/18]) |
|
A39:一つの項目だけにデータラベルをつけるには、以下のようにします。 MSChart1.RowLabelIndex = 4 この例では、4つめの項目のみにデータラベルを設定しています。 |
| Q40:VBでのサムネル映像って皆さんどうやって作成しているのでしょうか? 画像を縮小しほぞんできるのでしょうか? こちらまったくの初心者でどうやっても出来ません。(hisashiさん[00/05/21]) |
|
A40:ピクチャボックスではなく、イメージボックスを使えば簡単にできます。 表示は以上の方法で可能ですが、縮小されたイメージを保存するには別の方法が必要です。 |
|
Q41:今、VB6でAcviteドキュメントを作成しています。 作成は、通常のEXEを変換させて結構簡単にできてしまいました。 自己レスです。 ディストリビューションウィザードで「配置」のなかで、 urlを、「http://192.158.1.1/aaa」としていたを、
|
|
A41:まず、ActiveXドキュメントに関する資料ですが、Visual Basic Books Online が最も詳しく説明しているかと思います。 それから、vbdファイルにアクセスしたときのIEの動作なのですが、どうにも不思議なことに、環境によって動作が異なります。 考えられる原因としてはサーバがActiveXをサポートしているかどうか(Webサーバの大半はLinuxなのであまり期待できないが、奇特なWindowsNTサーバであれば可能かも)がカギかも知れません。 このへんの情報はさらに詳しく調査をすすめますので、解り次第改めてお答えしたいと思います。 |
| Q42:ODBCを使用し、ORACLEのデータを変数に格納していますが、LONG型のフィールドが取得できません。 マニュアルを読むと、GetChunkで取得すると書いてありますが、エラーになってしまいます。 申し訳ございませんが、教えてください。(寶正智弘さん[00/05/26]) |
|
A42:これだけでは状況がよくわからないのですが、考えられる問題としては「変数の型変換をしていない」ということです。 |
| Q43:VB5で作られたプログラムで、クリスタルレポートを使った帳票印刷があります。 この処理をACCEES97に移行して同じようにActiveXのクリスタルレポートを使って印刷するようにしたのです。 処理自体はうまく動くのですが、処理を終わらせるとACCESSが残ってしまって終わりません。(デスクトップ上では終わっているように見えるが強制終了の画面を開くとMSACCESSが残っていてメモリーもちゃんと食っている) ACCESSが終わらない現象は、サブフォームからメインフォームの関数の戻り値云々で発生することはあるのですが、今回はあきらかにクリスタルレポートに原因があるようです。 どなたか、ACCESS97のコードでクリスタルレポートで印刷するときの正しいコードの書き方をご存知の方がいたら教えてください。(はかまたひとしさん[00/05/26]) |
|
A43:う〜ん、これは技術うんぬんより、Accessのバグの可能性のほうが高いですね・・・。 ちょっとイマイチこれはわからないです。ごめんなさい m(_ _)m |
| Q44:WindowsNT4.0上でVB5.0 Enterpriseを使用して開発をしようとしているのですが、RDOを使用しているプログラムのEXEファイルを作成しようとすると、コンパイルエラー書き込みできません。と表示されてしまいます。 エラーの場所は、set En = Rdoenviroments(0)の行で止まります。 何がいけないのか困っています。 ちなみに、他の開発環境では問題ありません。(n.maruyamaさん[00/06/01]) |
|
A44:実行はできるわけですね? Administratorで実行して試してみるとよいかも知れません。 |
| Q45:現在VB4.0でACCESS95(V7)のテーブルを登録、更新、削除 しているのですが、会社の標準OFFICEをOffice2000にする方向で考えているのでVB4.0でACCESS2000のテーブルを変更するようにしたいのですが、うまくいきません。
DAOを使ってやるにはどのようにしたらよいのでしょうか?(NORIさん[00/06/01]) |
|
A45:ん〜、Access2000使ったことないんですよね〜。 わたしが未知の参照オブジェクトをVBで使うときによく使う手は、オブジェクトブラウザでプロパティやイベント、メソッドを解析することです。 あくまで想像ですが、基本はたぶん今までの方法と大差はないはずです。 |
| Q46:VisualBasic6.0Proを使っているのですが、Excelのマクロで言うとこの、「Rank」みたいな関数は、ありませんか?
配列変数 a(1 to 10)の中に入っている値を小さい順(又は大きい順)ランク付けしていって、配列変数 Rank(1 to 10) の中に、そのランクを代入したいのです。 何か、良い例題などありましたら、ご指導のほど、よろしくお願い致します。(MSさん[00/06/03]) |
|
A46:ずばり、そういう機能を持った関数、というのはありません。残念ですが。 実際にどうやるかですが、たとえば上記の例でいくと、以下のようになります。 ◆最初にRank() のすべての要素を、0(配列aがすべて正の場合)で初期化しておく この方法でRank(1〜10)は小さい順に並んだ値となるはずです。 |
| Q47:環境:VB6.0(SP3)、WIN98SE 標準EXEで作成したアプリケーションを参照設定でActiveXEXEコンポーネントを追加して、そのコンポーネントをモーダル設定で呼び出したのですが呼び出したコード(クラスモジュール) Public Sub frmZsituChgShow() Load frmZsituChg <-----ActiveXEXE frmZsituChg.Show vbModal End Sub デスクトップなどウィンドウと違う個所を何度かクリックすると「コンポーネントを使用を使用できません」をダイアログボックス「切り替え」「再試行」「キャンセル」のボタンが表示 |
|
A47:frmZsituChg.Show vbModal の部分で、親フォームの指定が抜けていますよね? まず、 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 を実行してテストしてみる。 するとテスト実行後、認証情報が表示 らしいです。 しかしよく分からなくて出来ないでいます。 |
|
A48:え〜〜っと・・・ActiveX SDKというのが手元にないもので、試すことができません。 わたしもいずれ機会があれば試してみたいと思います。 |
|
Q49:当方は、最近VB6.0のIISアプリというのを使ってwebアプリをつくっています。 (平山さん[00/06/08]) |
|
A49:ん〜、だいたい問題の本質はわかった気がするのですが・・・。 これはやっぱりそういう仕様なんじゃないでしょうか? そうしないと、何をもって、どのタイミングで接続を閉じるのかといった問題が逆に発生するわけですよね? で、この場合、サーバアプリケーションなので、データベースのレコードセットなどはサーバのメモリ上に展開されるのですから、セキュリティ上もそういう設計にせざるを得なかったのではないかと推測されます。 |
|
Q50:VB6でLabelのCaptionにワードなど文章作成ソフトで作ったテキストをコピーして張り付けると、一部のPCで文字化けが起こってしまいます。
Private Sub Label1_Click() |
|
A50:このコードではUnicodeをShiftJISに変換しているようですが、おそらく文字化けの原因はそれではないと思います。 MSWordで作成する文章は、いわゆる「書式つきテキスト」というやつで、たとえばHTMLであるとか、リッチテキストのようなものなわけです。 クリップボードのデータ形式にも 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に対応したドライバが含まれていないはずです。 |
| Q52:VBアプリの配布FDを作ろうとしたのですが、なんと、セットアップウイザードが立ち上がりません。(^^;; とても困っています。 メッセージは: VB5.0(SP3)・Windows98 |
|
A52:VBからの実行はできるのですよね? 可能性としては、フォームやモジュールの名前が、それ自体に記録されているものとvbpファイルのものとで食い違っているとか、名前が長すぎる、あるいは日本語の名前をつけている、などということも考えられますが・・・。 何かお心当たりありますか? |
|
Q53:さっそく質問なんですが、VBでの印刷についてです。 ===================== WindowsNT4.0 WS SP3 IE 4.0 VB5.0 SP3 =====================
VB5.0でPrinterオブジェクトを使用してネットワークプリンタから印刷を行うとき、用紙サイズの変更が行えません。MSのサイトをみると「NT4.0では印刷ダイアログで設定した値は有効にならない..とか、VB5/VB6のPrinterオブジェクトでいろいろ問題がある...とか...書かれています。」
|
|
A53:そうですねぇ、通常の印刷なら Printer オブジェクトでもほぼ問題なくできます。 これは、プリンタの機種ごとの機能の違いや、ドライバがサードパーティ製であったりすることに起因しているようです。 APIで印刷するとなると、プリンタのデバイスコンテキストを取得し、そこにイメージを転写するような処理が必要かと思います。 やはり多少難があっても、Printerオブジェクトを利用して印刷するようにして、問題のある部分は他のことで対処するしかないかも知れません。 |
| Q54:VBを始めて間もないのですが今、インターネットの登録フォーム(懸賞とかの)にクリップボードの情報を貼り付けるツールを作っているのですが、コピー&ペーストでの貼り付けには成功したのですがドラッグ&ドロップの機能をもたせたいのですがどうしても出来ません。どうか教えてください。(のりさん[00/06/19]) |
|
A54:まず、対象はテキストボックスであるという仮定で説明します。 テキストボックスにD&Dされたテキストを取得して表示させるには、まずOLEDropModeプロパティの設定を「1−手動」にします。 If Data.GetFormat(vbCFText) <> 0 Then Exit Sub ↑これはテキストでないときは処理を抜ける、という意味ですね。 テキストボックスから他のアプリにD&Dした場合には、OLESetDataイベントが発生します。 Data.SetText txtEdit.SelText SelTextプロパティは、選択されて反転している部分の内容を示します。 |
| Q55:新しい月になったという、判定がしたいのですが。。 たとえば6月から7月に変わるとき、レジストリを変えたりしたら一番初めの状態に戻したりしたいんです。(ありありさん[00/06/19]) |
|
A55:これだけでは実際にどういう処理をしたいのかがよくわからないのですが、実行中にリアルタイムで月の変わり目を知りたいのであれば、次のような方法があります。 ・タイマーを配置する あるいは、アプリの起動ごとにチェックしたいのであれば、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とは相性が悪そうですね・・・。 具体的な詳しいことはわかりません。ごめんなさい m(_ _)m |
| Q57:起動されるEXEの引数にスペースがある場合うまくいきません 例えば、ワードの引数に "C:\Program Files\TEST.doc" を入れた場合 Shell、ShellExecute、CreateProcess などを使ってみたけれどだめでした。 うまくいく方法ありますか?(chiba atsushiさん[00/06/23]) |
|
A57:これはロングファイルネームに絡んだ問題です。 答えは簡単です。ファイル名の前後に「”」ダブルクォーテーションをつけるだけです。 コマンドラインでは、スペースはファイル名や引数の切れ目として認識されるため、スペースを含むパスを指定するときにはダブルクォーテーションで囲む、という規則があるのです。 「ファイル名を指定して実行」のときにも関係しますので注意しましょう。 |
| Q58:始めてで お聞きするのですが すいません。 マウスの動作を バックグラウンドで 動かすには どうすれば いいのでしょうか?と いうより 出来るのか? お手数ですが、教えて頂けないでしょうか?(北川智晴さん[00/06/24]) |
|
A58:「バックグラウンドで」の部分の意味がちょっとわからないのですが、こちらで解釈した意味で説明します。 1.マウスカーソルを非表示にする 2.マウスポインタを任意の位置に移動する 1.の方法は拙作のスクリーンセーバなどで実際に使用しています。 |
| Q59:ACCESS2000のレコードが正常に削除できません。 Dataコントロールを使うと問題なく.deleteで削除できましたが、adodcを使って削除しようとすると、[クエリーが複雑すぎる][設定が不十分][すでに削除されている]のエラーが発生する時と問題なく削除できるときがあります。 解決策を教えてください。(hkawaさん[00/06/25]) |
| A59:ん〜、エラーの種類が違うのと、出ないときがあるのと、ということであれば、やり方になにか不備があると考えるのが普通のような気がします。 Dataコントロールで正常動作するのであればなおさらです。 もう一度コードや設定を見直してみてください。 |
| Q60:現在、ActiveXコンポーネントを作成して、ブラウザ上で動作するアプリケーションを作成する予定なのですが、何点か質問があります。
・同一ページ内に異なるActiveXコントロールを複数 配置した状態で、それぞれ異なるコントロールの メソッド、プロパティを更新することは可能なの でしょうか? ・また、別ウインドウのコントロールを同様に 操作することは可能なのでしょうか? (とまとさん[00/06/28]) |
|
A60:これは検証したわけではないので何とも言えないのですが、まず同じページの複数のActiveXコントロールの場合、おそらく互いのプロパティにアクセスすることはできないと考えられます。 また、別ウィンドウについてはほぼ間違いなくできないものと思います。 |
| Q61:先日、VB6でプログラムを作成して客先に納品しました。OSはNT4.0 SP5 です。 プログラムの中でファイルコピー処理を行うのに、SHFileOperation関数(Shell32.dll)を使用しています。 ところが、ファイルのコピー実行中のダイアログで以下の現象が報告されました。 1.「キャンセル」ボタンが効かない 1.については、早速自社で調査したところ、どうやら Shell32.dll のバージョンの問題のようです。 そこで教えていただきたいのですが、Shell32.dll は、バージョンによってはバグがあるのでしょうか? |
|
A61:バグ、というよりは設計ミス、仕様ミスかも知れませんね。 Microsoftは常に最新のモジュールを使用することを推奨していますが、それはつまりいつまでたってもバグがある、ということを言っているのと同じことです(決して認めようとはしないでしょうが^^;)。 ネットワークがらみの不具合のほうは、それだけが原因とは断定できないかもしれません。 |
| Q62:VB6のセットアップディスクの容量を最小化する方法で困っています。 VB6で簡単なアプリ(MS-DE対応)のセットアップディスクが10Mbytesもあり、困っています。 原因は、DBアクセスするためのオブジェクトというところまでは、解ったのですが、MS-DEを使用するアプリでセットアップディスクを3Mbytes程度まで縮小する方法をご存知ではありませんでしょうか?(「はるちゃん」さん[00/07/05] ) |
|
A62:最初に結論から言うと、ありません。 1.セットアップ先にVB6ランタイムが既に入っているか、あるいは別に入れるようにしてもかまわない場合、下記のファイルをセットアップから除外できます。 2.コモンダイアログコントロールや Windows Common Controls などを使用している場合、面倒でも標準コントロールの組み合わせで同機能のものを作ることで、Ocx と dll をセットアップから除外することができます。 この2つを実行しても、おそらく2〜3MBくらいしか減らすことができません。 |
| 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のトラブルは他の質問にもありましたね。 このへんは宿題ということで、さらにいろいろ調べるつもりではいますが、いかんせん実環境が手元にない・・・とほほ |