VB

Got? Lost?

VB

VBがおかしいのか、使用している他人の作った関数の仕様なのか、どうも各コントロールの GotFocus, LostFocus, Validate の動きが予測と違ってこまります。 たとえば、テキストボックスで ENTER キーを押さないでフォーカスを移動した場合、内容を編集前のも…

依存関係

VB

VB では、格モジュールに依存関係を設定するためのコーディングは存在しないのでしょうか?つまり、複数のプロジェクトで使われる Foo.bas があって、それを利用する Bar.bas もあるとき、新しいプロジェクトに Bar.bas を追加してコンパイルしようとすると…

for each は Variant 専用?

VB

列挙可能なオブジェクトに対して列挙を実行する for each 構文ですが、列挙子の型として Variant 型しか受け入れてくれません。動的配列みたいに型が実行前からわかりきってる場合には、その型の列挙子を受け入れてほしいものです。

ショートサーキット

VB

ちょっとは VB の話題も書いておこう。VB の式、論理値の評価は常に完全評価されるようで、ショートサーキット論理評価になれた身にはつらいです。

With の適用範囲は即理解できる程度に

VB

意外にサポートしている言語は少なく、微妙な仕様差がある with ですが、どの言語にしても with の適用範囲が非常に広いコードは読みにくいですね。できれば、一呼吸で読めるような範囲のコードにしか影響がないようにしてもらいたいものです。特に、ネスト…

スペースはただです

VB

これは誰の言葉だったか忘れましたが、VB でコーディングする際の問題点の1つは、かなり強制的な整形機能によるものがあると思います。同じ意味をもつパラメータなんかは、空白を使ってインデントをあわせたりしたいですが、VB はパラメータの前後の空白を…

Package and Deployment Wizard

VB

名前をきいてもピンとこない人がいるに違いないが、和名をディストリビューションウィザードという。 VB6のインストール先には、前述の c2.exe などのような機能が非公開なもの以外にもいくつかのファイルがあり、その1つがディストリビューションウィザー…

VisualStudioでVB

VB

たぶん、検索すればまとまった設定例が見つかるのではないかと思うのです。VB6 のインストール先を覗くと c2.exe だの link.exe だのが配置されていて、なんとかしてコンパイラ環境として登録できそうな雰囲気があります。ですが、手軽に登録するなら vb6.ex…

Breakpoint はどこ?

VB

仕方なく(?)、VBでトレースしてるわけですが、途中で処理の区切りとして設定したブレークポイントがありまして、その部分を参照しようとしたら・・・どこに設定したか覚えてなくて見つからない! ブレークポイントの一覧も出せない*1し、ブレークポイント…

グローバルスコープ

VB

Visual Basic では、クラス構成以外の個々のソースコードが1つの名称空間を共有します。このため、標準モジュールで安易に Public として変数や関数を作成してしまうと、それはプロジェクト全体から利用可能なグローバル変数・グローバル関数になってしまう…

Nothing ?

VB

昨日の日記に書きたかった内容ですが、文章を組み立ててる時間がなくてさっさと寝てしまいました。Nothing 自体は、何度も見ました。多くの場合は Set obj = Nothing というようなかんじで、対象オブジェクトの参照カウンタを減らすために代入されています。…

動的配列から Collection へ

VB

いろいろな方法がある中で、今回は型チェックができて実装が簡単な Collection をメンバーにもつクラスを作成することにしました。元のコードは Public Type MyType Name As String Datum As String Value As Long End Type ' Dim ary() As MyType と宣言し…

Collection を使おう

VB

前述の動的配列は、昨日の日記でも触れたようにちょっと入り組んだメンバー構成をしており、変更内容が多大になるためコスト的に修正を見送りましたが、もう1つ別のユーザ定義型が同様に要素を後ろへ追加する動的配列であり、メンバー構成が非常に単純なの…

動的配列がロックアウトされている

VB

前述のコードは十数分で破棄されました。インデックスのエラーを解消したので、関数全体は正常に稼動するかに思われましたが、今度は配列のロックアウトエラーというものが発生しました。 VB の配列は OLE の SafeArray として実装されていることは事前に知…

Variant とユーザ定義型

VB

VB は基本的にすべての値を Variant で扱おうとする言語です。型に厳しいのかどうかが言語の優劣を決めるわけではないのですが、現在の VB は型を意識した機能と Variant を意識した機能が入り混じっており、結果としてプログラム言語として扱いにくいかんじ…

PUSHとLSet

VB

ユーザ定義型の動的配列に、どんどん新しい要素(レコード)を追加していきます。いわゆるPUSH*1の作業だが、 For i=0 To 300 ReDim Preserved ary(0 To UBound(ary)+1) ary(UBound(ary)).member = ... Next i とか、さすがにコレは ReDim Preserved ary(0 T…

デバッグテクニック

VB

VB に関する内容を含んだ書籍は手持ちにもたくさんある。それらの VB に関する内容はよほど興味がない限りはスルーしてきたのだが、ここ数日はすぐに役に立ちそうだと思われるコラムや連載をいくつかパラパラと目を通しなおしている。 それらでは、ほとんど…

New TypeLib.CoClass は何を実行する?

VB

この問題は、Visual Basic の魔法に騙された気分になれました。 フォームにボタンをおいて次のようなコードを書きます。 Private Dim AppleWithPoison as New Fruit.Apple Private Dim AnApple as Fruit.Apple Private Sub Command1_Click() Set AnApple = A…

Erl

VB

VB6で、この Erl という単語に対して F1 を押してヘルプを参照しようとすると、なぜか Err というオブジェクトのヘルプがでる。 この Erl というオブジェクトはヘルプでは調べることができないが、デバッグには有用なオブジェクトで、例外が発生した時の行番…

相対パスの保存がおかしい?

VB

ファイルメニューから実行イメージの生成を選び、保存先を指定する。 例えば、D:\Projects\Product1\Project1\Project1.vbp のコンパイル結果を直上の D:\Projects\Product1\ フォルダに保存する。すると、VB はプロジェクトファイルに Path32=.. という記録…

実行時のフォルダを指定する

VB

Visual Basic を使ってデバッグを行おうとして、最初に困ったのがコレだ。ほとんどの開発環境にはデバッガを実行する際のオプションとして実行イメージのファイル名と、その実行イメージを実行する際の cwd*1 を指定することができるようになっているのだが…