- PR -

VB6で項目名の定数化を行うには?

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-28 20:22
品番 = "品番"
数量 = "数量"

としておいて、

call 値の取得(伝票列.品番)

のように使えるようにするため、次のようにしています。

コード:
 - 伝票列クラス - 
public property get 品番()
    品番 = "品番"
End Property

public property get 数量()
    数量 = "数量"
End Property

 - 伝票編集クラス -
private 伝票列 as new 伝票列クラス

public sub 何かの処理()
    call 値の取得(伝票列.品番)
end sub



この書き方だと、伝票列クラスに記述すべき項目が大量に生じた場合、記述することがとても大変です。
本来なら、次のように記述したいのですが、

コード:
public const 品番 = "品番"
public const 数量 = "数量"


この書き方は VB6 では不可能です。
かといって、

コード:
案件列モジュール(として)
global const 品番 = "品番"
global const 数量 = "数量"



にするのも手ですが・・・
これは、あまり良い方法ではなさそうです。

皆さんはどうしているのでしょうか?
また、何か良い方法などご存知の方はいませんか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-28 20:55
引用:

R・田中一郎さんの書き込み (2006-05-28 20:22) より:

本来なら、次のように記述したいのですが、

コード:

    public const 品番 = "品番"
    public const 数量 = "数量"


この書き方は VB6 では不可能です。


標準モジュールであれば、可能です。

コード:

    Public Const 品番 As String = "品番"
    Public Const 数量 As String = "数量"


アクセスは、「標準モジュール名.品番」という感じでどうぞ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 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 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-28 22:44
引用:

ちゃっぴさんの書き込み (2006-05-28 22:03) より:

ですが、それだと class module を使う意義が薄くなってしまいますね。


もちろんです。

1 番の理由は「モジュール名」を省略できてしまえることですね。
これだと、見た目のグループ化を強制することができないです。
(これだから、VB の標準モジュールは嫌いですw)

引用:

とはいえ、VB6.0 では class module の定数を外部に公開する方法が限られているので妥協しないといけないでしょうね。


構造体にしてタイプ定義という方法もありますが、手間がかかりますね。

引用:

たとえば、Enum を使うとか。
Enum の場合、class module でも、Public 宣言できますね。


この質問は、「文字列定数をグループ化したい」だと思うのですよ。
列挙体では、文字列定数に対応できませんよね。
それとも、Enum メンバの値で、StringTable のリソースを使うということでしょうか?

おそらく、こちらにある質問の VB6 版といったところです。

  項目名の文字列とインテリセンスと列挙体

今回、リフレクションは使えませんから、項目名 == 値の保証はできません。
が、せめてグループ化だけでもしておきたいということなのでしょう。

# そうであるなら、書いておかないと皆さんが混乱しますよ > 田中さん

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-05-29 00:38
引用:
1 番の理由は「モジュール名」を省略できてしまえることですね。
これだと、見た目のグループ化を強制することができないです。
(これだから、VB の標準モジュールは嫌いですw)



ん〜と。省略できるということを問題にするなら、そもそも列挙型の方がたちが悪いですね。
というのは、class module で宣言しようと列挙型の場合、module name を記述することすら許されませんから・・・

とはいえ、 VB6 なら、私はどっちかというと module を分断されているものよりも、一つの class module にまとめてあるほうが読みやすいですね。
# 流用するのも楽ですし・・・

引用:
それとも、Enum メンバの値で、StringTable のリソースを使うということでしょうか?


まあ、VB6.0 事態にに StringTable がなかったと記憶していますので、そのまま使えないと思っていますが、似たような image でしょう。
とはいえ、そこまでやる必要もないと思っています。

わたしの意見は、VB 6.0 を使う限り、
引用:
とはいえ、VB6.0 では class module の定数を外部に公開する方法が限られているので妥協しないといけないでしょうね。



引用:
とはいえ、掲示された sample ではあえて定数宣言する優位性が低いと思われますがね。


に象徴されるように、無理なのは無理ということで、VB 6.0 ならではの coding 手法に従って記述するべきでしょうということです。
# じゃなければ、素直に .NET に完全移行すればいいでしょう。ということです。

今回の場合、おそらく ADO とかの column を定数定義しておいてということなんでしょうけど、自分で tool を作成して、自動生成を行うんでも無い限り、.NET でできることを legacy の VB でやろうとすること自体、おそらく負荷になっても優位性は無いんじゃないかと思われます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-29 07:20
引用:

ちゃっぴさんの書き込み (2006-05-29 00:38) より:

ん〜と。省略できるということを問題にするなら、そもそも列挙型の方がたちが悪いですね。


確かに、列挙体名も省略できてしまえますね。
型として扱えるという点では、標準モジュールよりはマシだと考えていましたが。
(要素に使う分にはあまり意味はないか...)

しかし、クラス モジュール内に含んでいてもクラス名を省略できるのか... orz

引用:

一つの class module にまとめてあるほうが読みやすいですね。


型が定義 (カプセル化) を邪魔されるのが VB6 のつらいところですね。
ActiveX / TLB を作るのは楽なものではないです。

引用:

まあ、VB6.0 事態にに StringTable がなかったと記憶していますので、そのまま使えないと思っていますが、似たような image でしょう。


StringTable 自体はあります。
StringTable から読み出す関数の引数を列挙体の型にすれば、多少のイメージは合うでしょうね。

# やはり、リフレクションも使えないので、効果より手間の方が高そうです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-29 08:58
じゃんぬねっとさん、ちゃっぴさん、ありがとうございました。

今更な質問で申し訳なかったのですが、今まで何気なく書いているものでも、ふと皆さんどうやっているのかな?、もしかして他に良い方法があるんじゃないかな?、と思う時があります。

今回もそうでした。
(この場は、そういう話もできると認識しておりますので・・・)

僕としては、標準モジュールを使う方法はあり得なかったのですが、.NET でプログラミングを行うようになってから、標準モジュールも標準モジュール名さえ省略しなければ、外部から見て静的クラスのように使えるんじゃないか?

と少し考え方も変わってきていました。

また、複数の標準モジュールで同じ定数名が使われた時は、省略できない(実行時にエラーが表示される)ようですし、自分のコーディングスタイルの中で「省略しない」ことを規則付けていけば良いのかな?と思いました。

結局、このスレの回答を読むうちに、標準モジュールを使うことに何のためらいもなくなりました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)