VBプログラマ質問スレ(Ver.6.0 まで) part56
1 :
デフォルトの名無しさん :
2010/06/01(火) 22:06:37
>>3 スレを立てると宣言したのにイヤガラセはやめろ
スレが立ったら静かになるんだな。
おワットる言語だし
言葉は生き物だからといって、今ある言葉をねじまげる理由にはならない
だれかVBの質問しようぜ
VBでもグライコ表示みたいなソフトあった気がするな。 単に録音するだけだった気がする。
VBじゃないが、NY Spectrum Analyzerで似たような事はできた ミュート状態でもステレオミキサONにすれば動くようだ(XPで) ソースもあるから中身見ればなんとかVBでも作れるんじゃね?FFTは辛いかもしれないが波はそのまんまだろう
なっている音を録音する感じかな?
たぶんそう ミキサで録音元を設定してあげれば再生しているWAVの波形がとれる ていうかVBで作らなくてもそのソフトで十分じゃね?
なるほど
情報処理検定のVBはどのようなものですか?
履歴書に書いても鼻で笑われる程度
VBは鼻で笑われるが、VBAだとなぜかウケがいい不思議。
オフィス様は偉大だからな
情報処理試験にVBあるの?
全商情報処理検定とやらの話でしょう
本スレがどっちか分からんけど前スレ履歴あるんでこっちで質問します VB6とMySQLを使ってデータベースを利用したプログラムを作成しています MySQL Connector ODBC 5.1.6を使って開発マシンに入れたMySQLにて接続と返答を確認 その後、LANで接続している別マシン上のMySQLに接続しようとしたところ 実行時エラー '-2147467259 (80004005)' [MySQL][ODBC 5.1 Driver] Can't connect to MySQL server on 'IPアドレス' (10060) のエラーが表示されてしまいます 別マシン上に実行ファイルを持っていき、接続アドレスを127.0.0.1として確認すると正常に接続と返答が返ってきます また、開発マシン側でPerlを使って別マシン側のMySQLにアクセスしても問題なく接続と返答ができる状態です VB6側でネットワーク上の別マシンの場合に行う設定などあったりするのでしょうか?
特に設定する部分なんてないと思うけど 他のPCで動くってことはPG的には問題はひとまずおいといて そのマシンのファイアウォールとかはひとまず全部OFFにして試してみた? ポートの問題じゃないのかな?
利用環境開発環境共にインターネットに繋げてないLAN構成なんでFWやアンチウィルス等はインストールもしていない環境です
Perlのスクリプトの方でもポートは特に指定していなくても正常に使えてる状態です
MySQLもインストール時にUIDとパスワードぐらいしか設定変更はしていません
あれから調べててDSNの設定が〜という記事もいくつか参照したのですが
もともと参照した記事は以下のDSNを使わずにデータを取得する、というものです
ttp://matome.info/VB6MySQL/ コードはSERVERやUIDなどのMySQLへの接続パラメータ以外はそのまま使っています
>>25 自分で入れてないだけですでに入ってるんじゃね?>FW
ウインドウズFWだったり、メーカー出荷時に入ってたり
perlからいけるんならポート塞ぎじゃなくてアプリケーションレベルの禁止かな
あとは正しいと思い込んでるアドレスかポートが実は間違ってるとか
>>26 SQLマシンは自作マシン、OSもXPSP3の単発買いのものなんで外部のFW等は入れてないので除外
セキュリティセンター系はサービスから除外してるんで、復帰させて確認したけど
WindowsのFW系もきちんと停止している状態でした
LANの構築がハブだけでアドレスが169.254.〜となっているのが原因だったりしますかね?
29 :
デフォルトの名無しさん :2010/06/11(金) 14:07:51
おい、そのサーバにつながらないマシンからIPアドレス指定でping通るのか?
pingやポートスキャンは通るのかな MySQLの層の話じゃなさそうな気はする
何伸びてるとおもったら 仕事中に2chで相談会でもしてんの? 俺はニートだけど
プログラム板ってこんなもんでしょう?
俺もニートだけど有意義に賑わうなら別にいいと思う
>>28 optionにデバッグの4を指定して実行してみたけどファイルが作成された形跡がない状態でした
Cのルート、実行ファイルのフォルダ近辺からファイルの検索までかけたけど、該当ファイルは無しでした
>>27 同じマシンからperlでつながるんだったらネーットワーク的には問題ないし
サーバーの設定もokってことじゃん?
残るはクラ側の設定しかないじゃん?
納得いかなかったら、パケットキャプチャ系のツールを入れて覗いてみれば?
perlはサーバ側で動かしたなんてオチはいやずら
知人に送って確認して貰ったら接続して返答きてると言われました… 知人からはPG的なものじゃなくてハードウェアかLANの構成絡みじゃないのか、との弁 とりあえず昔のノートとか引っ張り出してハードウェア絡みを見直してみます お騒がせしました
Vista上で利用しています。 VBPファイルをクリックすると、〜OCXが読み込めませんというエラーが表示され、 ロードに失敗してしまいます。 デスクトップ上に同じプロジェクトがあり、片方のプロジェクトは正常に開くのですが、 片方が毎回ロードに失敗してしまい、参照設定をしようとすると、 「ActiveXコンポーネントは登録できません」とエラーが出てしまい… なぜか正常に開いているプロジェクトと同じ参照先に設定ができません。 OCXはちゃんとにレジストリ登録ができているのですが、 何が原因かわかりますでしょうか?
同じなら、失敗した方から開くようにすると、ちゃんと開けるの?
じゃ、同じじゃないじゃん。失敗する方が、なんか壊れてるんでしょ。
私もそう思ったのですが… Subversionにコミットされているもので、 他の人は開いた時に何もエラーが出てなかったので。。。
OCXとかちゃんと登録されてるんだろ
>>39 OK な方のプロジェクトを何かバージョン管理システムに突っ込んで、
NG な方のプロジェクトのファイルでオーバーライトしてコミットして
差分を調べれば違いがわかる、かもしれない。
失敗してしまう方はところどころソースが違っているので、 DLLも再登録して開くようにしているのですが、 なぜか参照先が違うところを見にいっていて、 再登録したほうのDLLを設定しようとするとエラーが出てしまうのです。
49 :
デフォルトの名無しさん :2010/06/14(月) 13:12:49
最近分かったことがある VBでゲーム作るのは無謀だと そこそこセンス無いと無理ぽ
VBにかぎった話じゃないだろそれ DirectXなどが操作し辛いという事ならそうかなと思うけど
DirectXなら一応VBから使える。
3Dをフルに使ったゲームとかなら
VBで作るのは難しいがアドベンチャーゲームの
ようなものは十分作れる。
そういうことは誰でも理解していることなので、
わざわざ
>>49 のようなことを言うレベルの人間は、
それ以前に技術力が足りない。
業務用・実用系のソフトしか作ったことない人はゲーム作り苦手という噂をどっかで聞いた気がした 逆に、ゲーム系のソフトしか作ったことない人は業務用・実用系のソフト作りが苦手とか プログラミングでもパソコン向けでは無いほうのしか作ったこと無い人はパソコン向けが苦手とか
音楽やってる奴はパンクからクラシックまで網羅してないといけないという決まりも無いだろ。
ゲームもゲーム以外もそうたいして変わらないんじゃないかと思ってるが、ゲームしか作ったことないからわからん
業務系アプリなんか、ある意味四則演算しかやってないからな だがどっちが偉いかって話は不毛ってもんだ
56 :
デフォルトの名無しさん :2010/06/17(木) 02:08:27
変数や関数の名前に全角を使うって主流なの? 未だに使えん
.NETなどじゃうっかり全角の関数ができちゃう事もあるが6などで全角は無しでしょ
そうなんか、たまに見るVBAのソースとかだと全角の名前多くて嫌になってくる
変数とかに全角使うのがVB界の主流なのかと思ってたのさ N88BASIC時代からずっと半角ばっかだったから 全角使うのが当たり前な時代なら 全角使ってみようかなと
VBAかよ
VBAはVB6のサブセットとかじゃなかったっけ?VBAとかセルの参照とかよくわからんから使ったことないけど ソースとかはたまに見てるからさ VB6も全角使うのかなーって。
一緒にするな
そうか、VB6では全角使えないんだな。まぁそれはそれで安心した。
>>1 より
VB.NETは別物なので専門スレで、VBA、APIの質問もそれぞれのスレで。
俺の記憶ではVB6でも全角の変数とか使えたはずだが ただ、主流かと言われると微妙だな
主流もくそもVB6自体が(ry
全角使うのに抵抗あるのってやっぱ時代遅れか
一時期、可読性があがるかと思って、積極的に全角(つかカナ漢字)つかったことがある 俺の結論としては、入力の手間に値するほどの価値は無かった 結局は気のきいたコメントが一番大事だと思った インテリセンスとかある今のVB.NETならまた違った結論になるかもしれんな
VB6の命令などはVB.NETでもそのまま使えるの?
もちろん
VBScriptの質問でござる。
VB6では以下のように、変数宣言時にNewキーワード付きでクラス名を書けますよね。
Dim Hoge As New ClassHuga
(これ専門用語的にどう言えばいいのかわかりません 暗黙のインスタンス生成?)
これと同じようなことを、VBScriptで書けますか?
そもそもAsが無いのでどう書けばいいのやら
と試行錯誤したけど、以下は全部だめポですた。
× Dim Hoge As New ClassHuga
× Dim Hoge = New ClassHuga
× Dim Hoge New ClassHuga
>>58 それは、マクロの関数名や自作ワークシート関数名がそのままExcel(とかOffice全般)の画面UIに表示されるので、
関数名や引数を日本語にしとくとユーザーが使いやすい(わかりやすい)から、ってところから来てるんだと思う。
そこからVBAに入った人はUIのどこにも出て来ないはずの内部関数であっても日本語を使う癖が付いてるみたい。
VB6だと Dim Hoge As ClassHuga Set Hoge = New ClassHuga と書くとどこかで聞いた
74 :
72 :2010/06/19(土) 18:12:11
>>73 普通はそう書くんですけど、
Dim Hoge As New ClassHuga
という書き方も出来るんです。こう宣言した場合、Setする事なく突然Hogeを利用することが出来ます。
例えば、
Dim Hoge As ClassHuga
Hoge.Piyo = 0
というコードを書いた場合はPiyoプロパティにアクセスする段階でエラーになりますよね。
前述の通り宣言した場合はエラーになりません。
HogeがNothingだった場合、アクセスしたその時点で自動的にインスタンスがNewされてそれがSetされます。
ちょうど「フォームのそれに似た挙動になる」と考えてもらえるとわかりやすいかと。
質問は、それがVBScriptでも可能なのでござろうか?ニンニンというお話です。
VBScriptにはAs句がないから、まったく同じことは無理。
VB6で開始ボタンを置く画面と、実際にグラフィックを描く画面を別にするにはどうしたら よいのか教えてください。
>>76 Form1 に開始ボタンを置く、Form2 でグラフィックを描く場合、
Form2 に public なグラフィックを描く関数 func を作って
Form1 の開始ボタンを押したら、call Form2.func() を実行。
>>74 > 質問は、それがVBScriptでも可能なのでござろうか?ニンニンというお話です。
不可能。
ちなみに、as の有無には関係ない。
VB6(VB5も)でふつうに作成した画面は、左右や四方の角の部分のハンドルによって無意味に 大きくなりますよね。大きくならないように画面の大きさを固定する方法を教えて下さい!
フォームの枠で固定のやつを選べばいい。
>>82 ??
「固定のやつ」を選ぶ方法を教えて下さい。
フォームのプロパティを全部見直せよ。
>>84 ありがとうございました! 出来るようになりました。
BorderSytleくらい自力で到達してくれい
重複スレ落ちたのか
以前のN88-BASICでは、ゲーム画面のデザインなどでGET@命令やPUT@命令を よく使っていたと思いますが、VBでも同じような命令はあるのでしょうか? 本を調べても、GETに似たものはあるようですがPUTは見つかりません。 詳しい方、使い方をご教授下さい!
俺もN88からVB6にのりかえたのだけど(ちなみにずぶの素人でプログラマーではないですお) N88はあんま使ってなかったからよくわからんけど GET@やPUT@ってゲームキャラクターとかを描くときに使った記憶はある VBでゲーム作るときは 普通にペイントソフトでゲームキャラの画像を作って それを読み込んで使ってたな ImageやPicutureBoxあたりで画像を読み込んで PaintPicutureメソッド使ってフォームとかPicutureBoxに描写すればいいんじゃない? 俺がVB始めたころは運悪くVB関連の資料がベーマガしかなかったから Win32APIのBitBlt使ってた。つい1年くらい前にPaintPictureメソッドの存在を知った Windows95のPCだとBitBlt使わなきゃゲームはキツイけど WindowsXPのPCだとPaintPictureでもまぁ気にはならない程度には早い描写ができたね
まぁもっと詳しいプロのプログラマーさんの意見が来るのを待つしかないね
91 :
89 :2010/06/25(金) 21:42:50
>>90 =
>>89 で私のレスです
ちなみにN88からVBへ行く前にCARealizerというGUIなBasic言語をちょいやったのでVBへはそんなに抵抗なかったです
92 :
デフォルトの名無しさん :2010/06/26(土) 01:22:21
あ〜あ
>>89 ありがとうございます! PaintPicuture について調べてみます。
VBは最近入手したばかりなので、暗中模索の状態です。
本格的なゲームを考えてるならDirectXジャネーノ
DirectXってプログラム言語の1つなのですか?(違うような気がしますが・・・。) 本格的なゲームを作る野心などは持っておりません! とりあえず、数学の各種曲線を描画するプレゼンテーションを考えているところです。 (N88-BASICなら簡単だったのに、VBでは難しいです。言語が進化したのだから プログラムも易しくなるべきなのに、逆に難しくなるなんてオカシイおー!)
>>95 DirectX は『言語』ではなくて『ライブラリ』。
今なら VB6.0 よりも .NET の方が情報がいっぱいあって
いろいろ調べやすいと思うから、.NET を使ったほうがいいよ。
ここは時代の取り残された者たちのスレです。
.NETを買うお金がないお。 ファイル交換ソフトでもらうしかないかも・・・。
Express版なら無料でDLできるお
無料のものではコンパイラーがないから、配布して他の人々に 簡単にみせてあげることが出来ないって聞いたのですが・・・、 その点について教えて下さい!
VB.NETスレ行けよ。
>>100 コンパイルも配布もできる。VB.NETスレで待ってるぜ。
>>102 ホント? ありがとう!!
これから無料版をダウンロードしてみます。
さよ〜なら〜。2度とくるなよ(いい意味で)。
すみません、超初歩的な質問なんですが、 Me.〜〜 は自分で配置したコントロールやフォーム自体のプロパティ?で e.〜〜は何の意味があるんでしょうか?
e. なんてないよ。
e.はMe.のMがかすれて見えなくなったもの。
マジレスすると、Me は予約語、e は変数。
>>104 Visual Studio 2010 試用版 をダウンロードしてインストールしようとしたのですが、
ハードディスクの空き容量が足りなくてインストールできませんでした。7.1GBも
必要だなんて・・・・!?
という訳で、また戻って来たおー!
教えがいのある人なら歓迎だが、そんな人物ではないようだし
>110 PC買い換えろww
7.1GってVB.Netだけのサイズなの?
>>116 >7.1GってVB.Netだけのサイズなの?
違うかも知れない。だけど、VB.Netだけをインストールする方法が
分からなかったヨ・・・。
これまで見たプログラム言語で1番良かったのは、潮田氏のフリーソフト
「N88互換BASIC for Windows95」 だな。・・ for windows95 と書いてあっても、
実際は XP でも問題なく使える(多分、vista や 7 でも)。プログラム自体では
16色しか使えないけど、windows の画面で使えるので そのままグラフィック
ソフトに移せば、1677万色を使っての色変更も簡単に出来る。
当分は、VBを勉強しながら、「N88互換BASIC」 を使って行こうと思っているよ。
あきらめろよ。
コピペ君って馬鹿だな、まで読んだ。
互換といったらFBASICとかいうの無かったっけ?昔ベーマガで見たような気がする
互換といったらActiveBASICだろ! 他のなんてクズだ!ゴミだ!クソだ!
んで、スレ違いなわけだけども
>>123 F-BASIC はWindows XP 以降は使えないから、問題外だよ。
>>122 ActiveBasic の公式ページって呼び出しても出て来ないよ。
もう閉鎖されたのかな?
結局、普及しなかったんじゃないの?
勝手に閉鎖とか言ってんじゃねえよ!ちゃんとwikiとかいっぱいあるんだよ! しらねえで言うな!
>>128 公式サイトが呼び出せなくてソフトをダウンロード出来ないなら、
話にならんじゃん! ダウンロードして、インストールして、使ってみて
初めて評価を下せるものじゃん!
ちょっとサイトが落ちただけで騒ぐな!ガキ!
呼び出す、って面白い表現だな。
出でよ公式!我が怨敵を滅するのだ!
>>131 「呼び出す」以外にはどんな表現があるの??
「ActiveBasic公式サイト」 は今日現在も呼び出し不能!!!
>>135 おかしいじゃん!
公式サイトをリクエストする、・・なんて。
HTTPでは「リクエスト」だな。一般的には「開く」とかいうんじゃないの?
ホームページへアクセス
ホームページと言うのはやめろ
ホムーページ
ほめぱげ
そういうもんだから。
144 :
142 :2010/07/04(日) 12:29:43
質問した後も色々と調べていたら、下記ページに vbs のルールが載っていました。
'VBScriptのオブジェクトを使いこなす − @IT
ttp://www.atmarkit.co.jp/fwin2k/tutor/cformwsh09/cformwsh09_03.html このページを踏まえて以下のように考えました。
'Property Let ステートメントは、そのクラスがインスタンス化される際、
'プロパティに値が代入されるときに実行される。
'例えば下記
objBook.Title = "VBSでちょっとオブジェクト第1巻"
'においては、プロパティ Title に値が代入されているので、
'代入と同時に Property Let ステートメントが実行される。
'ここで、プロパティ Title に代入された値はなぜか
'引数の strTitle に格納される仕組みになっているので、
'Property Let ステートメントの処理としては、
If Len("VBSでちょっとオブジェクト第1巻") <= 20 Then
pTitle = strTitle
Else
'となる。
'従って、pTitle に "VBSでちょっとオブジェクト第1巻" が代入される。
まあ、要は、プロパティのセットを set(プロパティ) ではなく
= で無理やりやろうとしたってことなんでしょうね
代入にセッターを使うのは馬鹿馬鹿しい、って、VBの伝統。
>>145 言語は java と C しかやったことがなかったので知りませんでした。
納得いく説明をありがとうございます。
もう 1 つ、VBScript に関して質問させて下さい。
メンバ変数のアクセス修飾子の意義についてです。
外部ファイル:external.vbs で定義している変数を取得したい場合、
Execute objFSO.OpenTextFile("external.vbs").ReadAll()
で取得出来ますが、Private で宣言した変数も取得できてしまいます。
java においては ※ また java の話を持ち出してしまって恐縮ですが
メンバ変数に Private をつけるのは外部からアクセスされないようにするためですが、
VBScript ではアクセスできてしまいます。
そこで、メンバ変数にアクセス修飾子を付ける意義は何だろう、と思いました。
なお、外部ファイルにアクセスする方法が上記以外にあり、
その方法においてはアクセス修飾子が有効になるとのことであれば
それについて教えていただけると幸いです。
ReadAll って、単なるテキストファイルの内容を読むためのメソッド。 当然、スコープなんて気にしない。 所詮スクリプトなんだから、あんまり考えすぎるなよ。 Windowsでまっとうなスクリプトをやりたければ、PowerShellの方がいいよ。
>>147 PowerShell は VBScript より便利なんですね。
自分も本当は他の言語が良かったんですが、現在の仕事の制約上しかたなくorz
細かいことが気になってしまう性格なのでまた質問することもあると思いますが
今後もよろしくお願いします m(_ _)m
ことわる
>146 言語仕様についてちゃんと説明されている本を一冊買っといたほうがいいよ
>>150 アドバイスありがとうございます。探してみます。
本と Web を両方とも使いこなせるようになりたいですね
ActiveBasic公式サイトは今日も閉鎖中だった。 ソフトをダウンロードできるところは他にないのかな?
スレ違い
スレッチだけど、やっぱり 「潮田氏の互換BASIC」 が最強ってことだな!!
156 :
デフォルトの名無しさん :2010/07/07(水) 12:59:44
スクリーンをキャプチャするプログラムで、 キャプチャする前にクリップボードにあるデータを避難させたいのですが それはデータごとに条件分岐しないとダメなんですか
まずMSDNを読んだか?
DDE通信がよくわからん
>>156 私素人だけど条件分岐したほうが良いに1票投じます
私素人だけどスクリーンキャプチャでクリップボードを使わない方法を探すと思います
私素人だけど民主党に1票投じます
OLEドロップでファイルを開くのと コマンドライン引数で渡されてファイル開くのと アプリケーションの関連付けでDDE通信でファイル開くのと なんか分けわかんない
国語のお勉強が先かも・・・ なんか分けわかんない ・・・ (×) なんか訳わかんない ・・・・・ (○)
2chで 誤変換をどうこう言うのってどうなのよ
(i)
ソーダ! 煮ちゃんで碁編缶がどうこう佑矢津は場可だな。
167 :
デフォルトの名無しさん :2010/07/16(金) 18:19:28
VB6で扱えるファイルサイズって2GBまで? Openで開いたBinaryファイルをByte配列に格納する場合とか
なぜ試さないのか
ワードでHPを作れるとからしいが VBAの埋め込みとか出来ないよな、常識的に考えて…… ファイル管理するならCGI作らないといかんのかー VBで出来ればと思ったんだが
VBでCGI? できると記憶してるが
テキストファイルに吐くだけなんだから基本どんな言語でもできるだろ。
ASP(いわゆる Classic ASP)でもやれば?
VBSにしとく。 多分楽だし軽い
>>171 そりゃWin32 API使うこと前提ならそうだけど、VB6だけじゃ無理じゃないか?
APIつかったらVB6じゃないのかよ
VB6の標準機能だと標準入出力が扱えないから、VBSとかの方が良いよ。
>>174 APIなんか使わなくてもテキストファイル吐けるだろうが
CGIは標準入出力だろう。ファイルじゃなかろう
まあVB使うよりはVBSだよなあ VBは入出力書かないといかんようだし
180 :
デフォルトの名無しさん :2010/07/29(木) 19:58:03
質問です。OSはwinxpです。 VB6でbatファイルを作ってそれを実行して他のアプリを動かし、 それで出来たファイルを処理するというプログラムを作っています。 実行する所は aaa = CreateObject("WSCript.Shell").Run("test.bat", 6, True) としているのですが、時々そのアプリがバグで暴走し終了しない事があります。 ある一定以上の時間が経ったら強制終了させたいのですが この場合処理待ちの所をやめにしてそこは自分でプログラムしないと 出来ないでしょうか?他に簡単な方法がありましたら教えてください。 よろしくお願いいたします。
VB6でUTF-8のテキストファイル扱うには やっぱADODB.Streamしか無いよね・・・・orz
テキストファイルから 特定文字の抜き出しって TextStreamのReadLineで一行ずつ読み込んでやるより ReadAllで全部読み出してからのほうが早いんだな・・・ まぁよくよく考えりゃ当然か・・・・
全部読み出すなら TextStream使わなくっても 普通にOpenで読み込んでも変わらんな・・・
184 :
デフォルトの名無しさん :2010/08/09(月) 17:00:05
過疎ってんな
185 :
デフォルトの名無しさん :2010/08/10(火) 22:44:02
お前ら、早くC#の世界に行こうぜ 昔作ったくそアプリの保守なんかもうやめろよw
186 :
デフォルトの名無しさん :2010/08/11(水) 01:05:24
MSがサポートやめるまでプログラミングをやめないぃいいい
サポート終わってるがな
C#めどい
はじめまして。 VB6.0のものだと思わしきプログラムを渡されました。 もしかしてVB6.0の開発環境は無償で手に入らないのでしょうか。 自分なりに調べてみたのですが、.NETに変換するのしか見つからなかったので。
無償とかイカレてんな
>>190 早速のお返事ありがとうございます。
.NETだとできるんで、6.0でも同様かなとか思ってました。
変なことを言ってしまい申し訳ありませんでした。
VB6は単品の販売もとっくに終わっているので、 MSDN Subscriptionでしか入手できなかったと思う。 あとは中古探すくらいかな。
193 :
デフォルトの名無しさん :2010/08/13(金) 03:18:32
Frameコントロールの内部座標がTwipでムカつく。Pixelでやりたいのに
With Picture1 Call .Cls Call .Line(x1,y1)-(x2,y2) End With Lineのとこでエラーが出るんだけど Withブロック内でLineメソッドって使えないってこと?
定数名ってどう決めたほうがいい? Public Const gcntMaxNumber Private Const mcntLimitNumber cntみたいなの付けて定数名にしてる? それとも Public Const MAX_NUMBER Private Const LIMIT_NUMBER 大文字にして定数名つけてる?
メソッド作るとき説明のコメント書くよね? 例えば '目的:〜 '引数:〜 '戻り値:〜 Public Function Hoge(v) 〜 End Function みたいに こういう説明ってイベントにも書いたりするの? 例えば '説明:〜 Public Sub Command1_Click() End Sub みたいな感じに
ggrks 話はそれからだ
>195 Call .Line((x1,y1)-(x2,y2))
ごめんうそついた
>>194 With使う時はオブジェクトブラウザにある書式でやればおk
Sub Line(Flags As Integer, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, Color As Long)
↓
With Picture1
Call .Line(Flags,X1,Y1,X2,Y2,Color)
End With
Flagsは かなり面白いよ Private Sub Picture1_Click() Static p% Me.Caption = Hex(p) With Picture1 Call .Cls Call .Line(p, 50, 50, 100, 100, vbRed) End With End Sub これで試すといい
Private Sub Picture1_Click() Static p% Me.Caption = Hex(p) With Picture1 Call .Cls Call .Line(p, 50, 50, 100, 100, vbRed) End With p=p+1 '←この行が抜けてた End Sub
Function bi(p) If p < 2 Then bi = p Else bi = bi(p \ 2) & CStr(p Mod 2) End If End Function Private Sub Picture1_Click() Static p% Me.Caption = bi(p) With Picture1 Call .Cls Call .Line(p, 50, 50, 100, 100, vbRed) End With p = p + 1 End Sub 2進数にしたほうがわかりやすいかも
やっとの思いでVB6.0Professionalを入手しました。
ちょっと時代遅れ気味ですがVC++と連携でアプリを
書く予定です。
参考書を探しているのですが、おすすめの本があったら
教えてください。
なお自分でも探してみたのですが、安価な本はどうも
内容が薄すぎて参考にならないことがわかりました。
この本は非常に高価ですが有益なのでしょうか?
http://www.amazon.co.jp/dp/4839902003/ ご存知でしたら教えてください。
ひょっとして、そのネタを振るためにわざわざわざとらしい質問してたのかな。 なんていうか、同じ暇つぶしでももっと有意義なことした方がいいんじゃないのか。
無意味な質問では無いと思う
VBの場合、初期段階の頃盛んに良い参考書が出版されたが
Office VBAの出現やJavaの出現、Internet周りのWebアプリ
の出現、極めつけは超難解言語VB.NETの出現に押されてか
もともと貧弱だった参考書市場が一気に縮小
その割には結構使われてるし需要があるという奇妙な状況にな
って久しい。
>>204 の本が異常な価格が付いているのは
Amazonの査定がいい加減というわけでもなくて、何か
とんでもなく重要な情報が書かれているとかそういうん
じゃないの?ま、ちょっと危ない感じだから手は出さない
ほうがいいと思う。(出せないだろうがw)
>>206 アマゾンは中古本の査定なんてしない。
っていうか、君質問者自身じゃないのか
なんで今更VB6?
>>209 VB6のシンプルな文法が好きって人も多いかも
(VBAのほうが良いのだろうがコンパイラがない)
.NETのVBは難し杉
まぁ一部文法以外はほとんど使う必要などないのだろうが
新しい文法を使ってみたいというのが人情というもので無理に
使う奴が必ず居てそれを読まされたりして苦労する
そういう意味じゃなく、既にディスコンになって久しく、サポートも終了、入手困難、この先使い潰しの利かない VBを勉強してどうなるのか、って話。参考書が必要なレベルなら素直にC#にするべきだと思うがな。 VBはやりたいことが素直にできないことが多い、無駄の多い言語環境だと思うよ。意味不明な仕様も多いし。
単に、そういう仕事があるから「やれ」って言われただけじゃね?
213 :
デフォルトの名無しさん :2010/08/16(月) 17:23:30
VB6以前で作られたソフトウェアのメンテナンス?まだ使ってる企業あるの?
あるよ。システム入れたら、15年、20年使う企業もあるし、 2000年当時、VB6は現役だったしね。
まだVB4ですが・・・
>>213 うちは .NET に移行してるけど
まだ VB5 のバージョン使ってるお客さんも居るよー
大人の事情で面倒見ないとイカンのよね
VB.NETはC#以上に「何でもあり」な言語だからなw その点は十分に注意しなければならないが
は?
>>207 添付CDがないからその価格
添付CD付きだと最早3000万円らしい
よほど重要なファイルが添付 CDにあるんだろうな
未だにN88BASICが稼動している会社があるぐらいだから VB6は余裕で現役
ついに突破! 37,887,200
触るな汚れる
225 :
デフォルトの名無しさん :2010/08/18(水) 23:35:27
>>222 うちの大学でも実験用装置の動作プログラムがN88BASICだった・・・
古いプログラムで新しいの作れる人いないからずっと使い続けてるって言ってたな・・・
227 :
デフォルトの名無しさん :2010/08/20(金) 14:06:57
初心者です。すみませんがどなたか教えて下さい。 家庭内LANに接続された2台のPCがあります。 IPアドレスはぞれぞれ、192.168.0.1と192.168.0.2です。 このとき、192.168.0.1のほうのPCで動作させているVB6のプログラムから、 192.168.0.2のほうのPCのc:\dataというフォルダにファイルの書き込みを 行いたいのですが、ディレクトリの指定はどのようにすれば良いのでしょうか? また、ファイル(フォルダ)の共有など必要な設定があればこちらについても 教えて下さい。 宜しくお願い致します。
バージョン名を明記の上でWindows板で再質問
>>204 でわかるようにVBスレで質問すると
高くつくよw
>>227 open "\\192.168.0.2\c$\data\hoge.dat" for output as #1
230 :
227 :2010/08/20(金) 14:29:19
>228,229 ありがとうございました。
ネットワークドライブはネットワークドライブにマ ウントしてアクセスするのがマナー (IPアドレス直書きはできてもしないで澄むのならし ないようにしたいもの)
>>229 こんなこと出来るのか・・・知らんかったわ
そんなマナーないよ。
>>231 マナーじゃなくてセオリーね
¥¥IP-addrで識別してくれるかはネットワーク構成に依存だったような
記憶。
ソース出せよ 適当なこといいすぎ
そんな依存もないよ。 Kerberos認証で問題になることはあるけど。>IP でも、ホスト名での接続なら問題なし。
大抵の企業LANですらそうなのだから、家庭LAN程度だったら 普通コンピュータ名付けてアクセスし、共有フォルダーも ネットワークドライブに割り当てるだろ
何言ってるの?
ネットワークドライブは、太古にはフリーズの原因で嫌われた 共有フォルダーはしょうがないがコンピュータ名(女の子の名前 が多かったりする)付けるなんて古過ぎ(何、このおっさん) 特に家庭LANでそれやってたらカワイソス 企業LANでもIPプリンタ当たり前のこの時代にIP指定は 規定じゃんw
ネットワークドライブはないわ。30年前の常識かな。
誰か、賛同してやれよw
まあ、どこまでマジで言ってるのか分からんが、
>>239 みたいな抽象化という思考ができないタイプって、
例えばシステムディレクトリを"C:\Windows"って決め打ちしてあるような
糞コードを書くVBerなんだと思う恐らく。
抽象化と象徴化の区別が出来ているVBerは優秀だと思う
どっちも意味不明な言葉 プログラミングの入門本レベルの言葉じゃ無さそう
入門以前の言葉だったりして...
日本語としての意味は知ってるわ ことプログラミングに用いた場合どういう意味になるかってこと 絵画や文学でも抽象化とか象徴化とか言ってそのまんま日本語の意味で使わないだろ
何をどう抽象化するのかとか 何をどう象徴化するんかとか 分からんだろ
お前らを嘲笑
コンピュータ名に女の子の名前か・・・おらわくわくしてきた
250 :
デフォルトの名無しさん :2010/08/21(土) 09:42:42
うちの高校は商業科なのですが Vb6を教えています なんでも、全国商業高校連盟がVB6かCOBOLを教えろって決めてるらしいです クラスメイトがかわいそうです どうしたらいいですか?
おまえのちんこをうpすればいいよ
全国商業高校連盟にPTAを名乗ってクレームの電話しる
高校の授業ならアルゴリズムの考え方を理解するのが 目的なんでわかりやすい言語ならなんでもいいんだよ。 オブジェクト指向はもとより関数というものさえ 必要ない程度だからな。 変数と四則演算と繰り返しと比較ぐらいの 文法があれば良い程度のことしかしない
254 :
デフォルトの名無しさん :2010/08/21(土) 14:11:25
最近のプログラミング言語に初心者向きな言語ってあまりなさそうだからな 大学入試センター試験の数学ってまだ古い行番号BASICの使ってるのかな?
ageてまで言うことかよ
256 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 15:47:46
>>250 COBOL教えてどうするんですか?
COBOLってイメージカラーが黄色で電気タイプみたいです
バカって一生勉強ですよね 成果物も作れず
ブログとかに、「沢山やりたいことがありすぎて困る!C,C++,JAVA,Python,PHP,VB
日々勉強中」
とか書いてそうなノウタリンですか
ありがちな自己紹介分です
頭使ってますか?それともクソガリだから脳味噌に栄養が行き届いていない栄養失調の孤児ですか?
30〜40代くらいのオッサンはやたらとCOBOLとかわめくんですが 社交辞令みたいなもんですか
>>253 関数使うんですが、メソッド覚える時に必要ですよね 頭平気ですか?
なんかバカ派遣企業のITオタみたいですね 頭わいてますか?頭わいてますね?
クソバカゴミコード書いてるんでしょう
とりあえずここのスレレベル低いですね
君達の書き込み見させていただきましたが・・・ 馬鹿が書き込みに滲み出ていますよ(笑)
VBスレでCOBOLの話すんなよ
258 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 16:10:28
キモバカゴミがほざいてますね VBのスレなんてゴミだから何でも話していいんですが^^;
COBOL - Wikipedia
ttp://ja.wikipedia.org/wiki/COBOL 過去に政府や企業の膨大なデータがCOBOLによって処理され蓄積されているため、
現在でもCOBOLによって電算処理されている情報は膨大な数に上る。
現在でも稼動しているCOBOLによるコードは2000億行に上るとされており、
これはFORTRANとアセンブラを合わせた数十億行に比べても圧倒的に多い。
このように誕生から半世紀たっているにもかかわらず、今なお主流言語として使用されている点で、
他の初期の言語とは大きく異なる(2000年時点の世界の民間企業の8割、2009年の日本国内の調査で17.1%で2位[1])。
260 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 16:11:28
VBやってるやつってバカばっかですよね 頭がいい人はPerlをやるんですよ 低能はVB(笑)
261 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 16:12:34
クソバカゴミほど政府で使われてるとほざきたがる(笑
VBスレでCOBOLの話すんなよ
>VBやってるやつってバカばっかですよね あたりまえだろ・・・ 学校でも教えたりするし ExcelでVBAが入ってるんだから VBを使う人間は色んな奴がおるんだから 他の言語やってる人たちと比較すりゃ 平均的にバカになるだろ
264 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 16:15:23
同じ事しか言えない 認知賞(笑)
>>258 それは2ちゃんねらーとしてマナー違反だな
忍者Perlさんは低脳を相手にするくらい頭がいいんですね。
267 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 16:18:22
>>263 Perlやってるやつらはハイレベルっすよ!!
NARUTOでいう暁レベルっすね!
君達VB組は いつまでたっても下忍レベルっすね!!
シュッシュッシュ!!カゲブンシン!!
VBAってなんですか!!!しらねーんですがね!!シュッシュッシュ!!シュッシュッシュ
お尻プリプリーーーーーーーーーーーープリプリー!!!
VB使ってるやつはバカなんっすね!!!!!!!!!!!認めましたか!!!!
死ねっ!!!!(笑)
>>267 VB使い → バカ
Perl使い → ハイレベル
それは分かった
それで結論は?何が言いたいのか分からないんだけど。主張は何?
うずまきナルトは下忍だけど木の葉で一番強いんじゃなかったっけ?
下忍のナルトさんが暁のメンバーを何人か倒してたよな
Perlやってる自宅警備員、か。
このスレはいつもこの程度の話題で盛り上がるよね
274 :
Perl忍者仙人モード ◆M5ZWRnXOj6 :2010/08/22(日) 20:27:06
この程度ってほざいてる時点で、笑いにクオリティ求めてる お笑いブームに便乗したチンパンジーニアスですね。 フッ(笑)
誰か相手してやれ
やなこった
277 :
Perl忍者仙人モード ◆M5ZWRnXOj6 :2010/08/22(日) 21:08:28
人間、力でも脳味噌でも勝てない相手を見つけると 無視をして勝ち誇りますからね 君の言動そのものですよ 大人の対応=無視 ネットなのに大人ぶってるごみども死んだ方が良いよ
6ヶ月ぶりにレスしたらPerl忍者が来たでござる、の巻
279 :
Perl忍者仙人モード ◆M5ZWRnXOj6 :2010/08/22(日) 22:40:43
>>278 君、Perlできるかね?
良かったら俺のチームはいらない?
89 名前:Perl忍者仙人モード ◆M5ZWRnXOj6 [] 投稿日:2010/08/22(日) 20:35:52 ID:mFvITFpR ばかじゃんサービスとか 自宅サーバなどwebアプリ開発とか所詮そんなもんだろ くだらね バカの極み 仕送りして無様な生き様かましてるゴミそうだし 人生終らした方が良いかもねバカは(笑)
>>204 もう2億5千万円を超えてる
何か異常なことが起きてるみたいだ
CDの有無で3円差か…。 類似した商品から提示されたタグ ぼったくり出品者に注意(4) にワロタ
283 :
デフォルトの名無しさん :2010/08/25(水) 00:39:01
ブックオフを何件か回れば発掘できそうな気もしなくもないが 神保町や秋葉原あたりならありそう
>>281 ソフトウェア自動更新のバグ。
他の人より自動的に安い価格にしてくれるソフトがあって、
設定しだいでは、他の人よりちょっとだけ高い価格にもしてくれる。
(それでもコメントがよければ、高く売れる可能性がある)
というのを両者がやっていると、
どんどん、あいてより高い値段に自動更新されていく
のかもしれないね。
>>204 5億5000万円
ベンツ新車普及品上クラスでも10台は買える
286 :
デフォルトの名無しさん :2010/08/27(金) 16:57:44
>>286 中古なんだから出品者が自由に決められる。
つまり出品者の頭がイカれてるてことか
なんだか過疎ってね
>>204 でもう10億円突破は間近
これって金融筋のい貸付資産評価額
操作とかじゃね〜の?
>>204 売れたみたい。ROM無しのほうが10億円で?
しかし売れ残りROM付きは大暴落で2000円弱
値段気づいて戻したらすぐに売れたとかじゃね
つ 粉飾決算
OS:winXP ver:VB6 SP6 やりたいこと: 自作のクラスに「Index」というプロパティを追加したい。 やったこと: 自作のクラスに「Index」というプロパティを追加すると、 ファイル読み書き用のIndexと被ってるから定義できませんでした。 質問: 自作のクラスに「Index」というプロパティを追加する方法はありますか?
なんか、Forを変数名に使いたい、とかいうのに似ている気が
296 :
デフォルトの名無しさん :2010/09/05(日) 00:57:46
Indexという名前を諦めるのが一番早い Index2でもMyClassIndexでも適当に名前を変えろ
>>294 何も考えずに普通に出来るけど...
何を寝ぼけたことを言ってるんだ?
Public Index Public Sub Hoge() Index=5 Dim Index End Sub とかしてるんじゃね
vbaとaccessで作られているwindowsソフトを自分で作りたいのですが、代わりになる言語は何かありますか? また、このソフトのファイルから、コードを戻すみたいなことは出来るんでしょうか?
ない&無理
了解!ありがとう!
VBAはどっかのファイルにテキストとして埋め込まれてるんじゃね? 暗号化されてるだろうけど
303 :
294 :2010/09/05(日) 12:58:47
めちゃめちゃごめんなさい。 「Index」ではなくて、「Input」でした。 すいません寝ぼけてました。 「Index」だったら普通にいけますね。 「Input」だったらエラーになってしまいます。 よろしくお願いします。
つ 予約語
lnput とかにしとけ。
306 :
294 :2010/09/05(日) 14:49:08
やっぱり無理なんですね。 他のクラス(MSのライブラリ)と同じ作りにしたいので、別名にはしたくなかったのですが。。。 他クラスに1枚ラップして、対応しかないですね。。。
>>302 お、詳しく知りたいです。だとしたクラック可能ってことですか?
自分で調べようとしないのか?
mdbはデコンパイル出来るみたいですね。なんとかなりそうです。ありがとでしたー
Private Sub Command1_Click() Dim hoge1 As New hoge Dim hoge2 As New hoge Dim hoge3 As New hoge Dim hoge4 As New hoge Dim hoge5 As New hoge Dim hoges(4) As New hoge Set hoges(0) = hoge1 Set hoges(1) = hoge2 Set hoges(2) = hoge3 Set hoges(3) = hoge4 Set hoges(4) = hoge5 Call test(hoges) End Sub Private Sub test(hoges() As IHoge) Dim num As Integer On Error Resume Next num = UBound(hoges) On Error GoTo 0 MsgBox num End Sub hogeクラスはIHogeクラスをimplementsしたクラスなのですが、 配列にするとエラーではじかれてしまいます。 これはこういうものと受け入れるものなのでしょうか?
vb6でimprlementsってできたっけ?
普通はコレクションにするわな。
Newで宣言してSetしてるからじゃね? Dimo hoges(0 To 4) As hoge でいい気がするが
VB6で配列がどういう扱いだったか忘れたけど、 要するにHogeの配列とIHogeの配列は別物ってことでしょ。 ドトネトでいう「配列の共変」をサポートしてないんだろう。
Dim hoges(4) As New hoge ↓ Dim hoges(4) As IHoge にすればいんでね?
317 :
310 :2010/09/08(水) 19:19:16
皆様、回答ありがとうございました。
>>313 開発の縛りでVB6、かつ、Genericsがないという事で、コレクション使用禁止な縛りです。
>>314 >>316 あ、Newいらなかったですね。
>>315 やっぱそういう事になりますかあ…
Generics?
オブジェクト指向とかやめたほうがいい
なぜ
ジェネリックスじゃないコレクションが使えるだろ。
Dim korekusyon As New Collection Dim hoge1 As New Hoge korekusyon.Add hoge1 For Each v In korekusyon Next
VB6でオブジェクト指向プログラミングって出来たんだっけ?
ケチつけたいだけなら部屋の隅でやってくれないかな
>>324 VBの文法くらい(特にVBA)オブジェクト指向的なものはない
というかVB系(VBA VB.NET VBScript)では空気や
水みたいな感覚
特にあえてオブジェクト指向と言う必要はもないと思いまつ
Cにクラス概念メソッド概念とかを追加して
C++にしてそれをオブジェクト指向だというの
はC系言語の世界で閉じた話
クラスモジュール禁止なプロジェクトが多かったよ 例外なくデスマ
クラスはいいけどimprementsはいらないなー
まあ俺ほどVB6を使いこなしてる人間もいないと思うけど
はいそうですね そういや 「俺ほどCOBOLに精通してる奴はそう居ないな」 とか言ってた元上司は今何してんだろ・・・
コボラーとして人に噛み付きまくってますw
VB6しか知らないけど、オブジェクト指向とかその言葉の意味すらわかんないや VB6は趣味でたまに仕事に使ってるが今から新しく覚えようとも思わないし、 自分の作りたいものがVB6でできるならオブジェクト指向とかどうでもいいよ それなりに動いて保守もできれば文句はないよ。どうせ俺が死んだら今の会社はなくなるんだし ソースを別の人が読めないとかどうでもいいね。死んだ後のことは生き残った人がどうにかすればいいよ だからVB.NETは難しくてわからない。
構造化プログラミング?
>332 それはそれでいいんじゃね
335 :
デフォルトの名無しさん :2010/09/11(土) 16:44:38 BE:811976437-2BP(1201)
仕事でVBからexcelを編集するプログラムを作ろうと思い 参照設定でexcel2000が入っておらずどのようにexcel2000の参照設定をしたらいいのですか
参照設定はしないほうがいい
開発が楽なんで開発時は参照設定をすることがあるな。
338 :
デフォルトの名無しさん :2010/09/12(日) 18:13:03 BE:695980229-2BP(1201)
あと参照設定でexcelのどのバージョンでも動くようにするにはどうするのですか
無理。
いやいやエラーが発生したら遅延バインディグでリトライするコードを書くだけ。 実際にバージョン違いでエラーが発生するメソッドはそうはないから、 必用なコード量はたいしたことない。 VBerは諦めが早いっていうか、このての普通の知恵が回る人って少ないよな。
最初っからレイトバインドすればいいだけ。
そういうのを「羹に懲りて膾を吹く」といいます。 古来、お馬鹿さんの見習いたくない傾向を表現したことわざです。
わざわざアーリーバインド、レイトバインドを両方やる、なんて方が よっぽど間抜けだと思うんだが。
真面目な話、そんな考え方してるからVBerって笑われるんだよ。 っていうか、誰が積極的に両方やるなんて言ってるんだ? エクセルのバージョン違いで動かない部分に関しては、 危険で面倒な遅延バインディングを使えばいい(使うしかない)と言ってるだけだが。
> いやいやエラーが発生したら遅延バインディグでリトライするコードを書くだけ。
って、
> あと参照設定でexcelのどのバージョンでも動くようにするにはどうするのですか
への答えになってないじゃん。
>>339 の言ってることは間違ってないな。
4.0より前のC#ならいざ知らず、別に危険でも面倒でもない。
すみません。下記をVB6でやるにはどうすればよいでしょうか? 下記はVB.NETのコードです。 Dim o As Control For Each o In Me.Controls If o.GetType Is GetType(TextBox) Then o.Enabled = False End If Next
3行目を If TypeName(o) = "TextBox" Then か If TypeOf o Is TextBox Then とか?
VB6.0のDTPickerについて教えて下さい。 DTPickerをキーボードで入力する際、以下の動きを実現させたいのですが可能でしょうか? ・年入力→Enter→月入力→Enter→日入力→Enter→次のコンポーネントへカーソル移動 現在、DTPickerでのEnter時に右カーソルを割り当てて、Enterで年→月→日の移動は行えている状態です。 ですが、日入力後は次コンポーネントへ移動させたいので、現在入力している箇所を取得できるような方法が知りたいです。 (Tabで移動させれば?と言うのは無しでお願いします・・・。)
補足です。 プロパティがわからなかったのでコードで実現しようと 以下のコードを書いたのですが、keycodeにkeyTabを設定しても 次コンポーネントへ移動しませんでした。 画面からTabキー押下ではちゃんと次へ移動するのですが・・・。 ---------- Private Sub dtp_change_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyReturn If Shift = 1 Then KeyCode = vbKeyLeft Else If Right(gs_date, 2) = CStr(Right(frm_main.dtp_change.Value, 2)) Then KeyCode = vbKeyRight Else KeyCode = vbKeyTab End If End If gs_date = frm_main.dtp_change.Value End Select End Sub ---------- *gs_date はdtpickerが編集される前の値が入っています。
そーゆーのは無理。やりたければ、keybd_eventなりSendInputなりで、 TAB押下をエミュレート。
>>352 回答ありがとうございます。
そちらの方法でやってみますm(__)m
Collectionを空にするときって Dim c As New Collection というコレクションとして Do While c.Count>0 c.Remove 1 Loop と Set c = New Collenction (同じコレクションを参照するほかの変数とか無いとして) とどういう違いあるの?
前者は既存のインスタンス内のitemを1つずつ除去 後者は新しくインスタンスを生成
As New ってアリなの? なんかその変数にアクセスした段階で勝手にインスタンス作ってIs Nothingでチェックの意味がないとかなんとかどっかで見たような
Class1にHogeという関数があるとして Dim c As Class1 Set c = Nothing c.Hoge ←実行時エラーが出る 一方 Dim c As New Class1 Set c = Nothing c.Hoge ←実行時に自動的にインスタンス生成されHogeが実行される。途中にNothing代入してもだ という話?
>>354 左を向くのと、
右を向いて右を向いて右を向くのでは
結果は同じでも、やっている処理はぜんぜん違う。
最終的には同じように見えるかもしれないが
やっている内容はぜんぜん違う。
入門書なんか見るとAs New使ってるのが多かった記憶があるな
As New宣言はVariantと同じで、使うべく所には使えばいいが、それ以外で無闇やたら使うなってだけ
このスレでもクラスをうまく理解してない人多いんだなぁ VB6erの俺としてはちょっとガッカリした
>>354 がこんな疑問を抱いたのはたぶん
「オブジェクト変数の宣言文はAs Newと書く」と間違って覚えてるから
New宣言文はできるだけ使わないほうがいいよ、バグの温床になるし実行速度もやや下がる
>>356 ,
>>357 ,
>>358 不気味かな? 気持ち悪いのは単にこの仕様を知らずに使ってる人を見たときだけだろ
Form1なんかは有無を言わさず常にAs Newの動きをしてるんだが気付いてる?
たしか、As Formでインスタンス作ると普通の振る舞いをするが、As Form1で作るとAs Newと同じ動きをしてしまう
(破棄した後もアクセスすると復活してくる。仕様を知らなきゃゾンビみたいで気持ち悪かろう)
あーそうだったそうだった 破棄したのにアクセスしたらもどっちゃうんだっけ たしかに気持ち悪かった
Form1 の暗黙のインスタンスはまた別の話じゃね?
>>362 俺は上の人たちと別人なので同じ見解かどうかわからないが、
やっぱり「気持ち悪い」のは、仕様の実態はNothingでアクセスされた時に
暗黙的にインスタンスが自動生成される特殊な変数宣言なのに、構文だけ見ると
一見変数を定義と同時に初期化しているように見えるからでしょ。
366 :
362 :2010/09/26(日) 00:31:46
>>354 あーごめん、よく考えたら質問の答え書いてなかった
以下の条件なら違いはない(ので=Newのほうが好ましい)
・このCollectionのインスタンスを他から一切参照していない
・Collection内のすべての要素を破棄する
内部的にやってる事はまるで違うが「cが空のCollectionになる」という結果は同じ
=NewするとObjPtr(c)の値が変化するが、c以外誰も参照していないなら問題にならない
これは考え方の違い。変数cについて考えるか、cが参照しているコレクションについて考えるか。
cを空にしたいだけなら=Newでいいが、コレクションの中身をすべて消したいのならいちいち.Removeするしかない
もし仮にこのコレクションのインスタンスが他の場所でDとして参照されている場合、
cに=NewしてもDのコレクションは空にならずそのまま残る。
このコレクションがc以外の手に渡る可能性があるならこういうコードになるよ
--------------
>>364 別といえば別だけど、まぁ動きを理解するのにいいかと思って書いた。誤解を生んだらごめん
でもフォームも(やや特殊だけど)ベースはクラスと同じもんなんだって事を知っておいて欲しいんだわ
>>365 一見って事は仕様を理解してないって事だと思うんだ(VBを理解してないというか)
As Newの存在とVariantは何が違う? それともVariantの存在も絶対悪と考えてる人?
まぁグローバルでAs New使ってるようなコードに出会ったら気持ち悪いと思うのはわかるw
でもいろいろ熟考した結果、ここはAsNewしかないと思えば使えばいいと思う
つーか言語仕様の賛否は不毛なのでもうやめるわ、ごめんw
WinAPIの CryptBinaryToString をVB6から使う方法が分かりません。
参考:MSDN(英語)
ttp://msdn.microsoft.com/en-us/library/aa379887 (v=VS.85).aspx
VB6で使う方はあまりいないようでサンプルを見つけられませんでした(海外サイトにも)
そこで翻訳サイトと辞書片手に自前で宣言文を書き起こし、呼び出しコードを実装してみたのですが、
以下のコードはうまく動かず途方にくれてます。(実行するとIDEごと落ちます)
英語は得意ではなく、何かを見落としているのだと思います。
間違いが分かる方いらっしゃいませんか?
'---------------------------------------
'※ 【警告】実行すると落ちます
'---------------------------------------
Private Enum ENUM_CRYPT_STRINGFlag
CRYPT_STRING_BASE64HEADER = &H0&
CRYPT_STRING_BASE64 = &H1&
CRYPT_STRING_BINARY = &H2&
CRYPT_STRING_BASE64REQUESTHEADER = &H3&
CRYPT_STRING_HEX = &H4&
CRYPT_STRING_HEXASCII = &H5&
CRYPT_STRING_BASE64_ANY = &H6&
CRYPT_STRING_ANY = &H7&
CRYPT_STRING_HEX_ANY = &H8&
CRYPT_STRING_BASE64X509CRLHEADER = &H9&
CRYPT_STRING_HEXADDR = &HA&
CRYPT_STRING_HEXASCIIADDR = &HB&
End Enum
'続く
368 :
367 :2010/09/26(日) 01:48:25
'続き Private Declare Function CryptBinaryToString Lib "Crypt32.dll" Alias "CryptBinaryToStringA" _ (ByRef pbBinary As Byte, ByVal cbBinary As Long, ByVal dwFlags As ENUM_CRYPT_STRINGFlag, _ ByRef pszString As String, ByRef pcchString As Long) As Long Private Sub test() Dim bAryBinary() As Byte 'テスト用バイナリ Dim strHex As String '16進数文字列 Dim lngHexLen As Long, Ret As Long, i As Long 'strHexのバイト数, API戻り値, テストデータ作成用 ReDim bAryBinary(99) '100バイトのバイナリ作成(各バイトを0〜255でランダム化) For i = 0 To 99 bAryBinary(i) = Int((255 - 0 + 1) * Rnd + 0) Next 'API呼び出し1(HEXのサイズを取得) Ret = CryptBinaryToString(bAryBinary(0), UBound(bAryBinary) + 1, CRYPT_STRING_HEX, ByVal vbNullString, lngHexLen) strHex = StrConv(String(lngHexLen + 1, 0), vbFromUnicode) 'HEX変数のメモリサイズを確保 'API呼び出し2(HEX文字列の受け取り) Ret = CryptBinaryToString(bAryBinary(0), UBound(bAryBinary) + 1, CRYPT_STRING_HEX, strHex, lngHexLen) Debug.Print Len(StrConv(strHex, vbUnicode)) & ":" & strHex End Sub
369 :
367 :2010/09/26(日) 05:52:40
エラーが起きるのは呼び出し2です。 どうもAPI側が別のアドレスに結果を書き込もうとしてるような… つか眠たい…
370 :
367 :2010/09/26(日) 06:54:32
あー…動きました! Declare文の「 ByRef pszString As String 」をByValに変更。 つかなんでByValで動くのでしょう? API側はなぜ書き換えが可能なんだろう? さっぱり腑に落ちません… ByRefだとダメでByValだとうまくいく理由、どなたか解説して戴けませんか? 変数のポインタ周りの処理が絡んでるんでしょうけど… ByValなら、相手側変数に対して値をコピー ByRefなら、相手側変数にポインタをセット APIにByValで渡すと、相手は値は分かっても変数のアドレスは分からないはずで、 呼び出し元の変数に対しては何も処理出来ない…と考えてるのですが。 実際は書き換えられてるから不思議…。
>>370 おつw
値渡しでも値が返るのは、渡したStringの値がそもそもポインタ値を含んでるからじゃね?
俺はこれをうまく説明できない。
参照渡しだと落ちる理由も説明できない。
ただ、ByValでStringを渡すと、Stringのヘッダ(構造体)が相手にコピーされてるんじゃね?
相手のヘッダ(構造体)にはVB側変数の文字列の先頭アドレスが格納されてる事になるので
相手側が普通に読み書きを行うと、それはVB側の変数に対して行われるって寸法?
ByRefの場合は…VBが自動変換した結果、相手に違うポインタが見えてるじゃね?としか。
ところでこのAPI関数面白いな。
今度使いたいから誰か謎を解いてくれw
>>371 だが調べてみたぞ。後半が全然違ってたorz
まぁ2行目だけは合ってたw
API宣言がLPSTR型ポインタになってるならByVal Stringでおkらしいぜ。
(ByRef Byteにして配列の要素0渡しでも可? / ByVal Longにして配列の要素0のVerPtr渡しでも可?)
参照:【KB187912】「Visual Basic および C の DLL の間で文字列を渡す方法」
ttp://support.microsoft.com/kb/187912/ja 俺はVBしか知らんのでCの話はよくわからんが、こういう感じらしい。
VBのString型はCではBSTR型にあたるらしく、このBSTR型は文字列へのポインタになってる。
String型が持ってる値ってのは所詮4バイトのポインタ値であって、
そのポインタの先が文字列、つまりByte配列(の先頭要素)を指してるわけだ。
ByValでStringを渡すのはStringの実値を渡す事になるので、結局はByte配列の先頭ポインタが渡される。
Cでは文字列の先頭ポインタを持つ型はLPSTR型にあたり、VBがByValで渡したStringはちょうどこの型と一緒になる。
このAPIの引数はまさにLPSTR型なのでByVal宣言で大正解ってわけだ。
じゃByVal Hoge As Stringで渡すのは、ByRef Hoge As Byteとして配列要素0を渡すのと同じ事なのな。ややこしいなw
ByRefでStringを渡すとどうだ…? 純粋にString変数へのポインタが渡されるんか?
とするとメモリ確保サイズは4バイト。相手側はこれを大きなバイト配列だと勘違いして書き込む…あぁ、そら落ちるわw
そういうもんだ、って理解でいいだろ。 微妙にマーシャリングみたいなこともやってくれるし。
>>373 普段は動けばおk!でいいかもしれんが、(俺もそうだが)
Declareを自前で書いた367については違うだろうよ。
Variantのメモリ構造はどうなってんのか?とか。
先頭バイトにはVarTypeで得られる値がそのまま入ってるとか知ってたか?w
もちろん知ってる必要はない。どうでもいい情報だ。本来ユーザーの管轄外だからな。
だがそういう事情を多少知ってないとDeclareで何が起きてるのか類推すんのが難しくなるよな。
>>367 そういやString渡すとVBによって勝手にUnicode→SJIS変換される。
>>373 のマーシャリングってこの事かな。
VBではAPIはW系じゃなくA系使えっていう理由がこれ。
逆に受け取るときはSJIS→Unicode変換されてる。確保したバイトサイズを別途通知する場合には気を付けんとな。
(VarPtr/StrPtrの値は変わらんからポインタは変わってない。純粋にStrConv代入と同等だな)
そういうわけだから、このコードだと確保サイズが足りないぜ。その2倍必要だ。
だが受け取り用String変数を事前にStrConvするのは無駄な処理だ。単にString(lngHexLen)を入れればいい。
戻ってきたものをStrConvする必要はないぜ。まぁコードが動けば文字化けするから気付くと思うがw
もう少しオーバーヘッドを抑えたいならバイト配列宣言にしたほうが良いかもしれん。
StrConvが一回分浮くし、確保する時String関数やSpace関数よりReDim Preserveのが処理早いんじゃないか?
(ちなみに ReDimはPreserve付けた方が高速ってのはみんな知ってる話なのかな?)
つーか、そこまでして除きたければ、デバッガでレジスタ見ろよ。 LPSTRはByVal Stringで渡します、ってのは、大昔からの決まり事なんだから、 「それでいい」んだよ。
みなさん宇宙語を話すのはやめて下さい
>>375 デバッガなんて、正直生粋のVB6erの俺にはわかんらんのだよw
つかなんで切れてるんだよ興味無ければスルーしてくれよw
>>376 ワレワレハ(略
自重する。
378 :
367 :2010/09/26(日) 21:39:14
物議をかもす原因になってるみたいですいません
どうかこの件で喧嘩しないで下さい(^^;
>>371-372 ,
>>374 おぉぉ、本当に助かりました! 参考リンクもありがとうございます
すべて理解出来たわけではないですが、少なくともMSがValで渡せと説明してる時点で数倍安心できますw
配列初期化でPreserveのほうが早い、というのは驚きました
感覚的には遅くなるよう気がするのに…興味深いのであとで試してみますね
>>373 私も他人の宣言文を流用する際は「そういうもんだ」で済ましますけど、
さすがに自分で書き起こした宣言だと不安じゃないですか…?
今回のは特に「本当に正しく動いてるのか…?」という疑心暗鬼が払拭出来ずモヤモヤしてた次第です
>>375 私はその「大昔からの決まり事」を知らなかったため納得がいかず困ってたようです
「常識」としてすでに習得している方から見れば下らない無駄な内容だったかもしれません申し訳ありませんでした
数倍安心して・・・。
380 :
デフォルトの名無しさん :2010/09/27(月) 02:00:51
もう許せない。 今すぐVB厨を金属バットで殴りまくって撲殺してしまおうぜ!!!
犯罪者だって自覚は持てな
初心者なのですが質問させて下さい 講義でVisual Basic 6.0を使用して一つプログラムを作ることになったのですが、何か面白いプログラムアイディアは無いでしょうか? 漠然としていて申し訳ないのですが、使用者の観点からこういうのしたら面白いよ、などあったら教えてもらえないでしょうか? よろしくおねがいします
本気で漠然としてるな… せめて講義の方向性だけでもワカランと、面白いの方向性がサッパリワカランと思うが…
VB6の講義を初心者がするってw つかどんな相手を対象としたどのレベルの講義なんだ? 面白いってのはゲーム的な? それとも業務的な? それにどんな事まで許すのか? 標準フォーム・標準コントロール以外ダメとか、 オブジェクト不可とかAPI不可とか。 数学レベルの計算は禁止(算数まで)とか。わからなければ星の数になるがな。
学生が宿題の質問とかじゃなくて 講師のほうが質問してんの?
じゃんけんゲームでも作ればいい
>>382 とりあえずゲーム系。
Lineメソッドなどを使って動くスクリーンセーバーはどう? XP標準のにそっくりなの作れるけど。
あ、全画面表示にAPIが必要になっちゃうか…
じゃピクチャかイメージコントロールを複数使った15パズルとかは?
もっと高度でいいなら、ピクチャかフォームに直接描画するテトリスがいいと思う。
テトリスの作り方は検索すればいっぱいあるから困らないでしょ。
他言語だが1時間で作る動画もあるしw
オブジェクト指向とやらで頑張る
>>382 まずお前が講義受けて来い
初心者のお前に講義なんて出来るわけないだろ
VB6なんて、そろばんを必須として授業する商業学校くらい時代遅れだな
VBAがある内は有用じゃねって思ったけど それならVBAやるよな
とりあえず簡単にGUIアプリが作れるし、オブジェクト指向よくわかってなくてもOK的 な所が好きで使ってる人がいるわな。
>>390 今から習うなら正直VB6よりそろばんのほうが役立つと思う
>>382 ともかく相手が誰で何の目的で講義するのかレスしないと話にならん
テキストボックスで64KB以上の文字列を扱いたいです 普通はリッチテキストボックスを使う事になると思うのですが、 仕様という名のクセやバグが多すぎて出来るならば使いたくありません… 他にイケてるコントロールはないでしょうか?
> 今から習うなら正直VB6よりそろばんのほうが役立つと思う いまどきそろばんなんて役にはたたない。 どんなに計算が速くても、そろばんじゃ 何万件ってデータを一瞬で処理できないからね。
>>394 text1.SelTextに代入すれば64KB以上もイケる、ってばっちゃが言ってた
でも16MB放り込んだら操作重すぎでキレそうだった(でも放り込める)
398 :
394 :2010/09/29(水) 00:21:35
>>397 そんな裏技があったとは…w
SelStartやSelLengthとかはおかしくなるようですが、
表示専用なのでこれでいってみます
ありがとうございました。
そんなことするより Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long Private Sub Form_Load() Dim s As String Dim i As Long For i = 1 To 80000 s = s & Right(i & "", 1) Next Call SetWindowText(Text1.hwnd, s) MsgBox Len(Text1.Text) End Sub でいいよ
Right(i & "", 1) ↑これどういう意味? (1文字のテストデータ作ってんだろうけど)
CStr(i Mod 10)がいいと?
s=Replace(String(8000,"a"),"a","1234567890")
s="1234567890" For i=0 to 800 s= s & s Next
>>400 いや、そんなとこはどうでもいいとこだし
400だけど、「この方が速い」とか何かのテクかなと思って いや、特に意味はないならそれでいいんだけど
400だけど、この方が速いとか何かのテクなのかと思って いや、特に意味ないなら、別にそれでいいんだけど
俺は「i&""」が気になってしょうがなかったぜw どうして「i」じゃないのかとw
CStrより速いんだ 言わせんな 恥ずかしい
遅い CStr(i) 速い i & ""
i&"" CStr(i) i 面白そうなので実験したが3つのうち「i&""」が一番遅かった件について…
VBの文字列の連結って内部的にはどう処理されてんのかね 80000回も文字連結繰り返してるけどなんとなく重そうなイメージ
>>410 Format(i)
も考慮してやってください
i & "" と "" & i で速度差あったりして?
414 :
410 :2010/09/30(木) 04:48:57
>>412 ,
>>413 やってみるお (でも410は遅くなって413は変わらないと思うお)
>>411 多分こんな感じ?↓
例:Ret = StrA & StrB
1.StrAとStrBの合計サイズで仮変数を配列拡張(ReDim PreserveとLenB2つ相当)
2.StrAのバイナリを仮変数の先頭にコピー(APIのMoveMemory相当)
3.StrBのバイナリを仮変数の後方にコピー(APIのMoveMemory相当)
4.仮変数のサイズでRetを配列拡張(ReDim PreserveとLenB1つ相当)
5.仮変数のバイナリをRetにコピー(APIのMoveMemory相当)
StrA & StrB & StrCと3つなら上記処理をこう繰り返す→ (StrA & StrB) & StrC
Midステートメントが速い理由は入力先に対して直接処理するからだと思うお(4,5が不要)
415 :
410 :2010/09/30(木) 08:16:25
やってみたお
何度やっても「CStr(i)よりi&""が速い」って証明出来なかったお…恥ずかしいお…
つかCstr(i)の処理時間より1.5倍かかってるお
ちなみにiはCStr(i)とほぼ同等だったお(むしろCStrのが僅かに遅かったお)
>>412 ごめん、1文字を切り出せないお… ("0"指定でも10とか出るお)
>>413 やっぱ変わんないお
■テスト内容:LongをStringへ代入 Loop回数33,000,000
====================================================
10.124sec 式[ Result$ = i & "" ]
10.077sec 式[ Result$ = "" & i ]
06.724sec 式[ Result$ = CStr(i) ]
06.615sec 式[ Result$ = i ]
何も指定せずFormat(i)を・・・CStr(i)と同じように扱ってやってください・・・ Rightで切りだすんでしょ?Str(i)とFormat(i)
最近のスペックのパソコン上でやるなら些細な差だけど 低スペックのオンボロパソコンとかでやるなら重要な差になる のかな?
俺のCPU100MHzメモリ16MBの糞PCの出番か
VB6で作ったシステム使い続けてる企業はパソコン買い換える予算も無いのか?
>>420 パソコンだけならいいんだけどな。
仕様書のこってたらいいんだけどな。
担当が今でも居ればいいんだけどな。
現状動いてるシステムの予算が楽に取れるといいんだけどな。
Xpはいよいよサポートがヤバくなってきてるのに オンボロパソコンが現役の企業が多いって 政府は何やってんだ? ここに大きな需要とかあるだろ この分野で経済対策すりゃあええんでないのか? 企業のオンボロパソコンからの買い替えに助成金とか出せばいいのに エコカーなんかよりもマシだろ
そんなことこのスレで言ってもなあ
古い言語が一掃されるのはありがたい・・・か?
425 :
410 :2010/09/30(木) 13:23:39
>>416 そういう意味だとは思わなかったお…
でもCStrの替わりにFormat? 単にオーバーヘッド増えるだけじゃ?と思ったけど
先入観はいかん!と無心で追試したら予定通りかなり遅くてガッカリしたおw (i&""とドッコイドッコイ)
s=Format(i) 10.957sec (Result="33000000" Len=8)
ちなみに遅いのはあくまでiを文字列として評価させるまでの話で
1文字切り出して連結していく処理全体ではどれもたいして違いはないお
(今回の場合、処理時間のほとんどが長大な文字列の連結部分であって、
Long型からの変換・切り出しにかかるコストなんて所詮はメクソほども無いお)
そもそも俺が知りたいのは「i&""が速い」という点の真相だお。
その話の根拠は一体どこから来てるんだお?
誰か補足して欲しいお
javascriptとかだと 数字を文字列に変えるときにi+""とかやったり 文字列を数字に変えるときにi-0とかやったりしたお
別の言語と勘違いしてるんだろ
cstr(i) ... 7タイプ (内 シフト打ち 2) i&"" ... 4タイプ (内 シフト打ち 3) i&""のほうが速い!
cstr(i)はcstrまで左手だけで打てる。(i)はシフトキー以外は右手だけで打てる i&""はi&まではシフトキー以外は右手で打てる。""はシフトキー以外は左手で打てる cstr(i) i&
タイピング速度の話かよ
論点とずれているが速度重視で書き換えてみた Dim s As String Dim i As Long s = String$(80000, 0) For i = 1 To 80000 Mid(s, i, 1) = ChrW$(48 + (i Mod 10)) Next
高速化ってつまり内部でどんな処理してるか分かってないとできない 内部でどうやってるかはコンパイラ作った奴らにしか分からないから どのやり方がより速いか実験して確かめる 先人たちがすでに実験していて結果を残してくれているのなら ありがたい 余計な手間が省けるというもの ありがとう
何%速くなりましたか?
>>399 の文字列作る処理と
>>432 を
Dim t1!,t2!,t3
t1=Timer
ここに処理
t2=Timer
t3=t2-t1
Debug.Print t3
でやったら
>432の処理 1.953125E-02
>399の処理 3.917969
になったお
ちなみにIntel Celeron(R)M 1.4GHz RAM752MB だお
馬鹿にしか見えないからやめなさい
はーい
439 :
410 :2010/09/30(木) 15:36:30
>>426 ,427 すっきり納得したお。ありがと!
>>428 ,429 i が一番早いお。
>>434 この場合は100倍だお。でも
>>339 式の負荷は2次曲線だお?
負荷はほぼメモリコピーそのものだから内部的な総コピー量に左右されるお(
>>414 )
下のとおり、ループが10倍になっても時間は455倍に跳ね上がるお!
純粋な連結速度ならMidが最速だし、ループ回数と正比例するお
でもJoin関数が俺的オススメ(可読性と汎用性が高く速度はMid式の1/2出るお)
>>
Dim sAry() As String, s As String, i As Long
ReDim Preserve sAry(LoopMax)
For i = 1 To LoopMax
sAry(i) = ChrW(48 + (i Mod 10))
Next
s = Join(sAry, "")
=======================【 TestA1 Loop= 80,000 】==
001.155sec
>>339 式[ アンド演算子とi&"とRight ]
000.016sec
>>432 式[ MidとChrW ]
000.023sec 俺式[ ChrWと配列とJoin ]
=======================【 TestA2 Loop=800,000 】==
455.047sec
>>339 式[ アンド演算子とi&"とRight ]
000.126sec
>>432 式[ MidとChrW ]
000.265sec 俺式[ ChrWと配列とJoin ]
乙 本当、関係ない方向へ大きく脱線したなあ
大きいデータを使ったテストをしたい時くらいにしか使わんだろうな
速度に困る場合になったらCでDLLでも作るわな
443 :
410 :2010/09/30(木) 16:22:25
正直、業務アプリでは無縁だと思うおw そんな俺は趣味グラマー そろそろ名無しに戻るおっお〜♪ ノ
いろいろな条件あるだろうからその言語言語のやり方は知っておいても損は無いとおもうけど まぁ趣味でやってる俺には関係ない
Nullが入っている可能性があるVariantを文字列化する時に & "" を使う Dim s As String s = Null & "" ' ok s = CStr(Null) ' err94
>>446 なるほど、そういう問題もあるか(Variant限定じゃないね)
If文入れるより軽そうだし短いし手軽だね
…コード見てもコメント無きゃ意味わからんだろうけどw
>>445 410ですけどぉ、俺にだけは謝れ
お前さんは全力で騙されてたからなw
「スッゲー痛いけど、面白かったから…いい!」
「スッゲー痛いけど、気持ちよかったから…いい!」
つーか & ""は暗黙の型変換としてVBerには常識だと思ってた。 過去スレにも何度も出てきたしな。 まあ、俺はVB2.0からのユーザーだけど。
昔はIsNull()がめっちゃ遅かったしね
>>451 暗黙といえば$しか思い当たらないや(←そりゃ宣言だろ)
高校の時もうVB5だったよ 昔の事情はわかんないなぁ
そういや初心者講師殿はどうなったんだ?w レスを楽しみに待ってたっていうのに 乗り遅れたがループなしで良くね?と思わず高速コード書いてみた 一瞬で完了。うちでは50ミリ秒くらい s = "S" & String(LoopMax - 2, 46) & "E" …中間文字なしは邪道か?w ちゃんと123...の高速版も作ってみたよ 実はこっちのが速かった(40ミリ秒) s = String$(800000, 0) For i = 1 To 800000 Step 10 Mid(s, i, 10) = "1234567890" Next If 800000 Mod 10 Then Mid(s, i, 800000 Mod 10) = Left("1234567890", 800000 Mod 10) まだ高速化の余地もあるけど面倒だからやめたw 単に"12345678901234567890"にするだけで約2倍速化するとか あとはsを次回のシード文字列に使えば1回につき勝手に2倍速化しデカいほど負荷が下がるとか
爆速でワロタw
大事なのはSetWindowTextなのになんでテストデータ作るとこに こだわってんだよw SetWindowTextはありなのかなしなのか議論しろよw
>>454 有名な最適化だね。
最初に必要なメモリを確保しておけば、内部的におこなわれている
メモリ確保→メモリコピー→メモリ解放の処理が無くなるから
大幅に速くなる。
VB.NETだと、その辺を考慮してやってくれるStringBuilderってクラス
が追加されていたりするんだけどね。
>>456 ヘタレVB6趣味グラマーの俺にはもう元々の質問が何だったのかすら分からなくなっちゃったよ
>>456 いやーそっちのが面白かったからさぁ、ついw
真面目な話、元の質問に対しては完了してるっしょ
そっちのほうはもうこだわりようがないんだよw
64KB以上放りこむ方法としてSelTextやAPIの提示で適切だろ
それともお前さんこの件で聞き出したいことが別にあったのかい?w
あるなら堂々と聞けばいいんじゃね?
(テキストボックスって言ったって所詮実体はEdit"ウインドウ"である以上
APIから文字列放り込む事に問題はないと思う。NT系のEditは2GB対応してるんだし)
いやなんかSetWindowTextでやってみたらできたから さも当然だろって感じで書いてみたら テスト文字列作成の話題ばっかりでこれいいのかなと思ってたんだよ。
たとえばプロシージャ内で Openでファイル開いてる状態で 処理中にプロシージャから脱出したいときって Closeでファイルを閉じてからしたほうがいいの?
ggrks
設計を見直すべき
そりゃとじたほうがいいよ
>>461 乙、回答主だったのかw
そりゃ気になるわな でも大丈夫だと思うよ
テキストボックスのTextプロパティもたしかデータ実体はEdit側のはずだから
あとでセレクト位置もちゃんと取れるか調べてみるわ
>>462 そのプロシージャしかファイルのオープン事実を知らないんなら当たり前だろ
VB6は放置してスコープ抜けたら勝手に閉じてくれるんだっけ?
そこまで親切(お節介)じゃないだろう
どっちにしろ明示的にクローズ処理を書くべき
>>462 一概に言えるわけがないでしょ。
何かファイルを閉じるのをおまじないか何かみたいに考えてないか?
そもそも何のためにファイルを閉じるのか考えればおのずから答えは出るじゃん
ありがとうございました
複数の変数に同じ値を一度に代入することってできる? 他の言語とかで言えば a=b=c=d=100; みたいな感じの
こんな所できいてるヒマがあったらやってみろや おまえの頭につまってるのはハナクソか?
VB6で a=b=c=d=3 やったら dの値と3の比較結果とcの値との比較結果をbの値と比較した結果をaに代入じゃん
右側から処理されてくの?
aに(((B=C)=D)=3)が入るが正解。
>>469 できない。
>>469 Private Sub Hoge(v1, ParamArray v2())
Dim i
For i = 0 To UBound(v2)
v2(i) = v1
Next
End Sub
Dim a, b, c Hoge 123, a, b, c Debug.Print a, b, c ---------- 123 123 123
元は4行だったのに…w
a=3 b=a c=a d=a でいいじゃんよな 意味の無い余計なメソッド作る意味がわからない
経験上、同じ数値を代入するってことは あまり無い。
>>476 Private Sub Hoge(v1, ParamArray v2())
Dim i: For i = 0 To UBound(v2): v2(i) = v1: Next
End Sub
3行になった!
同じ値で複数の変数を初期化するなんて そうめったに出現しないだろ 最初に一回だけとかなんだから プロシージャ作ってまですることじゃないな 面倒でも全部手描きで書け
a=3: b=a: c=a: d=a
配列以外の複数の変数を同じ値に初期化ってよくわかんないなあ どんな設計してんだ?
元は12文字だったのに…w
>>461 Windows95/98/Meだとリッチテキストコントロールにしないと駄目だが
そんな話がしたかったの?
VBのテキストボックスがOSの持ってるテキストボックスかどうかって どうやったらわかるの?
勘
スパイ大作戦
あぁ、スパイ大作戦ってそういう意味だったのかよw
Winsockを使ってチャットプログラムを作っているのですが、 場合によって送信されるメッセージの順序が前後することがあり困っています。 大まかな動作 ホスト、クライアント1、クライアント2 がいて、クライアントはそれぞれホストにTCPで接続しています。 クライアントが発言する場合、それをホストに送り、ホストは全クライアントにそのメッセージを送り、その時点で発言がされたことになります。 ここで、ホストが全クライアントに送るときですが For SendData DoEvents Next このようにDoEventsを入れないと、最後のクライアント以外のメッセージは消えてしまいます なので、上記のようにDoEventsをいれてるのですが クライアント1からDataArrival クライアント1にメッセージ1をSendData DoEvents クライアント2からDataArriaval クライアント1にメッセージ2をSendData DoEvents クライアント2にメッセージ2をSendData DoEvents クライアント2にメッセージ1をSendData DoEvents となってしまい、クライアント1と2で、受け取るメッセージの順序が変わってしまいます。 これを解決するためには、イベントドリブンでメッセージを送らない(どこかのメインループでまとめる)、 受け取り側でソートする(後からメッセージが繰るかどうかは分からない)、 などの方法しかないような気がしますが、こういう場合一般的にはどうしているんでしょうか? 余計なイベントを起こさずにメッセージ送信をできればいいのですが…。
>>491 >このようにDoEventsを入れないと、最後のクライアント以外のメッセージは消えてしまいます
そんな事はない。
貴方のプログラムがバグって居るだけ。
>>492 DoEventsを入れずに多数の接続先に大量のデータを送ると
バッファがあふれて一部データが送信されない
このときTCPでもエラーは特に起きないので
原因不明の中間データ消失が発生しているような状態になる
送信データを独自のキューで管理してDoEventsセーフな設計にするか
余裕があるならバグの多いmswinsck.ocxは捨ててAPIを直接操作したほうがいい
あんまり詳しくはないけどSendCompleteってイベントがあるじゃない その辺をちゃんとしてないからバッファがあふれるんじゃない?
DoEventsするなり標準のメッセージループに制御を戻すなりしないとSendCompleteイベント自体起きないだろ SendCompleteとバッファの限界は別問題だし
まあなんにしてもDoEventsを入れないように作るのがよい。
OCX側のバッファリングの仕様にエラーが発生しないという問題があるのであって winsock側のバッファに空きがない場合はちゃんとエラーが発生するし ネットワークは直接関係ない
499 :
491 :2010/10/06(水) 20:31:25
多くの回答ありがとうございます。 VBのWnsockコントロールを使うと避けられないんですね・・・。 提案していただいた、WinsockAPIを調べてみることにします。 #パケットに番号をつけて、受信時に連続したパケットが来なかったらDo〜Loopで待つ、 #というのも思いつきましたが、スタックがあふれそうなので怖くてやめました
Imprements ListBox としてListBoxなど標準コントロールのインターフェイスを 継承する独自クラスは作成可能でしょうか?
>>500 出来ないわけないだろ、試してみ…
たら、なんか妙なコンパイルエラー出るなw
非公式の公開関数名にアンダーバーを含んでるのかもしれん。
それがどれだかは分からんけど、もしそうならアウトっぽい。
>>499 なんで対症療法ばかり考えるかね
オーバーフローしないように、フロー制御すればいいだろ。
一行分のメッセージを送ったら、ack応答が帰ってくるまで待つとかさ。
>>502 まあ、ほっときましょう。
このタイプは体で覚えるしかない。
UserControlにListBox含めて作ればいんじゃないの?知らんけど
>>500 VBにそんなインターフェイス最初からない。
クラスは派生できない。
だからポリフォーリズムもどきがしたいのなら、レイトバインディングを
上手く使うしかないんじゃない?
506 :
デフォルトの名無しさん :2010/10/08(金) 21:38:29
>>505 >ポリフォーリズム
さすがVB6プログラマw
すまん寝不足なんで素で間違えたw
508 :
500 :2010/10/09(土) 01:00:06
>>501 そうなんですよ、アンダースコアがあるからダメって怒られるんです…
>>505 え、そうなんですか?(;−;)
用語に疎いため仰ってる言葉(や笑い所)はわからないのですが、
もう少しご説明頂けませんか?
引数をAs Listboxなどとして特定の標準コントロールを受け取る関数があり、
そこへ引き渡せるラッパークラスを作りたかったのですが、それは無理って事ですか?
(相手側をAs ObjectやAs Variant宣言に変えなければ不可能ですか?)
ラッパークラスって何?ってレベルの素人な私 独自メソッドつけたいとかなの? リストボックスへの参照を含むクラスじゃダメなの?
>>509 そうです。例えばAPIで制御する独自のメソッドやプロパティを追加したり、という事です。
ここでラッパーというのは単なる概念で話してます。(元の機能を包み込むクラスという意味です)
参照を含むだけのクラスはListBoxではないため相手にListBoxとして渡す事ができませんが、
Imprements出来ればListBoxとしても渡すことが可能になる、はずだったのですが。
既にリストボックスを対象として作られている補助関数へそのまま渡せるように
コーディングできないかな?と思っていました。
リストボックス対象に作られてるんなら別にラッパークラス渡さなくてもいいんじゃないのか?
ん?Implements使うんなら ListBoxのメソッドは自分でコーディングしなきゃならなくならないか? あれってインターフェースのやつだろ?
Implementsは Javaでいうところのスーパークラスじゃなくてインターフェースの使い方だから ListBoxのAddだとかClearとか中身空っぽってことになるんじゃ?
素人は黙ってろ・・・
515 :
500 :2010/10/09(土) 02:05:47
>>511 渡さなくてもいいんですが、まぁいろいろ試行錯誤中なのです
Target() As ListBoxといった配列変数にも入れられますし
通常のListBoxと一緒に処理できると便利な場面がいくつかあったもので
>>512 その部分は結局は内部的にListBoxオブジェクトを持って対処するんですけどね
関数コールのオーバーヘッドは…ひとまず我慢という事で…w
516 :
500 :2010/10/09(土) 02:11:34
>>513 Javaはわかりませんが、そんな感じです
ですから内部変数に対象ListBoxの参照を持って対処します
そういう事もあって「ラッパークラス」と表現しました
というか、Implementsに関する話以外は論点ではなくて、
どなたか
>>505 さんの言っている意味を話して頂けませんか…
ListBoxへの参照持つクラスつくりゃいいじゃん ListBox対象とした関数の引数はその作ったクラスやObjectに書き換えるとかして その独自クラスにListBoxと同じ名前の関数やプロパティ作れば形的にはラッパーになるんじゃねえの? よく知らんけど
>>508 だから、自作のUserControlをListBoxとして扱うことは恐らく無理だろうから、
IListBoxみたいな適当なインターフェイスを作ってメソッドの引数の型をIListBoxにするか、
またはメソッドの引数をObject型にしてレイトバインディングでやるかでしょ。
前者の場合、ListBoxについてはIListBoxとして扱うためのラッパークラスを用意し、
UserControlについてはIListBoxを実装する必要がある。
で、例えばListBoxをIListBoxを実装したラッパークラスに変換するメソッドを用意して、
みたいな風にするのかな。
'Class1.class Private WithEvents ListBox1 As ListBox Public Sub SetListBox(List1 As ListBox): Set ListBox1 = List1: End Sub Public Function GetListBox() As ListBox: Set GetListBox = ListBox1: End Function Pulbic Sub Add(Item): ListBox1.Add Item: End Sub ...以下ListBox同名関数定義 'Module1.bas Sub Hoge(List1 As ListBox) → Sub Hoge(List1 As Class1) ...引数名変更
アホだ
UserContorolの名前をMyListBoxとかにしてListBox1個貼り付けて プロシージャやプロパティやイベントをListBoxと同じ名前の全部用意してやるってのはダメなの?
素人は黙ってろ 質問者を混乱させるだろ
おまえらって素人のレスとそうでないレスの区別つくの?
525 :
500 :2010/10/09(土) 03:24:55
>>518 やはり無理なんですかね… であれば理由が知りたいなぁ
もしかしたら何か突破口に繋がるかもしれませんし
>>519 補足ありがとうございます
Implementsを書いただけではだめで、すべてのメソッドやプロパティを同じ形で宣言し、
さらに実際に実装しなきゃいけないという事はわかっています
(通常の自作クラスとそれのImplementsなら一通り理解しているつもりです)
今日、ListBoxのすべてのプロパティとメソッドの型を調べて実装してみましたが、
結局コンパイルエラーが出てしまった次第です
(エラー時案内された説明は理解しにくく、エラー内容と解説が食い違っているのでは?と思えます)
私のコードにミスがあるせいなら頑張ればいいだけですが、もしかして
Implementsの後に来るキーワードにListBoxが使えないって事であれば、ガッカリだなーと
その場合は理由も知りたいなと思い質問しました
>>520 えーっと、クラスはそのようにコーディングしてそれにを付加する形になっています
その例で言うと「Module1.bas側にある関数の宣言型変更を行わずに対処出来ること」、
VB6のImplementsにとって、それこそが唯一のメリットと考えているのですが…
>>522 Implementsを使うのはタブーか何かなんですか?
>>524 …あなたは区別付いてますか?
わけわかんない回答してんのが素人だろ
'IListBox Sub AddItem(Item$, Optional Index) End Sub 'MyListBox.ctl Implements IListBox Sub IListBox_AddItem(Item, Optional Index) List1.AddItem Item, Index End Sub 'Form1.frm Sub Command1_Click() Dim i As IListBox Set i = MyListBox1 i.AddItem Item End Sub
Implementsはクラスモジュール以外にも設置できたんだっけ?
MSDN嫁
'MyListBox.ctl Event Click() Public Sub AddItem(Item As String, Optional Index) List1.AddItem Item, Index End Sub Private Sub List1_Click() RaiseEvent Click End Sub Private Sub UserControl_Resize() List1.Width = ScaleWidth List1.Height = ScaleHeight End Sub
アホ
532 :
500 :2010/10/09(土) 06:59:08
>>529 改めてMSDN読んでみました (MSDNライブラリ、2000年10月リリース分)
> 構文 Implements [InterfaceName | Class]
>
> 必ず指定する引数 InterfaceName または Class には、タイプ ライブラリ内のインターフェイス
> またはクラスの名前を指定します。このインターフェイスまたはクラスのメソッドは、
> Visual Basic クラスの対応するメソッドにインプリメントされます。
これを読む限りクラスモジュールでなくともImplementsに指定できるようです
またListBoxはタイプライブラリ内に普通にありますし、指定すること自体は可能と読めます
…ただ、以下の記述もあり…
> メモ Visual Basic では、派生クラスまたは派生インターフェイスをインプリメントできません。
…もしかしたら、実はここが問題になるのかもしれません
すべての標準コントロールはControlクラスから派生しているはずで…
内部も1カウントと数えられちゃうなら、ここでアウト…という事なのでしょうか?
533 :
デフォルトの名無しさん :2010/10/09(土) 11:17:44
質問です。 VBで作成したDLLに値をクラスで渡したいのですが、うまくいきません。 Dim Output As clsTEST Set Output = New clsTEST Output.ADD1 = "A" Output.ADD2 = "B" Set obj = CreateObject("test.Class1") Call obj.DLL_test(Output)←ここ ■DLL側 任意のForm上部の宣言 Public Function DLL_test (Output As clsTEST) ■clsTEST クラスモジュール「clsTEST」を作成し、 プロパティ「ADD1」,「ADD2」を作成しました。 DLLとメイン(呼び元)のプロジェクトに追加。 Outputに値を入れずに渡した場合は問題ないのですが、 値を入れた場合、型が異なるのでエラーがでてしまいます。 うまくクラスを使ってDLLに値を渡せる方法はありませんでしょうか?
DLLと呼び出しもと、両方にクラスモジュールを追加しちゃ駄目。
>>534 呼び元のみにクラスモジュールを追加して、
DLL側の型指定をobject型等に変更する認識でしょうか?
outputって予約語じゃね
色んなケースがあるんだけど、そのDLLでしか使わないクラスなら、 DLL側にクラスモジュールを置く。 で、呼び出し元はDLLを参照設定して、そのクラスを使う、って感じ。
>>537 Set obj = CreateObject("test.clsTEST ")
obj.ADD1 = "A"
obj.ADD2 = "B"
Set objInset = CreateObject("test.Class1")
Call objInset.DLL_test(obj)
■DLL側
Public Function DLL_test (Output As Object)
に変更してみました。
開発環境がないので確認していませんが。。。
>>532 >Implements ステートメント
>
>
>クラス モジュール内にインプリメントされるインターフェイスまたはクラスを指定します。
>
>構文
>
>Implements [InterfaceName | Class]
>
>必ず指定する引数 InterfaceName または Class には、タイプ ライブラリ内のインターフェイスまたはクラスの名前を指定します。このインターフェイスまたはクラス>のメソッドは、Visual Basic クラスの対応するメソッドにインプリメントされます。
なにがしたいの?
>>533 実際問題Implementsには標準コントロールは渡せないらしいって
誰かから昔聞いた事がある。だから出来ないって思い込んでる。
俺自身そういうコーディングした経験ないから真実は知らないが、
とにかく出来ないんじゃないか?とは思ってる。
説明は出来ない、すまん。
>>538 DLL側と呼び出し元、両方に同じ名前のクラスが宣言してあったとしても、
それは単に名前が被ってるものと解釈され同一とはならない。
DLL側で定義し外部に提供しているクラスを呼び出し元で使いたいなら、
呼び出し元はそのDLL名.クラス名でオブジェクト変数を作らないと。
同じ名前のグローバル変数とローカル変数があった場合ローカル変数が優先されますが、 この場合でもグローバル変数にアクセスする方法はありますか? 例えば以下のhoge関数内でグロバール変数iに値を入れることは出来ますか? Dim i as Long Sub hoge(i as Long) i = 1 Debug.Print i End Function
おそまつ君のイヤミの一人称で出来なかったっけ
>>542 それだと、グローバル変数が引数に渡され
引数に値がセットされ、VB6のデフォは参照渡しなので
グローバル変数に値がセットされる
ローカル変数でてこないじゃんw
Me.iでいいんじゃね
542です
>>543 ,
>>546 あ、もしかして…標準モジュールでもMeって使えるんですか!?
オブジェクト内(クラスやフォーム)でしか使えないものと思い込んでいましたw
今試せないのですがいけそうですね、ありがとうございました!
>>544 関数呼び出しのコードは書いておりませんので
名前が同じでも参照しているとは限りません
例の関数内ではローカル変数しか操作していません
標準モジュールでも名前ついてるよなたしか module1.i とかでもいけるような
542です
>>543 ,
>>546 あ、もしかして…標準モジュールでもMeって使えるんですか!?
オブジェクト内(クラスやフォーム)でしか使えないものと思い込んでいましたw
今試せないのですがいけそうですね、ありがとうございました!
>>544 関数呼び出しのコードは書いておりませんので
名前が同じでも参照しているとは限りません
例の関数内ではローカル変数しか操作していません
550 :
542 :2010/10/10(日) 22:15:08
↑リロードで発言してしまいました、すいません
>>548 > 標準モジュールでも名前ついてるよな
そうだったんですね、勉強になりました
ということは内部的にはクラスモジュールと同等(というかフォーム相当)の動作をしているんですか
ほえー、なるほどなるほど…
大阪地検のFD書き換え事件って、笑っちゃうよね。 件(くだん)の検事も上司も、パソコンのことをなんにも知らないんだからね。 ミスであんな書き換えが起こることなんて100%あり得ないのにね。
>件(くだん) 使い慣れないなら使うなよ。 恥ずかしい奴
どっちかというと
>>552 の方が恥ずかしいような気がするぞ俺はw
まあこの手のタイプは得てして「病識」がないからなあ....
>>552 検事(けんじ)を擁護(ようご)するとは・・・
オマイも検事(けんじ)の仲間(なかま)なのか? プッ。
擁護してるように見えるとは…
556 :
デフォルトの名無しさん :2010/10/16(土) 00:39:53
金さえあれば VB6なんて使わなくて済むのに・・・ 全ては俺のパソコンのスペックの低さにある・・・ VB6でさえ・・・PEはインストール要件にあわずLEを買ったのに・・・ くそお・・・・くそお・・・・
5万もあれば十分な環境が作れるでしょう?
マジレスとかww
最近いいネタが切れてるか。 なんか興味深い仕様とか誰かないのん?
>>559 骨董屋で新製品が入ったか聞くジョークみたいだな
そういえばWin7でのIDEの動作って、実際問題どうなの? 試しに7の64bitに入れてみたら基本的に問題なく動いてるみたいなんだが… (フォームの作成画面が恐ろしく重いって問題があったけど、操作できないわけじゃない)
プリン食いながら「そういやプリンの味ってどうなの?」ってか。 自分で判断すりゃいいのに。
もう答え書いてんじゃん
開発環境のサポートはXPまでで、作ったEXEはVistaまでだっけ? MSがしぶしぶ延長はしてた気がしたが
>>564 作ったexeはWindows 7でもサポートされる。
開発環境のサポートはWin7の32bitまでだ(今のところ) 7の64bitでは開発はダメ(サポートしない)という事になっている
あぁ、そうだったな、特殊サポート以外は終わってる。訂正。 MSは開発環境がWin7/32bitでも動くと言ってるが、 同時にWin7/64bitでは動くかどうか知らない(チェックしない)と言ってる。 というか過去にわたってIDEは32bitでしか保証してない。
VBSってここでいいんだっけ? つか「全行程が終了した後スタンバイ」って具体的にどうしたいの。 さっぱりわからんわ。
そう思って俺も1を見たらそこに答え書いてあった
あぁ、もしかしてスタンバイって「PCをスリープモードに移行」したいってこと?
574 :
570 :2010/10/19(火) 00:59:08
勘違いしてましたすいません。
>>573 様の言う通りスリープモードでした。XPの癖で・・・
色々見よう見まねで
>>570 のtaskenc.vbsのメイン処理の最後に以下の部分を加筆してみたのですが、スリープモードになりません
「エンコード終了後にスリープモードに移行、ただし他に録画している場合(Rectestが起動している)は移行しない」というのを加えたいのです。
Const program_name = "RecTest.exe"
if processCheck(program_name) = False Then
Set wShell=CreateObject("WScript.Shell")
wShell.SendKeys "^+{esc}"
Set WshShell = CreateObject("WScript.Shell")
Set Shell = CreateObject("Shell.Application")
Shell.ShutdownWindows()
WScript.Sleep 500
WshShell.AppActivate "Windows のシャットダウン"
WScript.Sleep 500
WshShell.SendKeys "{UP}{UP}{ENTER}{ENTER}"
End if
Function processCheck( pName )
processCheck = False
Dim objPWMI
On Error Resume Next
Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2")
Err.Clear
On Error GoTo 0
If Err.Number <> 0 Then Exit Function
Dim colProc
Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'")
If colProc.Count > 0 Then processCheck = True
End Function
スリープもスタンバイもどっちもどっちだと思うが..... どっちにしろ正式な用語じゃないだろ
このへんの単語は混乱してるからなぁ (スタンバイ、スリープ、サスペンド、ハイバネーション、休止状態、C1〜C2、E0〜E5・・・etc) それはともかく、ShutdownWindowsを使ってしかもキーで操作しようってのは不適切だろ コマンドラインで制御してもいいなら Shell.Run "%systemroot%\system32\rundll32.exe powrprof.dll,SetSuspendState", 6,true とか
>>576 それ間違えてね?
RunDll32ではSetSupendStateをうまく呼び出せない
このAPIを呼べたとしても、引数が渡せないので自動復帰不能になっちゃうよ
RunDll32は特定の形式に乗っ取っている関数にしか引数を正しく渡せない
しかも外部から任意に引き渡せるのは文字列(LPSTR)のみで、何番目に引き渡すか指定も出来ない
さらに第1引数にはRunDll32のプロセスハンドルが勝手に引き渡されたりと、
RunDll32に対応していない関数を呼び出すのは十分検証しないとかなり危険じゃないかと
578 :
デフォルトの名無しさん :2010/10/25(月) 19:53:27
VB6からDLL使うとき 使えるDLLってネットでダウンロードしてきたDLLも使えるの?
使える
どんなDLLでも使えるよ
DLL および Windows API へのアクセス の項を見なさい
582 :
デフォルトの名無しさん :2010/10/25(月) 22:26:13
STX D123456789 ETX 全てのフィールドはASCIIコードで表現 とあるのですが、 ボタンクリック時 Dim send_data As String send_data = TextBox2.Text send_data = Chr(&H2) & send_data & Chr(&H3) SerialPort1.WriteLine(send_data) これで反応してくれません。 TextBox2.Text は D123456789 と初めから値を入力しています。 send_dataの正しい結合方法はどうすればいいのでしょうか? ポートは開いている状態で、クリック時、仮想ポート&teratermではTextBox2.Textの文字がそのまま出ます。
そのDLLの外部公開名とその定義さえ分かれば基本的に使えます 例えば有名なzlib.dllなんかも普通におk、のはず 実行ファイルの隣に置いておけばそれを呼び出せます ただしVB6向けの解説なんてまずないでしょうから、当然多言語(主にC言語系)の読解力が必須になってきます また引数や戻り値の型にはVB6でそう簡単に扱えない構造を求められる場合があり これを正面から突破するにはかなりトリッキーだったりディープな知識を要するコーディングが必要です 普通に考えて、そういうタイプのDLLはCやらC++を間に挟みそっちで(VB6の外で)処理するほうが手っ取り早いんで 結果的にVB6だけで何が何でも対処するぜ!的なノウハウはネット上でもあまり見かけないという罠も待ってます
584 :
578 :2010/10/26(火) 10:00:29
みんなさんありがとうございました とにかくさっそく試してみます
585 :
デフォルトの名無しさん :2010/10/27(水) 01:28:12
当方LEなのでWinsockコントロールは使えないから何とも
質問です。 Open "filename" For Append as #1 とやって、追記モードで開くファイルと、開いた後の追記には、何か制限があるでしょうか? ググると、かなり巨大なファイル(10MBとか)を操作しているような記事もあるので、制限は無いのかもしれませんが とりあえず無限とも有限とも見つからないので…
ああ、しまった。
>>586 は VB6 でお願いします。
とりあえず、2Gとか4Gとかに壁がありそう。
>>588 ギガッ
…すると、ファイルシステム的な上限ってことかな?
やってみればええやん。
FileLenはLong型だから2G以上のファイルのサイズ参照できなくね?
たしか2GBが上限。ファイルシステムというかその前にVB6の制限。 Long型で定義してあるからそれ以上を渡せないって寸法。 (VB6が内部的に使っているAPIは4GBまでいけるヤツのはずだけど、VB6は符号なし4バイト整数型ってのがない) FSOも同じ理由で2GBの制限付いてたと思う。 今時のWindows(とりあえずNT系)ならそれ以上も読み書きできるAPIを普通に持ってる。 10GBとか100GBの読み書きしたい場合はこのAPIだね。名前は忘れたw
>>591-592 なるほど…ありがとー
念のため警告でも付ける〜。
いやとりあえず、いつまで動かすか(というかいつ止めるか)判らないデータロガーみたいなものを作るハメになってですね。
データ自体はそんなに無い…ハズだけど1年ぶっ通しとかで使われるとどーかなーとかいうのが多少心配で…っていう。
594 :
デフォルトの名無しさん :2010/10/28(木) 00:55:31
Win32APIを使ってファイル操作すればいいんじゃないの?
595 :
デフォルトの名無しさん :2010/10/28(木) 01:00:45
GetFileSizeってAPIは4GB以上のファイルサイズ参照できるってあるし API使って操作すればいいんじゃね?
4GB以上のときはファイルサイズもポインタも2分割して渡すけどな
符号なし32ビット整数が扱えないんだから 無理だろ
>>597 API間でそのまま扱えばいいだけだろ
1つとして扱いたければ8バイトのCurrency型にMoveCopyして1万分の一して扱えばいい
(多少扱える最大値が減るが、1000TB以上扱えるから問題にならないだろ)
600 :
598 :2010/10/28(木) 23:39:26
間違えてた × 1万分の一して扱えばいい ○ 1万倍して扱えばいい ※Currency型の中身は符号付き8バイト(64bit)整数型と同等。(評価時に逐次1万分の1して扱ってるだけ) ちなみに無理と言ってしまうのは、 4バイト整数型の符号付きと符号なしの違いを理解してないからだな。 分かってない人に無理とか言われても困る。 分かってるなら、符号付き整数型に符号なし整数値を入れた場合にどう評価されるか考えれ。おのずと答えは出る。
Dim n&, p&, k, g& n = HogeAPI() k = n < 0& p = n And &H80000000& g = p If k Then g = g Or &H80000000& End If
なんという意味のないコードだ
× &H80000000& ○ &H7FFFFFFF&
ネットワークエントリーの情報を取得したり、 そこから自動でVPNやダイアルアップ接続できる 「RASAPI32.DLL」を使用したAPI(VBRAS32)なんだけど、 WINDOWS7では動かないみたいなのですが、 なにか対処法はご存知ないでしょうか?
誰もレスしないようなので… ダイアルアップは扱ったことないから詳しくは知らないんだけど、 昔から「Rasapi32.dllがない場合」という問題があるらしいので 特別Win7に限定した問題ではない、のかもしれない。
606 :
デフォルトの名無しさん :2010/10/30(土) 18:48:11
すみません、ちょっとお聞きしたいのですが、 visual basic 2010 で5.0 のファイルを扱う事はできないのでしょうか。 拡張子が .vbp(5.0?) .vbproj (2010) と違うようで、拡張子を変えて 2010 で開くと 『ルートレベルのデータだ無効です』と出ます。 また、もし(5.0 のファイルを) 利用したい場合、VB5.0 を購入する事になりますか?
.vbpを開ければ、アップグレードウィザードが動くんじゃね? 基本的には役に立たないけど。
608 :
606 :2010/10/30(土) 19:16:47
レスありがとうございました。 .vbp は開けないようです。visual studio をダウンロードして試してみようと思います。m(__)m
2010だとさすがに開けなくなったか・・・。 2008くらいまでは開けたと思うよ。
ありがとうございます。 う〜ん、探してみたんですが、過去のバージョンが ダウンロードできなくなっているみたいです。ちょっとダメみたいですね。
>>610 意図的に見つけにくいよう隠してあるけど、たしかまだDL出来るはずだよ
2005 のセットアップファイルがあるにはあったんですが、インストールしようとすると 途中でダウンロードエラーになるので、諦めるか別の方法を考えようと思います。
それじゃなく、ディスクのisoファイルを丸ごと配布してるほう。
ググっても分からなかったので教えてください。 エクスクラメーションマークを使うと、規定のプロシージャにアクセスできるようですが、 言語仕様としてはどのように定義されているのでしょうか? 同じようなことを他の言語でも実現可能なのでしょうか? object!AAA = "bbb" property let Test(a, b) '← aに"AAA"が、bに"bbb"が入る
615 :
デフォルトの名無しさん :2010/10/31(日) 21:21:54
age
規定? ! は、単なるオブジェクト参照だよ。 . と一緒。
618 :
デフォルトの名無しさん :2010/11/01(月) 07:27:07
>>616 レスありがとうございます。
エクスクラメーションマークに参照以外の意味はないということでしょうか。
う〜ん、もう少し自分で考えてみます。
エクスクラメーションマークはもともと、Accessなんかで Form!テキストボックス なんかをさすときに使われた記号だよ。 VB5とかVB6とかではフォーム=クラスになったので、ピリオドのアクセスと同じ意味になった。 昔はフォーム=クラスではなかったから特別なアクセス記号が必要だった。
辞書(Dictionary)構造をもつところで使用できる。 VB6では主にDAOのレコードメンバ記述用に使用される。 意味的にはds!ABCはds("ABC")と同じ。 Formで使えるのはForm自身がメンバを自身の辞書で管理しているから。 propertyで機能するのは辞書構造を表現することが出来るからだが、 ユーザーが通常使う機能ではない。
>>619 全然違う。AccessとVB、どっちが古いか知らんのか?
MSDNに記載のAPIをVBに翻訳する場合の 参考サイトありますか? 型宣言や記述方法やtipsなど
MSDN(VS6.0)の「C 言語の宣言の Visual Basic への変換」って項目の情報だけじゃ足りないってこと?
voidおおおおおおおおおおおおおおおおおおおおおおおお
”C 言語の宣言の Visual Basic への変換”でググればそこそこ出るやんけ
>>622 以前同じような事を調べたが、VB6プログラマー向けに1から10までまとめたそーゆー都合のいいサイトはなかった。
あとで気付いたが最終的に最も情報が詰まってたのはVB6のローカルヘルプ内だった。
「DLL および Windows API へのアクセス」(Web上の現MSDNライブラリ内にはない)
具体的に気になる点が出たらここで聞いてみれば?
実例あげれば誰かが採点したりTips教えてくれるんじゃないかな。
とりあえず、実のところDeclareは結構重要な処理(暗黙の型変換やポインタ処理)をサラリとやってたりする。その挙動の詳細を正確に押える事。
あと宣言の記述方法は使用方法によって1種類とも限らないんで注意。
個人的によくMoveMemoryの引数を用途別に書き換えて使ってるよ。
異型同士の連続型変換(Byte配列中の中間2バイトをLong型に変換するなど)を高速に行う場合とか。
(数値ならByVal Long、文字列ならByval String、ポインタならByVal LongにしてVarPtrを渡す、バイト配列の途中に流し込むならByRef Anyにしといて流し込みたい位置の配列の要素を渡す、などなど)
>>623 すげー便利だな。当時このサイトを見つけたかったわ。
627 :
デフォルトの名無しさん :2010/11/02(火) 20:04:01
>>619 >>620 Dictionaryで使える機能だったんですね。
モジュール内での受け渡しに使えば、ロジックを簡潔に書けるのでは?と期待して調べていました。
Privateなユーザー定義型は同じモジュール内でも使えないですし、そもそもPrivateなクラスは定義できませんし。
JavaScriptのプロパティに近いイメージでした。
いろいろありがとう 自分で調べて備忘録作るしかないかのう
たぶん絶版だと思うけど、「VBユーザーに送る Win32 APIなんとか」って本があって、 すごい内容が良かった。
図書館で借りるとか 国会図書館でコピーしてもらうとか
>>628 質問主なら名前欄にアンカー入れないとわかんないよ。(このスレはID表示されないから)
>>629 ググってみたら見つかった、名前を覚えていてくれてありがとう。
Visual Basicユーザーに贈るWin32 APIの使い方 基礎編/実践編
「… Cとの違いと注意点、メモリ管理など…」これは面白そうだな、買おうかしら。
だがVB5向けとはかーなり古い本だなw
昔の話ではあるんだけど、APIビューアを使うくらいしかできなかった俺が、 その本を読んでヘッダからDeclare宣言を書き下ろしたりできるようになった。 機会があったら読んでみるといいよ。
今からVB覚えてどうするのマジで。
そういうツッコミはノーサンキュー。
突っ込みっていうか、端的に時間の無駄だと思うけど。 同じ努力ならC#なりVB.NETなりに対して払った方がずっと潰しが利く。 もちろん誰が何しようと勝手だけども。
そうせざるを得ない状況がある、ってくらい、想像できないの? 幸せだねぇ。
何だよその痛々しい反応。 語るに落ちてるな。
ほんと、痛々しい。
どうすんのと言われても、俺の場合はVB6が趣味だからなぁ。 あと誰が何しようと勝手とか最後に逃げの言葉吐くならはじめから黙ってろ。
べつにVB6しかできないわけじゃないしな・・・ どうもしないよ
VB「すらも」できないかわいそうな子なんだろう・・・
642 :
デフォルトの名無しさん :2010/11/03(水) 01:13:02
今から古いVB覚える 就職したIT企業が未だに古いVB使った企業と取引してるとか もしくは 低スペックパソコンで古いOS使ってる趣味人とかだろ
趣味人の場合はそうじゃないな、むしろ逆 高スペックで動かすとVB6は十分高速に動き、必要以上のポテンシャルを持ってる おかげで特に新しい言語覚える理由がなくなったんだ 思い通りのソフト作るにはそれに必要なVB6の知識を広げるだけでいいんだから 彼らはVB6を使わざるを得ないのではなくて、 たまたま選んだ言語がVB6だっただけ VB6で十分実現可能な環境が延々と続いているから新しい言語が不要なんだ 趣味人にとってVB6のサポートが切れる云々は正直あまり大きな問題ではない 深刻なのはVB6のランタイムあるいはIDEが最新OSで動作しなくなった時からだ 新しい言語に移行するとしたらみんなそのタイミング(企業のほうもそうかもしれない) 64bit版Win7でVB6のIDEは非サポートとなったが、IDEは基本的に動作してしまっている これはMSの戦略ミスだと思う VB6.exeは起動すら出来ない状態に追い込むべきだった
>>635 つーかなんでお前はこのスレにいるんだ。端的に時間の無駄なんじゃないか?
同じ2chにレスするならC#なりVB.NETなりのスレ見た方がずっと潰しが利くはずだろ?
あぁ、もちろん誰が何しようと勝手なわけか
わんくまの人がブログで「VB6を相対的に評価する人は実はVB6を使いこなせてない人である」 という逆説を紹介してたけど、本当あの記事は正しいな。
つまらない話で盛り上がってるな 俺はVB6を肯定も否定もしないし「古い言語にしがみついてるヤツ」と見下されても構わないが、 どうせ話すなら新しい言語に移行する動機・メリットを説いて欲しい 同じ事が実現できるのなら、別に言語がなんであろうと構わないのだから
> 新しい言語に移行する動機・メリット スレ違い
「数学者と物理学者の言い争い」に見えるな せめて畑の違う数学者同士か、物理学者同士で話してくれよ、不毛すぎるから
>>647 それを俺に言うなよw
わざわざここに批判書いて行くなら、ついでに建設的誘導をして欲しいだけ
まぁ出来ると思ってないけど
時代からして仕方がないが、UNICODEをまともにサポートしてないからもうダサい
内部でUnicode使ってる、ってのがさらに悲しいね。
Short配列で何の問題もなくUnicodeを扱うことができるのでC/C++と状況は大差ない これで動的コード生成無しに単体で__cdecl呼び出しさえ出来れば完璧だったのだが
Windows7で「wininet.dll」の「InternetDial」API関数を使用し ダイヤルアップ接続のダイアログを出すと 「接続先」にVPN接続のエントリーだけが表示されません。 VistaやXPではこの様な症状はなかったのですが何が原因でしょうか? 以下はフォームのコードです==================== Option Explicit Private Const INTERNET_DIAL_FORCE_PROMPT = &H2000 Private Const INTERNET_DIAL_SHOW_OFFLINE = &H4000 Private Const INTERNET_DIAL_UNATTENDED = &H8000 Private Declare Function InternetDial Lib "WININET.dll" _ (ByVal hwndParent As Long, ByVal lpszConnectoid As String, _ ByVal dwFlags As Long, lpdwConnection As Long, _ ByVal dwReserved As Long) As Long Private Sub Button1_Click() Dim Result As Long Dim mlConnection As Long Result = InternetDial(Me.Hwnd, "VPN接続", INTERNET_DIAL_FORCE_PROMPT, mlConnection, 0) End Sub
654 :
デフォルトの名無しさん :2010/11/04(木) 18:59:05
lpszConnectoidの文字列が変わったんじゃね?
655 :
デフォルトの名無しさん :2010/11/08(月) 10:50:44
VB.NETで、WMIを使いディスプレイが省電力モードに移行をしたかを知るために Win32_DesktopMonitorのAvailabilityを監視するソフトを作成してみました。 しかし、省電力モードに移行しても、ステータスは、3のままで、モードの移行を 拾えません。 Win32_VideoControllerでやってみても同様でした。 何かよい方法はないのでしょうか??
MonitorFromPointやEnumDisplayMonitorsでHMONITORを取得してGetDevicePowerState
657 :
デフォルトの名無しさん :2010/11/08(月) 17:03:44
> 654 <System.Runtime.InteropServices.DllImport("user32.dll")> Shared Function MonitorFromPoint(ByVal x As Integer, ByVal y As Integer, ByVal dwFlags As Integer) As IntPtr End Function <System.Runtime.InteropServices.DllImport("kernel32.dll")> Shared Function GetDevicePowerState(ByVal hDevice As IntPtr, ByVal pfOn As Integer) As Integer End Function Public Shared Sub PowerState() Dim hWnd As IntPtr Dim Ret As Integer Dim Pw As Integer hWnd = MonitorFromPoint(&H0, &H0, &H2) Ret = GetDevicePowerState(hWnd, Pw) MsgBox(Pw) End Sub こんな感じにやりましたが、ダメでした。 そもそも、ハンドルが取得できない。 どうしたものか??
659 :
デフォルトの名無しさん :2010/11/08(月) 17:51:48
>>658 あーーー。
VB6まででした。
スレチ ゴメン。
消えます。
vbsで読み取りパスが掛かったExcelファイルを開いてパスワードダイアログにフォーカスして SendKeysでパスワードを自動入力したいんですがパスワードダイアログがプロセスIDでもウィンドウ名でも取得出来ずに困っています 何か手はありますか? Excelは2003です
661 :
660 :2010/11/09(火) 22:17:18
OSはWindowsXPです
APIならとれるよ。つか、普通にパスワード指定して開くんじゃダメなの?
663 :
660 :2010/11/09(火) 22:31:21
>>662 即レストン
パスワード指定して開けるのは知っているんですが
実際にやりたい事は下記通りで、その前段階でつまってるとこです
やりたい事
読み取りパスが掛かっていないExcelと同値パスの掛かったExcelファイルが複数ある
ExcelのアドインによりExcel起動時にAuto_Openイベントでvbsが実行される
vbsでの処理で開かれたExcelの読み取りパスを自動入力
パスが掛かっていない場合はSleepとカウンターで適当にvbs処理を終わらせる
できるならば複数Excelが開かれる場合にも複数同様に処理をしたい
で、そもそもでvbsからパスの掛かったExcelを開くとパスワードダイアログ入力で失敗する
現状はexcel.exe /r "hoge.xls"で呼び出してる
よくわからんけど、VBSじゃAPIは使えないので、 APIを使える言語と組み合わせるしかないでしょ。
どっかで見たと思ったらExcelのあれか 誘導されたんだな、ガンガレ
自分のパスワードを自分で解除するってパスワード掛ける意味あるのかw 意味不明過ぎる
667 :
660 :2010/11/10(水) 08:22:44
>>664 やっぱ無理なのかなぁできそうなんだけどなぁ
vbsのウィンドウをアクティブにする手順じゃダメだめ?
>>665 よう!
向こうのスレでも散々だったが、こっちでもアウェイ感がw
>>666 パスワード掛ける意味はある
数人で同じExcelファイル回してて第三者にファイルだけ漏れてもパスワードにより開けない
アドインとvbsがないとね
いろいろ分かんないんだけどさ >パスワード指定して開けるのは知っているんですが >実際にやりたい事は下記通りで、その前段階でつまってるとこです 知っているならやれば??やらない理由は?あえてVBSを使いたいの? >できるならば複数Excelが開かれる場合にも複数同様に処理をしたい "複数Excel"は、1Application内に複数のWorkbookを開く時にも同様に処理したいって事? >現状はexcel.exe /r "hoge.xls"で呼び出してる これじゃブックごとにExcel起動しちゃうもんな アドインに、ブックを開くメソッドを作ってDDEで呼び出すってのはどう? "[Run(""AddinBook!OpenBook"")];" DDEならダブルクリック起動にも対応できるでしょ
MSCommでポートが無い時は終了する、という処理を作っているのですが On Error Resume Next MSComm1.CommPort = 5 MSComm1.PortOpen = True If Err <> 0 Then Err.Clear 'エラークリア Call MsgBox("ポートが確認できません。", vbOKOnly + vbCritical, "初期化エラー") Call Unload(Me) 'UnLoad Exit Sub 'Exit End If このようにすると、VBの上で実行すると、問題なくMsgBoxだけ出るのだけれど EXEを作って実行すると、MsgBoxの前に"実行時エラー8018"が出てしまいます。 これは回避できないんでしょうか?
>>668 > 知っているならやれば??やらない理由は?あえてVBSを使いたいの?
1つのbookを指定する際にパスワードを指定して開くとなると
100個ファイルがある場合、100個のスクリプトを作らないとダメですよね?
ファイル選択ダイアログとかも使いたくないので
あくまで、Excelファイルのアイコンをダブルクリックした時に処理したいのです
> "複数Excel"は、1Application内に複数のWorkbookを開く時にも同様に処理したいって事?
パスワードダイアログを自動入力できるならば、どちらでも構いません
> >現状はexcel.exe /r "hoge.xls"で呼び出してる
> これじゃブックごとにExcel起動しちゃうもんな
その方がプロセスIDやウィンドウが取得し易いと思っているんですがダメなんですかね
> アドインに、ブックを開くメソッドを作ってDDEで呼び出すってのはどう?
> "[Run(""AddinBook!OpenBook"")];"
> DDEならダブルクリック起動にも対応できるでしょ
DDEから呼び出され、アドインによりブックを開く、このブックってのはExcel.exeの事?
671 :
デフォルトの名無しさん :2010/11/12(金) 09:40:20
俺ならWMIで検索してみるかな
該当ファイルはワークブックのオープンイベントで例えば inputbox"pass" ' 何が入力されようが強制終了 にしておいて、 Application.EnableEvents = False 開いてTrueにする にすりゃわざわざフォーカスだのなんだのしなくてよかろ
>>671 プロセスIDは取得できてるんでWMIは今更感が…
他にWMI利用してできましたっけ?
>>672 それはvbsですか?vba?
Excelファイルダブルクリック
vbsにファイルパス引き渡してvbs内でパスワードと共に該当ファイルを開く
ってのでいけそうな気がしてきたので、やってみます
>>671 ググってみた
WMIでポートが有るか調べるってことでいいのかしら…やってみるっす。
ポートでのエラー以外は「実行時エラー」って出ないのかも気になったりもします。
とあるエラーをトラップさせようとしているのですが、そのエラーを起こせる実機が手元にないので
出先でデバッグってのもわりとつらい…
676 :
660 :2010/11/12(金) 14:40:45
解決した! DDEすら不要だったわ ファイルオプションでvbsからbookをパスワード付きで開く処理追加しただけ パスワードなしのbookもそのまま開ける 回り道した割りにあっさりできた でも、色々と広い知識のスレ住人には世話になった 感謝する。ありがとう
>>669 8018って既にポートが開いてるとかいうエラーじゃない?
だとしたら
if MSComm1.PortOpen = False then
MSComm1.PortOpen = True
else
msgbox "既に開いてる"
end if
みたいにしてみては?
なんかRADでいい言語ないかねぇ VB+Cでいままで作ってたから画面まわりを作ってたVBが無くなるのは辛い VCで画面なんか作ってたら気が狂いそうだし、C#あたりで作るのが無難なのかね… C#もとっつきにくいんだが…歳のせいか?w
C#で十分でしょ。
やっぱりC#ですかねぇ VB.NETもかじってみたけど、なんだこの言語ってなった VBの良さってササっと作れるとこだったんだけど それにしてもVB.NETはもう別言語ですな VBの悪いとことCの悪いとこを足したような感じ…
>>677 いや、8018は開いているポートに対してできる操作です、みたいな事だったと思う。
なんでポートを開こうとしてそんなことを言われるのかも良くわからない。
ポートが開けてない=他の誰かが既に開いている
>>680 最初はそう思うけど後で自分はなんて恥ずかしいこと
言ってたんだと思うことになるからそれくらいにしとけw
>>680 c#.netとvb.netなら、ほとんど差は無いんじゃねえの?
>>684 慣れ親しんだ文法の壁だろ 多分
理解出来てりゃ文法とかはある程度吸収できるとは思うけど
N88BASICからVB6に変えたとき結構苦労したわ。同じBASICなのにここまで違うのかと。 趣味で多少のもの作ってるだけだからWin7でも使えるなら無理して乗り換えはせん。
>>686 N88BASICから、VB6まで何世代違うと思ってるんだよ。
QBASIC、Visual Basic for MS-DOS、VB1、VB2、VB3、VB4、VB5、VB6、
同じMS製のMSX-BASICからでもわりと悩むのに… さておき Windowsが終了することでアプリが落とされる場合にステータスを保存したいような場合 処理が短ければUnLoad の中で問題ないんでしょうか? やりたいことはUPSからシャットダウンされそうになったときに、データを保存するっていうようなことです。 UPSの付属ソフトは終了前に何かを実行させるという機能はあるから、 ソレからなにか情報を受けるのでもいいけど、それはそれで大層な気もする…。
vbsでExcelを開いてるんですが2回以降に開くExcelも別プロセスとして上がってしまうので Excelが起動してる場合同じプロセスでbookを開きたいです vbsでCreate.objectする前にGet.objectでExcel.applicationを取得して エラーでなければCreate.objectしたいのですが Errorの判定方法が分かりません 助けて
Windowsプログラムに使えるライブラリを提供するシステムファイルって、 それぞれどういうものなのかよくわからん、困ったもんだ。 エクスプローラには、.dllが「アプリケーション拡張」で、 .ocxが「ActiveX コントロール」と書いてあるな。 ActiveX コントロールとは、フォームに張り付けるオブジェクトかも知れんな。 Declare ステートメントは、C言語等で作成されたdllの中の、クラスを使ってない 関数を呼ぶものかも知れんな。 参照設定って何だ。Declareは別に参照設定は不要なのかどうなのか。 少なくともWin32API関数は不要のようだが。 参照設定は.dllも.ocxのどちらも対象に入るのかどうか。 参照設定は、Microsoft OfficeのWordかExcelかAccessを、実行前からどういう ものか認識できて、専用のデータ型の変数とNewキーワードを使えるのに対し、 それをしないとObject型変数しか使えず、実行してからでないとどういう実体なのか わからなくて、CreateObject関数で変数の実体を生み出すぼろいやり方なんだな。 参照設定の対象になるオブジェクトって何て言うのか。あれをCOMと言うのか、 それともActiveXと言うのか、それともOLEと言うのか、それともオートメーション と言うのか。 よくわからんわ、困ったもんだ。
ボロボロの古典を勉強するのが悪いとは言わんが現代から未来に目を向けて生きて行こうや
>>689 えーと… .NETから移植するってことでいいのかしら?
.NETから移植するのでも .NETに移行するのでも お前が早くやれると思う方を選べばいいと思うよ。
間に合わなければ、強制終了されるだけ。
ループ内でshellを使用して別EXEを呼んでいます。 このEXEは1つのEXCELファイルを検索し、見つけたら表示をするだけのEXEなのですが、ループ内で呼んでいるため複数ファイルが表示されることになります。 現状、複数のプロセスでEXCELファイルが表示されてしまうので、これを1つのプロセス内で複数ファイル表示させたいのですが、いい方法はありますか? ちなみに、別EXEに修正はあまり加えたくありません。
>>699 EXE1回実行で1つのファイルが見つかるものを、複数回呼んで複数ファイルを表示させると、呼んだ回数だけEXEタスクが増えるが
実行されているEXEを再度コールするなどで、タスクを増やさず現在動いてるEXEを再実行させたように動かしたいと?
EXEが多重起動による再実行オプションをもってるとか、コマンドの受付けを持っているとかだと楽だろうねえ。
マウスイベントとかキーダウンイベントで再実行できるならAPIでなんかあったような。
ShellExecute()を利用して、関連づけで開けばOK
>>701 別EXE内のEXCELを起動する場合にShellExecute()を利用するということでしょうか?
1つのアプリケーション内に複数のWorkbookを開きたいので、
Set obj = CreateObject("Excel.Application")でセットしたオブジェクトを
別EXEに起動引数で渡せれば、別EXE内でobj.Workbooks.Open(xlTestFile)し、
ループが終わったらVisible = Trueで全表示できるかな。。と単純に思ったのですが、
実現可能ですか?引数にオブジェクトを渡せるのかどうかは謎ですが、実行環境がないので
確認していません。
無理。
Excelに対するCOM操作が必要なの? だったら先に言ってくれ、答えづらい。 新規にActiveXEXE作ってそこにExcelへの参照変数持たせるとか。 後はGetObjectって使えたっけ? 起動中Excelへの参照が得られるやつ
705 :
デフォルトの名無しさん :2010/11/28(日) 14:38:17
質問です。 今、数合わせゲームを作っています。 デバックしたときに数字が表示されなくて困っています。 エラーとか警告は出てません。 わかる方がいましたら教えてください。 お願いします。
わかりません
そもそもVBは入門言語にはふさわしく無いと思うんだけど
なんとなくで動いちゃうから教育上よろしくない。 あとで苦労した
>>705 表示されるようにプログラムを書けばいいと思うよ。
>>707 >>708 データ型指定せずともなんとなく動くとか、
例えばテキストボックスでhoge.text = "hoge"って書かずとも
hoge = "hoge"で代入できちゃうとか。
クラスとかわかってなくてもなんとなくいけるとか。
自分で関数は書けずとも、改造はできるとぬかすとか。
イベントハンドラに何から何まで書いちゃうとか。
間違って微妙に古いソースを改修しちゃってデグレった…。 ソース管理が滅茶苦茶でどれが最新のソースなのかわからなくなっています。 現在動いているEXEはあるのだけど、逆コンパイルってできるのかな…
逆汗ツールはある。が、精度はそんなによくない。 かんたんなプログラムなら何とかなるかもしれないけど。
713 :
711 :2010/11/28(日) 22:11:46
>>712 ググッてみたけれども、使えそうなのはVB Decompilerくらいっぽいのですが、
他になにかあったら教えてもらえると助かります。
探したのは数年前だけど、そのくらいしか見つからなかった。
715 :
711 :2010/11/28(日) 23:16:21
そうですか… 明日試してみます。ありがとうございました。
VB2010expressとsql server2008の接続について質問したいのですが、 板の場所がわかりません。 だれか誘導お願いします。orz
718 :
716 :2010/11/30(火) 12:31:45
>>717 ありがとう!
近いうちにそこで質問してみる!
C#のがいいよ
さむいわあ
あああ
722 :
デフォルトの名無しさん :2010/12/27(月) 20:09:50
そもそもVB他、初心者に向いて無いような気がする。 フォームにUIのパーツを貼り付けていって、走らせてみたら Hello World が出る。 プログラミング初心者にとって重要なのは、制御文の使い方だったり データ型であったり、また、VBの場合ならOOPとしての設計方法だったり するけど、なまじUIが便利に出来ているから、初心者が独学でやろうと すると、コピペだらけになり、肝心な部分がいつまでたっても成長しなかったりする。 本はたくさん持ってるけど、似たような入門本ばかりだったり。
今更何を言ってんだ
UIをコードで自作すりゃええやん
コピペ指向ばんざいへ
>>722 激しく同意する部分多々あり。
会社の偉いさんから
「ワシ、今、こんなソフト作ってる。これで会社が便利になるから
完成させてくれ」
と、渡されたソフトがVB6で作りかけられてはいるが
中身は目もあてられず。
Option Explicitつけただけで、コンパイルが通らない部分だらけになった。
一つのイベントハンドラに2000行ぐらいのコードがある。
中身何やってるかわからない。
コピペだらけで、IFやFORのインデント位置が無茶苦茶。
まず直す作業から入ったが大変だった。
インデントだけなら直すのは難しくないんじゃ・・・とも思ったけど そうでもないか
大変だな。・・・
>>727 コードの整形ツールくらいどっかに転がってそうだけど、ないのかなあ?
探したことないけどw
1行づつ読み込んで改行食らわしながら張ってけば整形してくれるだろう
インデント修正なんて正規表現で直ぐ直せるだろ
ばっか、これはわざと汚いコードを渡して、 綺麗に整形させると共にコードの内容を理解させようって言う作者の意図なんだよ
コードの内容の理解が目的でわざと理解しづらい風に 記述するとか、考えられん。
可読性を下げる事で可読欲を上げようとする手法じゃな で、この手法の名前を考えようぜ
まあインデントを直さないといけないっていうのが ありえないよなぁ
736 :
726 :2010/12/29(水) 23:58:44
データアクセスもビジネスロジックも全部イベントハンドラに入ってる。 クラスモジュール、標準モジュールには何も入ってない。 Form1があるだけ。 丁寧なところはOn Error Resume Next。 勘弁して下さい。
?Val(Join(Array("&H","D495","%"))) ?Val(Join(Array("&H","D495","&")))
VB6LEたのしいお
Public Function gcd(n1 As Long, n2 As Long) As Long If n2 = 0 Then gcd = n1 ElseIf n2 > n1 Then gcd = gcd(n2, n1) Else gcd = gcd(n2, n1 Mod n2) End If End Function Public Sub Hoge(n As Long) Dim p&, i& p = 2 For i = 3 To n p = p * i / gcd(p, i) Next i Debug.Print "Input "; n Debug.Print "Muls "; p End Sub Call Hoge(20) Error!オーバーフローしました (´・ω・`)VB弱ええ
LongからCurrencyに変えたら Call Hoge(24) でオーバーフローだよ (´・ω・`)VB使えねええ
お前に汎用性があって柔軟性があって軽くて最強な数値型を教えてやろう つ int 範囲が明確だ 複数使うか配列に格納して任意の桁を実装できるぞ! さらに勝手の良い型を使いたいなら つ boolean これは超最強。 常にtrueかfalseの二値しか格納しないから、判定も簡単。 組み合わせることで、二進法表記が出来る! 理論上は無数の数を表現できるぞ!
booleanって内部的には何バイトのメモリ使ってんだ?
1ビット
なわけない、4Byteだろ
最強はbyteだろカス
748 :
デフォルトの名無しさん :2011/01/14(金) 21:10:12
Dim Suuji(100) As Byte
Byte型配列で1こあたり1ビット相当の2進数でやるの? 10進数で表示するの大変じゃない? Int型配列にして1こあたり3桁分の10進数でやったほうがよくない?
円周率を何千桁と求めるために使うやり方
>>249 確かにval型配列でTFの文字列を一個づつ格納して並べたほうが見やすくていいな!
752 :
デフォルトの名無しさん :2011/01/18(火) 14:52:52
GDIplusとか便利なAPIあったんだな つかStrPtrとかVarPtrとかObjPtrとか初めて知ったわ・・・
Public Function RLong(lngValue As Long) RLong = lngValue + IIf(lngValue < -&H8000&, 1, IIf(lngValue > &H7FFF&, -1, 0)) * &HFFFF& End Function Public Function ChangePName(strName As String, intPassCode As Integer) As String Dim i&, c&, s$(), iCode%, iNextCode% iNextCode = intPassCode: c = Len(strName): ReDim s(c) For i = 1 To c iCode = CInt(RLong(CLng(Asc(Mid(strName, i, 1)) Xor iNextCode) - CLng(iNextCode))) iNextCode = Not (iCode Xor iNextCode): s(i) = Hex(iCode) Next i ChangePName = Join(s, "%&H") End Function Public Function ChangeName(strPName As String, intPassCode As Integer) As String Dim s$(), i&, iCode%, iNextCode% iNextCode = intPassCode: s = Split(strPName, "%") For i = 1 To UBound(s) iCode = CInt(RLong(CLng(CInt(s(i))) + CLng(iNextCode))) Xor iNextCode iNextCode = Not (CInt(s(i)) Xor iNextCode): s(i) = Chr(iCode) Next i ChangeName = Join(s, "") End Function ?ChangePName("2ちゃんねる.net",12345) %&H822F%&H816D%&H7E1E%&H7DD1%&H81CB%&H7DE8%&H22%&HFFDA%&HFF9B%&H74 ?ChangeName("%&H822F%&H816D%&H7E1E%&H7DD1%&H81CB%&H7DE8%&H22%&HFFDA%&HFF9B%&H74",12345) 2ちゃんねる.net
754 :
デフォルトの名無しさん :2011/01/23(日) 02:28:36
なにこれ
こわい
怪しいプログラムは実行しちゃダメだよ><
ごっつあんです
なんだかよく分からないプログラムだな
VBの勉強を始めた者です。 会社の上司から「この部分のスイッチの色を変えたいんだけど」 って工場の監視ソフト(他社作成)のEXEファイルを渡されたんですが EXEからリバースエンジニアリングしろって事ですか? 自宅パソコンにはVisual Studio入ってますが・・・・ 無知ですいません
むりっしょ
>>759 >EXEからリバースエンジニアリングしろって事ですか?
それしかないね。無理。とは言わないけど、難しいと思う。
VB6でp-codeコンパイルしてあるとか、.NETならあるいは。
無理と言っていいよ。 これはすでにプログラミングではなく、 ハッキングの領域だから。 ハッキングの領域で言えば、難しいって までもないレベルではあるんだけどなw 仕事でビジネスソフトを作っているプログラマでは 知らなくて良い知識が必要になる。 工場の関係の人ならソースコード=設計図がなければ 手のだし用がありませんとでも言えば納得するんじゃない?
その上司を無知と言うのかね、君が。
無知は必ずしも悪いことではない >知らない事を知っていると考えるよりも知らない事は >知らないと考える方が優れている そして、764>>が無知でないという証明は未だされてない。
単に知識がないという意味だけだろ それよりもレスアンカーすら満足につけられないやつにいわれたくない罠
もしリソースに格納されたダイアログなら単純に編集できるかもしれない そうでなくても普通のプッシュボタンならDLLインジェクションか何かで背景ブラシを差し替えるだけで簡単に出来るかもしれない
VBのフォームってダイアログリソースじゃなくね?
766 これがムチ
770 :
デフォルトの名無しさん :2011/01/27(木) 22:21:45
VBAのプログラミングの質問です。 サブプロシージャを使ったプログラムで、配列(ex:x(10))を計算し、返すものです。 ただし、variant形式にしないために、サブプロシージャの中で変数宣言しなければなりません(必須)。 宣言しなければ動くのですが、サブプロシージャ内で配列を宣言することができません。 『Byref引数の型が一致しません』と出てしまいます。どうやって宣言すればよいのでしょうか?
>>770 なあ、真面目な話、その文章で人に内容が伝わると思う?
こういうことかな Private Sub Command1_Click() Dim a(10) As Integer a(5) = 5 MsgBox hoge(a) End Sub Private Function hoge(a() As Integer) As Integer hoge = a(5) End Function
773 :
704 :2011/01/29(土) 00:11:12
>>772 ありがとうございます!
なるほど、a()で型宣言できるのか・・・
>>772 Private Function hoge(a() As Integer) As Integer
on error goto catch
hoge = a(5)
on error goto 0
exit function
catch:
redim preserve a(5)
hoge = a(5)
End Function
>>773 704ってなんだよ
CallとかLetって何のためにあるんだろう Let Value = 100 とか書かないじゃん Value = 100 だし Call Hoge(Value) と書かずに Hoge Value って書くし
Withの使い方でヘルプに描いてない使い方あるよね。使っても大丈夫なのかな? たとえば With New Class1 みたいなNewで使うやつとか With GetClass1() みたいなクラスへの参照返すやつとか
いや例えばgetClass1()が呼び出されるたびにちがうClass1のインスタンスへの参照が返されるとかさ
callは引数呼び出しの明確化に使うなあ letは使ったこと無い
letは中間コードを採用した8bit機のBASICでコード領域1バイトを犠牲にするかわりに実行が速くなる場合があった VBのインタプリタで速度に差が出るかは試していない
780 :
デフォルトの名無しさん :2011/01/30(日) 20:46:52
試していないのか
VBはコンパイラ、機械語に翻訳する
VBはコンパイラではあるが、直接機械語に翻訳してるわけではない
VB6までのIDEは基本的にはPコードという中間コードにコンパイルして実行しているが これは8bit機時代のマイクロソフト系ベーシックインタプリタと同様の構造であり 伝統的に「インタープリタ」とマイクロソフト自身も呼んでいる VB5以降はexe生成時にPコードを格納するか機械語のネィティブコードを生成するかを選択できる 前述のPコードコンパイラではなくこのexe生成機能の事を特に「コンパイラ」と呼ぶ 機械語生成されたexeもランタイムに依存しているので直接機械語に翻訳されていないと勘違いされる事も多い exe生成時にlink.exeが内部で実行される時に一時的に生成されるobjを逆アセンブルすれば実際に機械語が生成されている事実を確認できる
僕は素人のVB6LE使いだからp-codeコンパイルとか機能的にない残念だお VB6買ったのは金ない学生時代・・・アカデミパックでLEしか買えないとか昔は貧乏だったなあ
逆だったLEはp-codeコンパイルが出来て、ネイティブコードコンパイルが出来ないんだった
俺はアカデミックでどうせだからとPE買ってた
>>775 引数を( )で囲んでないとわかりにくい。
元はCとかJavaやってたんで。
じゃあIf文も If a<3 Then じゃなくて If (a<3) Then とか書いてるのか CやJavaからだと = が使いにくそう
>>788 そこは大丈夫。
引数だけは目に馴染まない。
自力で試しても全然動かなかったので質問させてください。
VBからテープデバイスに書き込みを行いたいのですが、
WEBでプログラムからテープデバイスへのアクセスについて調べたところ
ttp://www.winapi-database.com/File/Tape/ に書いている関数使ったらいけると思って試してみたのですが、
うまく動きませんでした。
上記ページを読んだ感じだと
1.書き込みを行いたいファイルのハンドルをCreateFile()で取得
2.↑で取得したハンドルに対してBackupRead()で読み込み
3.テープデバイスのハンドルをCreateFile()で取得
4.2で読み込んだファイルを3で取得したハンドルに対してBackupWrite()で書き込み
でいけるのかと思ったのですが、書き込みエラーが出るどころか、全くテープデバイスが動いた様子もなく終了します。
どうも引数の設定がどうとか言う以前に関数の使い方を間違えているのではと思います・・・
WEBで調べてもBackupReadはともかくBackupWriteは使っているコードすら全然見つかりません
VBに限らずCとかでも構いませんので、テープデバイスに対して書き込みや読み込みを
行った経験がある方、もしくは↑URLを見て使い方が分かる方が居ましたらサンプルコードや
関数の使い方の説明等、ご教示頂けたらありがたいです。
(
>>854 お姉さまwwに誘導されてきました。)
現在、シリアルから19200bps(rs232c)で文字を自動的に吐き出している機械が有ります(マイコンです)
例 PIC RS232C−TEST
ハイパーターミナルで受信をした所正常に受信しています。(COMの設定等もしたつもりです com2であっています)
けれど、VB6.0で作成したプログラムでは、何にも出ません。
参考サイト
http://scw.asahi-u.ac.jp/~sanozemi/Sakuhin/pic02/PIC02.html 作成したソース
Private Sub Form_Load()
MSComm1.CommPort = 2
MSComm1.Settings = "19200,n,8,1"
MSComm1.RThreshold = 6
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
MSComm1.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then Label1.Caption = MSComm1.Input
End Sub
何がいけないのでしょう?お力をお貸し下さい。
また2005でも、質問に来るかも知れないのでよろ
If MSComm1.CommEvent = comEvReceive Then Label1.Caption = Label1.Caption & MSComm1.Input end if ってすればいいんじゃないの
323みたいなのはここでは定期的に出るドトネト厨の釣り針なのか?
>>792 ありがとうございます。
やってみました・・・
なんか変わらない orz
私のRS232Cの設定が悪いのだと思います。
もう一度検討してみす。
795 :
デフォルトの名無しさん :2011/02/08(火) 10:30:41
ファイルの保護について質問させてください。 現在作成しているアプリケーションでは計測中にデータをバイナリファイルに追記していきます。 計測中にはそのデータファイルを操作されたくありません。 (移動、リネーム、削除など) そこで検討中の案は、最初にデータファイルが作成されたときに「Binary Access Read」でファイルをOpenし、 計測終了時にCloseする、というものです。 計測中は「Binary Access Write」でOpenしてデータを追記していきます。 上記のやり方では何か問題はありそうでしょうか? また、このような場合、どのような処理を行うのが一般的なのでしょうか? ご教示下さいますようよろしくお願いいたします。
それでよし
Open FileName$ For Binary Access Read Lock Read Write As #1 とか Open FileName$ For Binary Access Write Lock Read Write As #1 とか は? Openステートメントあんま使ったことないからよく知らんけど
Dim x As Integer = 0 For j As Integer = 1 To 2 For i As Integer = 1 To 5 x += i Next i Next j このとき、xは33になりますよね・・・? 基本的な質問で申し訳無いですお願いします。
バイナリファイルの扱いってやったこと無いけど、 はじめからWriteモードで開いてたらあかんの? ファイルロックが目的ならそれで良さそうな気がするけど。
>>798 1 + 2 + 3 + 4 + 5 +
1 + 2 + 3 + 4 + 5
= 30
>>800 即レスありがとうございます。
理解できました。
802 :
デフォルトの名無しさん :2011/02/08(火) 18:48:21
皆さん、早速のご回答ありがとうございます。
>>797 計測中にファイル内容を読み込むこともあるんで、Lock Readはできないんですよ。
>>799 Writeモードで開きっぱなしっていうのが抵抗があったもので…。
ファイルに何か不具合があって、プログラムを見直す時に、
「開いて書いてすぐ閉じる」ってなってた方が分かりやすいし、安心かなと。
自信がないんです…。
>>802 >計測中にはそのデータファイルを操作されたくありません。
ってなれば、Writeモードで開いているしかないと思われ。
804 :
デフォルトの名無しさん :2011/02/08(火) 22:56:16
Call Shell("C:\aaa\aaa.exe", 1) で、exeが実行されるものとされないものがあるのですが、 無理やり実行させる方法はありませんか?
shellexecute
実行環境の違いでエラーになったりならなかったり プログラムが強制終了したりしなかったりとかってある? 落ちるって言われた所の現象が再現出来なくて困ってる。 フォームが表示された後に数秒してから一部のフォームが落ちたらしくて もう一度やり直したらちゃんと動いたっぽい。 フォーム表示後すぐじゃないからformload時とは別で落ちてるって事なんかな? formload時以外でやってる処理は1秒毎にタイマーでラベルのcaptionに時間セットしてる所ぐらい。 タイマーが張ってあるのが最初に起動するメニューで その後色んなフォーム開きつつ、ずっとタイマーが動いてるから これが悪いのかな?
再現するソース出せ
そんなのログだすようにして使ってみてもらうしかないな
>>803 ありがとうございます。
Readモードでは操作される可能性があるということでしょうか?
Open FileName$ For Binary Access Read Lock Write As #1
>>809 > ありがとうございます。
> Readモードでは操作される可能性があるということでしょうか?
Readモードにせよ、Writeモードにせよ、Lockしていない以上操作される可能性はあるだろう。
Lockするのが嫌なら、アプリケーション専用にユーザーアカウントを作成して、
他のユーザアカウントからは操作されないようにするんだな。
On Error Goto 〜 とか On Error Resume Next とか 使ったら End SubやExit Subの手前で On Error Goto 0 を入れたほうがいいの? そういうコード見かけるからなんでだろうと思ってさ 参照型の変数もよくプロシージャの終わりのほう Set abc = Nothing とか見かけるし なんで?C言語とかならともかくVBって自動開放とかじゃないの?
>>813 On Error Resume Next はGoto 0 を入れる必要は無いと思うけど
どの箇所で起こり得るErrorかを、他の人がコードを見た時に、
元々書いた人の意図が伝わるんじゃないですかね。
GoTo hoge とかでも一緒。
個人的には、On Errorの後は当然のようにインデントするんだから
インデントの終わりの場所にもOn Errorはあるべしと思う。
Set abc = Nothing は、意味ないです。
場合によっては必要になる事もあります。
なるほどね ありがとうございます
むしろGoto 0書かなくてもいいって感覚が理解できない。
MSDNにはGoto 0を書かなくてもプロシージャの終わりにエラー処理ルーチンが無効になるって書いてあるからさ 独学なんでVBを覚えるのに使った書物はベーマガだけだし ちゃんとしたVBの入門本とかにはそういうこと記載されてんのかな
だから、プロシージャの終わりまでエラーが検出できないのは問題。
あとは
>>814 が言ってる理由も大きい。
自分でそう書いてるのに、なぜ結論が「Goto 0 を入れる必要は無い」になるのかは
理解に苦しむ。
>>813 >End SubやExit Subの手前で On Error Goto 0 を入れたほうがいいの?
1命令だけスポットで例外をキャプチャしたいなら すぐにgoto 0を入れるべきだろうけど、 プロシージャ全体の例外を1箇所で集中管理したい場合は いちちgoto 0は入れずにExit Subで抜ける。 Private Sub Hoge() On Error GoTo err1 ' 処理 Exit Sub err1: ' Error処理 End Sub On Error Resume Nextの場合は1命令だけスポットで使うことがほとんどだろうから、 必要がなくなったらすぐにgoto 0解除したほうがいいだろうな。
話違うけどon errorとon local errorって何が違うの? なんとなくlocalの方使うようにしてるけど・・・あんま違いないのかな
だいたい、くそ長いプロシージャ書いてる奴はGoTo 0の扱いに困る。
>>821 on local error xx は quick basicとの互換で残ってるだけじゃなかったかな。
VBのエラー処理は全てローカル扱いになるからlocalは不要。
dクス。あんま関係なかったのか
頭の中では常に対称性の原理に基づいて思考するのが効率的だから GoTo 0がないと思考の流れが滞るので困る。
826 :
デフォルトの名無しさん :2011/03/01(火) 21:53:04.98
ぽちっちゃったじゃないか・・・
>>826 結構古い本ですね
VBSCRIPTでも使える本ですか?
829 :
826 :2011/03/02(水) 00:28:56.89
基本的にVB6の本だけど、「再利用可能なルーチンを作成する為のバリアントの引数」の所で ちょろっとVBScriptへの移植性の記述がある おいらはまだ怖くて本にソースがあるライブラリ以外ではバリアント引数は使えてない ただ、考え方とかエラー処理のノウハウは参考にできると思う
>>828 むしろ新しいでしょw
しかし、VBのエラー処理で一冊本を書いちゃうって随分マニアックな人だな。
そんなネタがあるとも思えないけど。
今2000年123月2日だからそうだな年内の発売だな 中古品7点¥ 11より 安すぐるwww
中古だと精子まみれとかでカピカピになってそうで嫌
未だにこのエラー処理使ってるわ
>>832 エラー処理の本で抜ける兵がいるなんて、まだまだ世の中捨てたもんじゃないな
VB6と他の言語の両方に精通していて尚且つそれなりの頭があるなら応用出来なくも無い
Try Except 構文が無いVBの為の本だったように記憶しているが。
>>820 みたいなやり方だった気がする。
要はGoto先のラベルのうまい使い方の本だった気が。
Continue代わりにも使えるしな。
839 :
828 :2011/03/02(水) 08:15:43.46
俺はバリアント引数使わない。
何でも入るのが怖い
VBからExcel開くprgをWin98上で走らそうとすると、型が一致しませんってエラーが出るんよ XPや2000上では問題無く動く 開発はXP上のVB6.0でやってて、Win98にはexeだけ持って行ってVB6.0のランタイム入れてる エラーは、xlBook=xlApp.Workbooks.Open("ファイル名")のとこで出てるぽい xlBookもxlAppもObject型で指定してるんだけど、型が違うってことはxlBookはObject型 じゃダメってことなんかな それともExcelのバージョンが関係してるのか、Win98は2000で、XPと2000は2003なんだ
>>842 こんなところに長々と文章打ち込む前にgoogle様にお伺いを立てた方が建設的よ。
確か割とありがちな「落とし穴」だったはず。
Win98をサポート外にすれば解決だ
参照設定だかコンポーネントだか知らんがExcelのバージョンの問題だよね
参照設定なんかしちゃだめだよ
会社の古いPCにWin98入ってるわ 遅いしやたら固まるし2000かXPに変えたいけど、古いPCだとメモリも少ないし入らんよな
事前バインディングの方法にしても、Excel2000では落ちるよ。 OSがXPでも一緒。Excel2000に存在しない関数とかいっぱいあるから。
スレ違いのような気もするんですが質問させてください。 いま、Visualbasic6.0の参考書とVisualbasic2010 ExpressEditionを使ってVBの学習を始めたんですが、 本についているVisualbasic6.0のサンプルコードCR-ROMのファイルが全く読めません。 どうやって読み込み(orインポート)すればいいんでしょうか?
VB2010 EE に、VB6のサンプル読ませるのか? VB6とそれ以後は互換性が大層なくなってた気がするが
サンプルプログラムをのフォーム配置とコードを見たい程度なので動かなくてもいいんですが、やはり無理でしょうか?
>>852 ありがとう。
ググってるんだけど、あまりに解らない事が多すぎて頭がパニックになってます;;
>>849 6.0と2010はほぼ互換性が無いので、その学習環境は
極めて効率の悪い環境と言えます。
書き込みの内容から、プログラミング全般に渡って初心者である事がうかがえますが、
VBとかMicrosoft系言語は、UI(画面の事ね)が簡単に出来過ぎるので、
わかってないのにわかった気になってしまうのが欠点で、そういう意味では
プログラミングの最初の学習題材としては向いていません。
Javaあたりでコマンド使ったプログラムから始める方がいいと思います。
VBの名前を使い続けたのは失策だな VB++とかにしとけばよかったのに
>>854 どさくさに紛れてMicrosoft系言語とか広げて批判するなや
C++に関しては、ボーランドのほうがVBみたいにさくさくUI作れて便利だと聞いた。 コマンドラインな言語は賛成するが、Javaってのは微妙。
OOP言語のテキスト的存在で、無料で開発環境が整うJavaで 勉強するのが悪いわけないと思う。 OOPというと機能的には不満足ではあるが、VB6もクラス作っていけるからな。 ポリモーフィズムも使えるし。
>>826 の本入手した。
既に実践してる内容も多かったけど、他にも参考になった。
が…
On Error goto next
による、インラインエラートラップって、
それするぐらいなら、エラーにならないようにできるのにとも思った。
>>858 On Error Resume Next?
ソースをエラー出さなくするのはいいとして、デバイスやコントロールがエラーを返す場合はどうする?
コモンダイアログのキャンセルエラーを拾うとかな
>>859 そういう場合、インラインエラートラップでなんとかなる?
timeGettime関数のNow関数の関係について質問があります。 まず、timeGetTime関数とNow関数の戻り値をそれぞれ記憶します。 仮にこの時の値が0と0:00:00だとします。 約一時間後、timeGetTime関数の戻り値が3,600,000になった時、Now関数の戻り値は1:00:00になるはずですが、 0:59:59や1:00:01になったりなどの誤差は生じることはありますか? 一時間後というのは例で、たとえば24時間後や1週間後でも、誤差が生じるまでの期間は問いません。
Now関数?
どちらもシステム時刻から取得するからズレないんじゃないの?いあ、俺素人だから余計なこと言わんほうがええか
866 :
864 :2011/03/23(水) 22:55:39.23
>>864 さんの仰るようなことが知りたかったんです!
どちらも同じところから算出するから、理論的にズレるはずがないのか、
それとも別のところから算出するから、ズレる可能性は十分になるのか。
どうなんでしょうか?
ズレる可能性はあるでしょ。 回路的に独立した別のクロックなはずだから。 NowとかはRTC。 timeGetTimeはたぶん結局のところCPUのクロックを分周して作ってる。
使い勝手の悪いAPIだな timeGetTimeの戻り値そのまま使えないじゃんか
timeGetTime関数 ・・・ システムが起動してからの経過時間 Now関数 ・・・ システムの日付と時間 まったくイコール関係ないじゃんか
くどいようだが Nowは今日の日付と現在時間を返す関数で timeGetTimeとやらはWindowsが起動してからの経過時間 単純比較出来んだろ
timeGetTimeとGetTickCountの用途の違いが分からん
875 :
864 :2011/03/24(木) 07:42:17.59
RTC 【Real Time Clock】(リアルタイムクロック) マザーボード上に実装されている、計時専用のチップ。 他のマザーボード上のチップと違って、電源が切られている間も内蔵電池から電源供給を受けて動作している(電源が入っている間は外部電源から供給を受ける)。 OSは起動時にリアルタイムクロックから日時を取得し、その後はOS側で独自に計時する方式を採っている。 ↑この「独自に計時する方式」はtimeGetTimeの計時する方式とは違うのでしょうか? この方式が共通であれば、理論的には誤差はないはずですよね?
>>875 どこからのコピペか知らないけど、HWでRTC持ってるのにわざわざそれと別のに
ソフトウェアで時刻をカウントしているとは思えない。
君がどう思っていようとも、してるんだよ。
878 :
864 :2011/03/25(金) 11:22:00.82
名前欄も安価もひとつずつずれてるよ
Microsoftに直接問い合わせればええやん
>>878 その文章には「OS」としか書いてないけど....
逆にどこにそんな間抜けな二重管理をしなきゃならん必然性があるのか聞いてみたいもんだ。
そもそも歴史的にPCのクロックは精度必ずしも高くないのに
君がどう思っていようとも、してるんだよ。
馬鹿で何一つ意見も情報も提供できない奴に限って粘着質
>>882 気色悪い。
事実を受け入れない人に説明してどうなるというのか
お前がそう思うならそうなんだろ。お前の中ではな(キリッ
馬鹿で何一つ意見も情報も提供できない奴に限って粘着質
>>885 気色悪い。
仮にWindowsが
>>878 に書いてあるような意味不明な仕様になっているとすれば、
VirtualBoxなどでゲストOSを中断→再開した時、ゲストOSの時刻は(ホストOSの時刻ではなく)
中断した時の時刻になるはずだが、そんなことが起こるかどうかやってみたら?
ゲストOSとホストOSって同期させないとどんどん差異が出てくるよ
クロックが可変するCPUが出たとき、タイマーも狂うから修正パッチ出たりした記憶があるな
>>862 >>875 のような話もあるけど、
例えば次のプロシージャ開始時刻が12時34分56秒だとして
Private Sub Hoge()
Dim hour As long
Dim minute As long
Dim second As long
hour = DateTime.Hour(DateTime.Now)
minute = DateTime.Minute(DateTime.Now)
second = DateTime.Second(DateTime.Now)
hour が12
minute が34
second が56
になると思いますか? なりません。秒以下のデータが99とかだったら
minute 35 second 0 になる可能性ありますよね。
間違いをヒトコトでくくると、データの原子性というところで
間違っています。DateTime.Nowを3回呼び出しているところで
原子性が保たれません。
やるなら
Dim ima As Date: ima = DateTime.Now
Dim hour As Long: hour = DateTime.Hour(ima)
Dim minute As Long: minute = DateTime.Minute(ima)
Dim second As Long: second = DateTime.Second(ima)
timeGetTime関数の呼び出しとNow関数の呼び出しを
完全に同じタイミングで呼び出せないからには、必ずズレが生じる可能性があります。
取り敢えずここはVB6スレだ
じゃあ次は午前0時と午後0時の定義について話し合おうぜ
事実を受け入れない人に説明してどうなるというのか
4月からプログラマとして仕事するんですけど 家で学んでおくべき事とかあったら教えてください。
>>896 VB6などを触っている暇があったら、JavaとCを勉強して下さい。
いまVB6の案件は非常に少ないです。
898 :
896 :2011/03/29(火) 15:20:07.36
地方プログラマなんでw
?
地方プログラマでも、VB6はあんまり使わんと思うがなあ。 取引先がVB6全盛ってんなら解らなくもないが。 地方うんぬんより弱小企業のほうがVB6率高いかも。おもに移行コスト的な面で。
製造して何十年とたってる原発みたいなイメージ
地震や津波によって動かない状態にはならないから素敵
地震や津波がきたらポンプが止まって取り返しのつかなくなる点も同じだな しかし、想定外の地震や津波は来ないという前提で使われている
VB6は土方話ばかりで夢がちっともないな。夢がない人生なんて悲しすぎる
半角スペースを含むデータをValueで配列に入れ、その配列の中身をcsvに吐き出すとなぜか半角スペースが""で出てきます 半角スペースは効かないのでしょうか?
何やってんのか知らないけど、 ""を半角スペースに置き換えれよ。
つか、その部分のソースぐらいはここに書いても苦にならんだろう
>>907 データの値の事だろ
データに必ずしも値があるとは限らない
>>909 そのまま訳してるだけやんw
>半角スペースを含むデータをValueで配列に入れ
特に何か意味を含んでいると思ったが。
Val(データ)?
質問者本人が来ないと話しにならない
はなしし?
915 :
デフォルトの名無しさん :2011/04/16(土) 23:45:27.18
エクスプローラから新規作成で作ったばかりの「新規テキスト ドキュメント.txt」 は当然、0バイト これを右クリックして、「プロパティ」→「概要」タブの、例えば「コメント」のところに 何か入力しても、ファイルサイズは0バイトのまま。 これは、「ストリームデータ」だか「サマリーデータ」だか何だか知らないけど ファイルシステムの管理する部分に保存される ここに書き込みたいのですが、 "Shell.Application"ではGetDetailsOfだけで、 SetDetailsOfというメソッドは存在しないので書き込みはできない それで探してきたのが、 MSI.DLLにあるMsiSummaryInfo系のAPIなんですが、
916 :
デフォルトの名無しさん :2011/04/17(日) 00:00:54.44
まず、「サマリーデータ」のハンドルを取得するのに APIの宣言で、 Private Declare Function MsiGetSummaryInformation Lib "MSI" _ (ByRef hDatabase As MSIHANDLE, _ ByVal szDatabasePath As String, _ ByVal uiUpdateCount As Long, _ ByRef phSummaryInfo As MSIHANDLE) As Long ・MSIHANDLEはLongに置き換えました ・ Alias "MsiGetSummaryInformationA" を追加 で、 Private Declare Function MsiGetSummaryInformation Lib "MSI" Alias "MsiGetSummaryInformationA" (hDatabase As Long, _ ByVal szDatabasePath As String, _ ByVal uiUpdateCount As Long, _ phSummaryInfo As Long) As Long としました。
917 :
デフォルトの名無しさん :2011/04/17(日) 00:01:43.70
で、コードは、 Dim h as Long, f as String, r as Long,dh as Long dh = 0 f = "C:\TEST.txt" r = MsiGetSummaryInformation(dh, f, 0&, h) これを実行すると戻り値r=6、でハンドルhは0が返ってしまい、正常に動作していません 何故だか判る人いますか?
918 :
デフォルトの名無しさん :2011/04/17(日) 00:23:48.39
参考までにShell.Applicationのを。 これで、タイトル、コメント、作成者とか色々と出てきます Dim shl, fld, i% Set shl = CreateObject("Shell.Application") Set fld = shl.NameSpace("C:\Folder\") For i% = 0 To 50 Debug.Print fld.GetDetailsOf(, i%) + ":" ; Debug.Print fld.GetDetailsOf(fld.ParseName("test.jpg"), i%) Next Set fld = Nothing Set shl = Nothing
DSOFile.dll IPropertySetStorage
923 :
デフォルトの名無しさん :2011/04/17(日) 03:49:17.79
MSが配布してるDSOFile.dllをコピーしてRegServしないといけないとか 読むのはいいけど書く場合は、新規の書き込みはできないとか そんなことが書いてあったのでスルーしてましたが、もう一回調べてみます
924 :
デフォルトの名無しさん :2011/04/17(日) 04:42:41.94
>>919-922 う〜ん、難しい!
無理そうなので下記、力ずくでやる方法にします
どうもでした
解析した内容を書いておきます
"C:\test\test.jpg" に対して "C:\test\test.jpg" + ":" + Chr$(5) + "SummaryInformation"
という見えないファイルがあって、ここに概要情報が入っている
最初は存在しないが、概要タブから何か書き込むと作られる
先頭の48バイトはヘッダで内容は固定ぽい
それ以降がデータ部で数値なら4バイトLong型で格納してある
0030にデータ部の長さ
0034に項目数
0038から項目IDと格納位置へのオフセットが登録項目数だけ並んでいる
項目IDとはコメントなら6、タイトルなら2
オフセットが示す格納位置にはデータの型を示す数値、1Eなら文字列らしい
次に、文字列なら長さ、文字列という具合で入っている
926 :
デフォルトの名無しさん :2011/04/18(月) 10:33:10.68
>>925 知りもしないくせに。
以上。
はい次の方。
VB6でコンソールアプリ(コマンドプロンプトで動作する奴)って作れるの?
作れる ググれ
930 :
デフォルトの名無しさん :2011/04/19(火) 18:49:23.40
1)プロジェクトを作成します。 標準EXEを選択します。 2)標準モジュールで「Sub Main」に実行する内容を記述します。 Public Sub Main() End Sub 3)プロジェクト−Project1のプロパティ−スタートアップの設定で「Sub Main」を選択。 作業はこれだけです。結構簡単です。
それは単にフォームが無いだけでコンソールアプリとはいえないな。 参照設定 Windows Script Host Object Model (wshom.ocx) Dim fso As New FileSystemObject Dim txtstm As TextStream Set txtstm = fso.GetStandardStream(StdOut) txtstm.WriteLine "helloあいうえお" txtstm.Close exeが出来たら、コレで仕上げ。 editbin /subsystem:console vbxxx.exe
>>826 この本読んでて思ったんだけど
エラー対処コードを一々完璧に書く手法ってアジャイル(笑)な開発手法と真逆な事をやってるんだなぁ
まぁVB系はその方が生産性も高いしリスクも少ないのかなとは経験上思う事ではあるけど
Windows7でのデータベース(.mdb)のアクセスでたまにフリーズしたかと思うぐらい時間がかかることない?
Win7でVB6は相性悪いって話なの?
Win7は実行は保証されてるが、開発環境は保証されてないし コンポーネントは100%ではないし、DBもAccessのバージョンによってはヤバそうだ。 と思った。
Win8では完全死亡か?
7ですら最初はもうやめるって言ってた気がするが
いい加減切ってくれないと、いつまでもVB6開発を引きずってしまうわぁ・・・
旧型OSとかパソコンとか使ってる会社が全部つぶれてしまえばいいんだ
古いPCは頑丈にできてたからな 今の時点で動いてるならコンデンサ以外はそうそう壊れはしないという
941 :
デフォルトの名無しさん :2011/04/22(金) 16:45:38.00
VBアプリは業務用も含めて大量に出回ってるのと .NETへの移行で互換性がないってことから これからもずっとWindows上で動くようにサポートされるはずだよ
サポートしなくなったら、結局は別言語に置き換えなきゃならなくなるので 仕事が増える事になるはず。サポート終わらせてくれていいよ。
ゼロベースで作らなきゃならんからかなりの資金が必要やろ
何か問題でも?
'Form1 Private Sub Command1_Click() With New Form2 .Show vbModal, Me End With
こういうWithの使い方ってどんな問題含んでる?
947 :
デフォルトの名無しさん :2011/04/23(土) 07:50:22.40
それってForm2.Visible=Falseで戻ってくるようにしてると そのうちメモリ不足になるよね それとなぜWithを使うのか不明
>>947 VB6は参照カウンタ型GCだからメモリ管理は問題ないよ。
内容的には次と同じだね。
Dim hoge As New Form2
hoge.Show vbModal, Me
WithがFormのスコープのように見えてしまうのを
プラスとマイナスどちらに評価するかは知らんけど。
>>948 内容的に、2行で書けるものを3行で書くのは問題だな。
950 :
デフォルトの名無しさん :2011/04/23(土) 11:33:21.52
>>948 そうなんだ
>>945 がなんでボタン押される都度、Form2をNewしてるか想像すると
たぶん、Form2では最後にVisible=Falseで消してるんだね
で、次にForm2をShowした時にLoadイベントが発生しないもんだから強制的にNewしてるに違いない
Form2をUnLoadしないで何回もLoadするのは、
メモリ管理上問題ないようにVBがしてくれるにしても、とても気持ち悪いす
>>949 そういう時にコロンがあるんだよ。
なんでも一行にかける。
>>950 > たぶん、Form2では最後にVisible=Falseで消してるんだね
> で、次にForm2をShowした時にLoadイベントが発生しないもんだから強制的にNewしてるに違いない
それはあなたの想像でしょう?
この文脈では、Form2をshow(load, unload)することはないよ。
showするのはForm2から作られたhogeインスタンス。
withを使っているから、実際には書かれてないけど。
>>950 は、クラスとインスタンス
newとloadの区別が付いてないね。
954 :
デフォルトの名無しさん :2011/04/23(土) 15:12:18.92
>>952 そう、想像なんだけど、
Form2は参照しただけでインスタンスが作成されるのに、なぜわざわNewしてるのかという点。
それはForm2を使い終わった後でUnLoadしてないから(想像)
そうすると次にボタンを押した時にNewがないとForm2は表示するけど実行させたいLoadイベントが発生しない
で、メモリ不足を危惧したけどVBはシングルタスクだから
UnLoadせずに、何回インスタンスを作成しようが新たにメモリは食わないと
955 :
デフォルトの名無しさん :2011/04/23(土) 15:16:35.67
956 :
デフォルトの名無しさん :2011/04/23(土) 15:45:24.10
今やってみた >UnLoadせずに、何回インスタンスを作成しようが新たにメモリは食わないと これは訂正 いくつでもインスタンスは作成されちゃうよ で、振り出しに戻るけど hoge.Show vbModal で実行が戻って来るのは、hogeをUnLoadするかVisible=Falseした場合。 hogeを毎回Newしてるのはhoge.Visible=Falseにして戻ってくるからに違いない なら、ボタンを押すごとにhogeの新たなインスタンスが作成されてメモリ不足になるだろう (Newしなければ新たなインスタンスは作成されない)
957 :
デフォルトの名無しさん :2011/04/23(土) 15:51:27.64
すまん訂正 故意にhogeを複数出したいという意図なら問題ないや
ModelessなForm2のインスタンスが別に存在して Newして別のForm2のインスタンスが欲しいとか?
> hogeを毎回Newしてるのはhoge.Visible=Falseにして戻ってくるからに違いない だからなんで決め付けるのさ? Form2のインスタンス側でフォーム閉じたかForm2にあるボタンで Unload meしているかもしれんだろ。というかそっちの方が自然。 vbModalなんだから、何度もForm2がつくられることはない。 (つくろうと思えば可能がだ、自然な作り方ではない) だからメモリ不足にもならない。 new使ってるのは、Form2が閉じられたらメモリを解放したいからとか ボタンをおすたびにForm2を完全に0から作りたいからだろ。 (initializeで何かの初期化をしたい) それに複数インスタンスを生成することも可能。 使用するときに毎回newして要らなくなったら完全になくなるほうが 柔軟で自然で分かりやすいだろ withを使う書き方が気持ち悪いが、書き方の問題だけでコード上は問題ない。
Dim hoge As Form2 と Dim hoge As New Form2 同じって話じゃないの? With Form2にしようがWith New Form2にしようが内部処理かわんないでしょ?
つ 実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。
> Dim hoge As Form2 > と > Dim hoge As New Form2 > 同じって話じゃないの? 違う > With Form2にしようがWith New Form2にしようが内部処理かわんないでしょ? 違う With Form2 が動くのは Dim Form2 As New Form2 という定義が見えないところにあるわけで、 これはDim hoge As Form2 とも Dim hoge As New Form2 とも違う。
>>961 なるかなあ。
VB6は暗黙の宣言みたいなの、フォームにはあったよね?
暗黙の宣言とやらがどういうものか言ってみ。
VB6は、フォームの場合、newしなくても Form2.show とかしても、フォームが現れちゃったと思うんだ。 マイクロソフトはこの方法を推奨してたかもしれない。 けど、インスタンスの生成を明示的に行わない方法は個人的には嫌だ。
>>960 Dim hoge As Form2 で宣言したあとに、Newしないって前提か?
>>962 明示的にNewしたのに既定のインスタンスが戻ることがあったような気がする
状況によっては、Dim hoge As New Form2 が同じものになることがあるぞ
>>963 既定のインスタンスとか呼ばれてるやつな
そして、既定のインスタンスはVBのバージョンによって動作が違う
1回目のNewしたときに既定のインスタンスが戻る時もあったりなかったり
967 :
966 :2011/04/24(日) 22:55:22.40
VB.NETの話と勘違いしてた 既定のインスタンスがあるのは間違いないが、動作周りの話はちょっと違うかも
Dim hoge As New Form2
こう書いちゃうと、hoge を参照するたびに
If hoge Is Nothing Then
Set hoge = New Form2
End If
が実行されてしまう。
>>966 VB.NET でもそんなことあるわけネー
なんかコーディングミスしてるだろ。
>>951 いつも思うんだけど
ラベルを書くときどーすんの?
ラベルがあっても1行で書ける?
ラベル含めて一行で済ませたいやつなんているのか。ここまでくるとPerlの省略の美学に通じる物があるな Perlは省略されまくっている上に同じ文でもいくつか書き方があるから何が書いてあるのかすぐに理解できない
971 :
969 :2011/04/25(月) 12:46:55.32
>>970 いや、VBなら1行で書けるってよく言われるからさ
じゃあラベル含めて1行で書けるの?って思ってさ
よく言われる?
1行で書けるってCとかJAVAじゃないの
VB6は規定のインスタンスがあったり、画面にペタペタコントロール 貼りつけたりするだけでそれなりに動作するものが出来てしまうから OOPわかってない初心者でも取っつき易いんだけど それのせいでわけのわからん動作がある。 逆にそれが初心者にOOPをわかりづらくしている。 ということで、インスタンスは明示的に。
みなさんのアドバイスのおかげでVB6+DirectXでサウンドメーターが無事作れました。ありがとうございました。
>>975 どなたか存じませんが、どういたしまして。
> ということで、インスタンスは明示的に。 たしか、Initializeあたりに、 If Me Is Form2 Then Err.Raise 適当なの End If ってすればForm2変数を使えなくできたはず。 (Isで参照しただけではForm2はNewされなかったはず) 逆にNotを付ければ、Form2変数だけ使えるようになる。 これ入れておくといいかもね。
Dim Form2 As Integer
>>977 参照しただけで New されるぞ。
デフォルトのインスタンスを禁止するなら
Private Sub Form_Initialize()
Set Form2 = Nothing
End Sub
とする。
このスレで良いのかよく解らないんだけど。 Scripting.FileSystemObjectって一つ作っておけば良いのかな? ちょこっと作ったのがあるんだけど、3つのファイルそれぞれにつくったんだけど、そんな事しなくても良いのかな? まぁ試してみればイイじゃん?って話なのだろうけど、本当の所どうなのかと思って。 身近にそういう事に答えてくれる人が居ないんで。 Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set File1 = fso.GetFile("C:\file1.txt") Set File2 = fso.GetFile("C:\file2.txt") Set File3 = fso.GetFile("C:\file3.txt") フツーは、こうなのかな?
まぁ試してみればイイじゃん?
>>980 されないよ。
Newされるのは、Formのプロパティを触ったとき。
スミマセン。いきなり
>>981 で高度な質問をしてしまってご迷惑でしたか。
もっと、頭の良い人の居る所で質問しなおします。
何の意味もないプライドを傷つける様な事をしてしまってスミマセンでした。
でわ、誰も聞いてない罵詈雑言をお好きなだけ書き込むという意味の無い事を楽しんでください。ぺこ <(_ _)>
>>984 >Set File1 = fso.GetFile("C:\file1.txt")
>Set File2 = fso.GetFile("C:\file2.txt")
>Set File3 = fso.GetFile("C:\file3.txt")
質問の意図と合ってるかわかんないけど、これでいいんじゃない?
>WScript.CreateObject("Scripting.FileSystemObject")
これを3つ作るっていうなら、なんでそんな事するのかわからない。
VB6でDIできますか?
>>986 SpringみたいなDIコンテナ…無理だろ
>>987 なんで?
DIの肝は考え方であって、
実装技術はただのファクトリーパターンだと思うけど。
キー(文字列)があって対応表(XML)から引っ張ってきて
対応したクラスをつくるだけ。
でもこれってクラスを参照するためのインターフェースに依存するけどこれは問題ないの?
なるほどSpringというのをググって何となくDIというものが分かった気がする
>>989 正直、この説明ってどうなの?w
ただの多態をなぜもったいぶってDIなんて呼ぶのかこれじゃさっぱり分からん
つまりコンパイルした後でもXMLというテキストファイルをちょちょい弄るだけでアプリケーションの動きを変えられるよう設計してるってこと?
本職でない素人は知らなくていい
>>990 インターフェースならVB6に普通にあるじゃん。
>>994 いや違う。できなくはないだろうけど、コンパイルしたあとで
アプリケーションの動きを変えるのが目的ではない。
モジュール(クラス)間の依存度を少なくするのが目的。
モジュール間の依存度が少ないから簡単にテスト用の
クラスに入れ替え可能になる。
自分で頑張ってそういう仕組みを作ってもいいけど、
他の人が用意してくれたのがある。それがJavaならSpring
>>997 だから、それならただの多態以上の物ではないでしょ。
>>998 多態性は実装技術。DIは(実装技術を使って)つくられた製品。
比べるものが違う。
話が通じてないなあ。 だから、依存性の排除はインターフェイスを使えば自動的についてくる機能に過ぎず、 DIとやらによって初めて得られるものでは全然ない。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。