VBプログラマ質問スレ(6.0以前) Part39
888 :
デフォルトの名無しさん:04/12/09 22:09:58
>>885 いや、確かそうとも言い切れないケースがあったはす。
確か参照渡しの引数を一つ取る関数を括弧をつけて呼び出すと、
括弧をつけたことにより変数の参照ではなく値が渡されてしまい
期待するのと違う結果になる、みたいな話だと思ったが。。
VBに限らないけど、プログラミング言語ってちょっと触ってないと
どんどん忘れていくな。
>873
>873
ExcelのIF関数と同じと思えばいいのかな?
括弧をつけない
MsgBox "hoge"
MsgBox "hoge", vbOkOnly
MsgBox ("hoge") ←───
MsgBox ("hoge"), (vbOkOnly)
括弧をつける
Call MsgBox("hoge")
n = MsgBox("hoge", vbYesNo)
n = MsgBox(("hoge"), (vbYesNo))
>871
WHERE句の最初に必ず満たす条件を
つけとけば判定1回づつで済まない?
例:
strSQL = "SELECT * FROM TABLE"
strSQL = strSQL & " WHERE 1 = 1"
If A <> "" Then
strSQL = strSQL & " AND " & SQL条件文1
End If
If B <> "" Then
strSQL = strSQL & " AND " & SQL条件文2
End If
IIf はパフォーマンスが悪いのも問題だが、
IIf(x = 0, 0, 1 / x)
みたいな書き方ができなくて不便でもある。
>893さん
なんでできないの?
>>894 上で散々話題になってるじゃん。
IIf って結局ただの引数が3つの関数だから、
関数に値が渡されるときに x = 0 のときでも、1 / x まで評価されて
0 除算エラーになってしまう。
>>892 SQL文に余計な条件をつけることで、万が一にパフォーマンス等に影響があったら論外なのでパス。
完全なプログラマ都合じゃん 1=1なんて。
テキストボックスに入力したファイルパスが存在するか調べるにはどうしたらよいですか?
c:\test\test.txtのように入力したときとかです
898 :
デフォルトの名無しさん:04/12/10 10:49:02
500とか600の値を時間としてh:nn:ssの形式で表示させていのですけど、
どうすればいいのでしょうか?
>>897 InstrRevで一番右の¥位置を取って、それより左をフォルダパスとして保持。
Dir関数で第二パラメータにvbDirectoryかなんか指定。
>>898 数値は何の値?秒数?文字列?(500は500秒?、5:00?)
900 :
デフォルトの名無しさん:04/12/10 11:04:18
60*60で割った商がH、60で割った商がM、60で割った余りが秒。
VBコードを変換したいのですが正規表現で置換しようと
思っていますが妥当でしょうか?アドバイスよろしくお願いします
<次の文字列は右のように変換する>
MLdbdata(hDBProc, 1) -> rs1.Field(0).value
MLdbdata(hDBProc2, 10) -> rs2.Field(9).value
法則1hDBProcはrs1に読み替える
法則2hDBProc1,10の10は常に-1する
>>904 すでにVBの話じゃないよな? 妥当? 好きなようにやればいい。
>905
わかった。ありがとう
秀丸板さがします
>899
解雇
┐(´-`)┌
マルチスレッドでグローバル変数の値を読んだり書いたりする際に
注意すべきことってありますか?
ADOである名前のテーブルが存在するかどうかはどうやってしらべるのでしょう?
SQL="Table Exist('NorthWind')"
conn.execute(SQL)
みたいなものだと予想してます
>910
え?
>>910 ADOXを使うとか。
ADODB.ConnectionオブジェクトのOpenSchemaメソッドを使うとか。
自己解決してたけどどーも
Const adSchemaTables = 20
rc = conn.openschema(adSchemaTables)
で、データベース内のいくつものテーブル名はコレクションとしてとりだされるから
rc("TABLE_NAME").valueをさらにFor EachとかDo whileで1個ずつとりだせた。
do until rc.eof
S+=rc("table_name").value
rc.movenext
loop
debug.print S
>913
さすが
>>909 VBのバージョンは?マルチスレッドの実現方法は?
>915
VB6.0で、実を言うとマルチスレッドと言うか、1つは
DLLからのコールバック関数で、もう1つはタイマーイベント
なんです。そもそもこれってマルチスレッドって言うんですかね。
>>916 スレッドのIDを表示させてみたら分かる。
>>916 開発環境はOKで、コンパイルするとNGってパターンじゃない?
そもそもVB6は普通のマルチスレッドには対応してなかったと思う。
「動く時はある」だろうけど、やっちゃいけないことではないかと。
VBのマルチスレッド処理は昔のVBマガジンにある。(前世紀かも・・・。w)
あと、PCDNとかでサンプルあるかもしれん。
マルチスレッド、出来る出来ないは出来る。でも、わざわざVBでやらんほうがいい。
>919
タイマ使ったらそれだけでマルチスレッドではないの?
>921
マジで。タイマーたくさん作ったらそれぞれ別スレッドで動いてると思ってた。
Windowsのメッセージについてきちんと勉強したほうが良いと思う。
それと、VBのDoEventsと、一般基礎知識としてのプロセスとスレッドの勉強。
>923
そかー。サンクス
>>922 だから、スレッドのIDを表示させてみろって。
>925
どうやるの?
>>926 GetCurrentThreadId
> 解説
> スレッド ID は、そのスレッドが終了するまで、システム上でユニークな(一意の)値となります。
>927
ありがとう。確かに一緒でした。
>927
DLLからのコールバックはスレッドIDが別でした。
というのもDLL内でスレッドを起動しているので当たり前なのですが・・・
というわけでやはりマルチスレッドなのですが、グローバル
変数を読み書きする際に注意する点はあるでしょうか。
>>929 マルチスレッドは、複数の処理が同時に進行する。
例えばグローバル変数を G、ローカル変数を L とするとき、
L=G
L=L+1
G=L
が2つのスレッドで同時に処理されたとしたら、Gの最終的な値は保証できない。
(2人の人間に上記の処理をさせたことを想像してみるといい)
簡単な指針としては、グローバル変数の値を変更するときは
InterlockedIncrement 等の Interlocked 系 API を使う。
処理が複雑で、これらの API を適用できないときは
処理の前後を EnterCriticalSection と LeaveCriticalSection で囲む。
パフォーマンス低下やデッドロックにならないよう使い方に注意すること。
それにしても、VBでやることじゃない気がする。
>931
ありがとうございます。InterlockedExchangeでうまくできそうです。
>932
色々事情がありまして・・・
とにかくありがとうございました。
934 :
デフォルトの名無しさん:04/12/12 14:01:03
31×31の配列idata(i,j)にあるデータをランダムアクセスで
書き込み、読み込みをしたいのですが、これで書き込みしたのを読み込みできません。なぜでしょうか?
Sub failsave()
Open "c:\back.bin" For Random As #1 Len = LenB(idata(1, 1))
For i = 0 To 30
For j = 0 To 30
k = 1
temp = idata(i, j)
Put #1, k, temp
k = k + 1
Next j
Next i
Close #1
End Sub
935 :
デフォルトの名無しさん:04/12/12 14:07:08
>>934 プログラミング以前だね。
まず人に読んで理解してもらえるよう文章を推敲することを覚えるべきだ。
そういうの「片手落ち」って言うんだよ。
演算子\と/はどう違う?
>>934 読み込みが失敗してるなら、
読み込み部分も提示しなきゃどうしようもねぇだろ。
エラーがでてるのかどうなのかも書いてないしな。
っていうか、Option Explicit入れてエラーが出ないコードにしてから
出直して来いって感じだな。(たぶんその辺じゃないかと思うけどさ)
片手落ちっていうか9割落ちだな。必要な情報が1割もねぇ。