2009/07/30

[VB6]久し振りのVB6

ちょっとしたヘルプでVB6を書いてきました。

久し振りの実装だったのでVB6でも文句も言わずウキウキやるぞー!

と思っても実装開始後文句がいっぱい!
それでも久し振りの実装だから笑顔で文句だけどね。


VB6への文句集



ホイールでころころさせろ!

IDE開いて既存ソースを見てて違和感。

あん?マウスで画面がスクロールしないぞ!?
マウスの調子がおかしいわけでもないし・・?

Google先生に聞いてみると、VB6のIDEじゃ
ホイールロールイベントが使えないらしい!!!
なんてことだ!

結局本家MSのサイトでマウスロールに対応させる
KBが置いてたので導入
VB6でマウスころころKB

どうでもいいけどKBってknowledge-Baseの略だったんだね。

Collectionは爆発しろ!

ほのかに覚えているVB6の実装の記憶じゃ
CollectionとrecodeSetを使って、
DBから取得してイテレータ的なことをしていた記憶がある。

Keyを使って登録できるということでHashMap的に使えるのかと思ったら。

だまされた!

Key一覧を吐き出せないじゃないか!

Indexでしかアクセス出来ないならKeyで登録する意味が分からない!

さらに意味がわからないのはそのIndexが1から始まることだ。

PCでIndexを振る場合は0からと相場が決まってるだろぉ!

何度Indexエラーを起こしてしまったことか!
(私が悪いんですけどね、はい)

従来のFor文だと

For i = 0 To Dictionary.Count - 1
    なんか処理
Next i

となっちゃうのが

For i = 1 To Collection.Count
    なんか処理
Next i

になるから - 1 書かなくていいからスマート!
とかでも考えたんだろうか?
なんてことだ!

結局、参照設定にMicrosoft Scripting Runtimeを追加して
Dictionaryを使うことでHashMap使いたい病は克服できた。

StringBuilderなりStringBufferなり実装しろ!

SQL作成処理でよく見るのは

StringBuilderなりStringBufferなり使用し、
長い(大抵とても長い)SQL文をガチガチと連結させて、
最終的にString化し、
クエリ発行メソッドに渡すといったものだが、

困ったことにStringBuilderがない。


Javaだろうが.NETだろうが絶対にあるStringBuilderがない。

既存ソースを見ていると、
Stringをガチガチ"&"で繋げている。

大抵の関数でStringはイミュータブルなので、
長い文字列を連結させる処理なんて書いた日にはメモリがえらいことになる。

いくら富豪プログラミングの時代とはいえ、
コーダーとして許せるものではない。

何かないか?何かないか?と探すと
ワンクマの人が自力でStringBuilderを作っていた。
いや、そうじゃないんだ。そんな面倒なことはしたくない。

結局何が起こっているかといて、
何を嫌がっているかというと、

Dim s as String
s = "hoge"
s = s & "fuga"
s = s & "hoga"

という処理がVB6上にあった場合。
まず最終的に出来上がるのは"hogefugahoga"といった文字列
出来方は

  1. s = "hoge"
    1. メモリ領域Aにhogeが登録される
  2. s = s & "fuga"
    1. メモリ領域Bにhogeが登録される
    2. メモリ領域Bにfugaが追加される
  3. s = s & "hoga"
    1. メモリ領域Cにhogefugaが登録される
    2. メモリ領域Cにhogaが追加される

となんか無駄な処理が挟まっていますよね。赤字ね。

結局、連結のたびに既存の文字列を
新規メモリ領域にコピーしてるのがいかんのですよ。

少量の文字列なら問題はないけど、
長いSQLを処理すると遅さを実感できると思います。


最終的に配列を使って逃げました。

上記コードを配列を使って改造すると。

Dim s as String
Dim SB(3) as String

SB(0) = "hoge"
SB(1) = "fuga"
SB(2) = "hoga"

s = Join(SB,"")

こうすることで、無駄なコピー連打を防ぐことが出来るはず。

TrueDBGridも爆発しろ!

最後に今回一番難所だったのがTrueDBGrid
GrapeCity製のVB6のグリッド拡張なのだが、
まぁ、面倒だった。

もう触ることは無いと思うけどFAQ方式で困ったことを書いておく。

レイアウトファイルが新規生成出来ないんだけど?

TrueDBGridオブジェクトのプロパティのlayoutNameにレイアウト名
LayoutFileNameにパス+作成したファイル名を書く。
(パスは相対でも絶対でもどちらでも)

次にデザイン画面でグリッドを右クリックして[編集]

編集モードに入ると、グリッド右クリックで
[レイアウトの保存]が出来るようになる。

チェックボックスがうまく動かないんだけど?

DataSourceがstorageになっているか?
storageじゃないとうまく動かないっぽい。
後、その場合はXarrayオブジェクトを使用して
画面の制御をする。



はふー全部吐き出したらすっきりしたよ。

今回何が問題だったかって、

実装してから大分年月がたっていたので
標準化資料が紛失していたこと。
さらに拡張機能の使い方も紛失していたこと。

今度から過去案件の改修プロジェクトに入る時は
このあたり注意していこうかな。


2009/07/01

[日記]28歳になりました。


28歳になりました。
そんだけです。

嫁さんから誕生日プレゼントに香水をもらいました。
二人の気に入りブランドのGAULTTERの香水です。



ついに30まで後2年となりました。
とりたい資格やら、達成してない目標やらたくさん残しています。
家庭に仕事にこの香水つけて頑張っていきたいと思います。

しかし、誕生日プレゼントが香水とは
結構サプライズですよ、
なんかもらった袋軽いなーっと思ってあけたら
香水・・・おお、これは嬉しい。

こういったサプライズが出来る人間になりたいものです。