- - PR -
VB6で項目名の定数化を行うには?
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-28 20:22
品番 = "品番"
数量 = "数量" としておいて、 call 値の取得(伝票列.品番) のように使えるようにするため、次のようにしています。
この書き方だと、伝票列クラスに記述すべき項目が大量に生じた場合、記述することがとても大変です。 本来なら、次のように記述したいのですが、
この書き方は VB6 では不可能です。 かといって、
にするのも手ですが・・・ これは、あまり良い方法ではなさそうです。 皆さんはどうしているのでしょうか? また、何か良い方法などご存知の方はいませんか? | ||||||||||||||||
|
投稿日時: 2006-05-28 20:55
標準モジュールであれば、可能です。
アクセスは、「標準モジュール名.品番」という感じでどうぞ。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-05-28 22:03
ですが、それだと class module を使う意義が薄くなってしまいますね。 とはいえ、VB6.0 では class module の定数を外部に公開する方法が限られているので妥協しないといけないでしょうね。 # であるからして、.NET というのが出てきたのですから・・・ たとえば、Enum を使うとか。 Enum の場合、class module でも、Public 宣言できますね。 とはいえ、掲示された sample ではあえて定数宣言する優位性が低いと思われますがね。 [追加] なお、
に関しては自動生成する tool を作成するれば片付くでしょう。 簡単ですし [/quote] [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-05-28 22:14 ] | ||||||||||||||||
|
投稿日時: 2006-05-28 22:44
もちろんです。 1 番の理由は「モジュール名」を省略できてしまえることですね。 これだと、見た目のグループ化を強制することができないです。 (これだから、VB の標準モジュールは嫌いですw)
構造体にしてタイプ定義という方法もありますが、手間がかかりますね。
この質問は、「文字列定数をグループ化したい」だと思うのですよ。 列挙体では、文字列定数に対応できませんよね。 それとも、Enum メンバの値で、StringTable のリソースを使うということでしょうか? おそらく、こちらにある質問の VB6 版といったところです。 項目名の文字列とインテリセンスと列挙体 今回、リフレクションは使えませんから、項目名 == 値の保証はできません。 が、せめてグループ化だけでもしておきたいということなのでしょう。 # そうであるなら、書いておかないと皆さんが混乱しますよ > 田中さん _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-05-29 00:38
ん〜と。省略できるということを問題にするなら、そもそも列挙型の方がたちが悪いですね。 というのは、class module で宣言しようと列挙型の場合、module name を記述することすら許されませんから・・・ とはいえ、 VB6 なら、私はどっちかというと module を分断されているものよりも、一つの class module にまとめてあるほうが読みやすいですね。 # 流用するのも楽ですし・・・
まあ、VB6.0 事態にに StringTable がなかったと記憶していますので、そのまま使えないと思っていますが、似たような image でしょう。 とはいえ、そこまでやる必要もないと思っています。 わたしの意見は、VB 6.0 を使う限り、
に象徴されるように、無理なのは無理ということで、VB 6.0 ならではの coding 手法に従って記述するべきでしょうということです。 # じゃなければ、素直に .NET に完全移行すればいいでしょう。ということです。 今回の場合、おそらく ADO とかの column を定数定義しておいてということなんでしょうけど、自分で tool を作成して、自動生成を行うんでも無い限り、.NET でできることを legacy の VB でやろうとすること自体、おそらく負荷になっても優位性は無いんじゃないかと思われます。 | ||||||||||||||||
|
投稿日時: 2006-05-29 07:20
確かに、列挙体名も省略できてしまえますね。 型として扱えるという点では、標準モジュールよりはマシだと考えていましたが。 (要素に使う分にはあまり意味はないか...) しかし、クラス モジュール内に含んでいてもクラス名を省略できるのか... orz
型が定義 (カプセル化) を邪魔されるのが VB6 のつらいところですね。 ActiveX / TLB を作るのは楽なものではないです。
StringTable 自体はあります。 StringTable から読み出す関数の引数を列挙体の型にすれば、多少のイメージは合うでしょうね。 # やはり、リフレクションも使えないので、効果より手間の方が高そうです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-05-29 08:58
じゃんぬねっとさん、ちゃっぴさん、ありがとうございました。
今更な質問で申し訳なかったのですが、今まで何気なく書いているものでも、ふと皆さんどうやっているのかな?、もしかして他に良い方法があるんじゃないかな?、と思う時があります。 今回もそうでした。 (この場は、そういう話もできると認識しておりますので・・・) 僕としては、標準モジュールを使う方法はあり得なかったのですが、.NET でプログラミングを行うようになってから、標準モジュールも標準モジュール名さえ省略しなければ、外部から見て静的クラスのように使えるんじゃないか? と少し考え方も変わってきていました。 また、複数の標準モジュールで同じ定数名が使われた時は、省略できない(実行時にエラーが表示される)ようですし、自分のコーディングスタイルの中で「省略しない」ことを規則付けていけば良いのかな?と思いました。 結局、このスレの回答を読むうちに、標準モジュールを使うことに何のためらいもなくなりました。 ありがとうございました。 |
1