テキストボックスの制御について

解決


れいこ  2005-02-08 06:14:36  No: 88308

いつもお世話になっております。
環境:VB6.0  WinXP
テキストボックスの制御について質問させて頂きます。

以下のようなテキストボックスを作りたいと思っています。
1、半角の数値のみ5桁まで入力可
2、00012 などの最初が0で始まる数値を入力可
3、もし4桁以下で入力した場合、左0埋めで表示する
      例  012  ⇒  00012

Inputmanと呼ばれるツールをインストールして
コンポーネントで追加したのですが、中々条件に沿う
コントロールが見つかりません。
特に数値のみ入力可のテキストボックスは、0を最初に入力できない点と、
Format関数を使って左0埋めにしても、やはり数値型なため0を
消してしまう点で悩んでおります。

おそれいりますが、ご存知の方にお答え頂けると幸いです。


いな  2005-02-08 06:54:41  No: 88309

あれ?インプットマンならば、
たしか、プロパティにFormat、DisplayFormatってあるよね?
Format関数じゃなくって、
ImNumberではなく、ImTextを使います。


適当主義者  2005-02-08 18:23:00  No: 88310

TextBoxでもできるかも

Private Sub Text1_KeyPress(KeyAscii As Integer)
    
    If KeyAscii = vbKeyReturn Then
        Call ConvText(Text1)
    End If
    
End Sub

'TextBoxを参照渡しすることで汎用性を持たせる
Private Sub ConvText(ByRef vText As TextBox)

    Dim fmt As String

    With vText
        fmt = String(.MaxLength, "0")
        .Text = Format(.Text, tmp)
    End With
    
End Sub


れいこ  2005-02-08 19:19:55  No: 88311

ご返信ありがとうございました。
いなさんの言う通りimTextを使って、Formatプロパティで数値型のみを
指定し、適当主義者さんのコードを参考にして、012 ⇒ 00012 と
変換できました。

本当にどうもありがとうございました。


Dental  2005-02-08 19:21:24  No: 88312

> 'TextBoxを参照渡しすることで汎用性を持たせる
> Private Sub ConvText(ByRef vText As TextBox)

なぜ ByRef(参照渡し) にしてあるのでしょうか?
ByVal(値渡し) で十分な気がしますが……。


適当主義者  2005-02-08 22:12:08  No: 88313

値渡し  :値を取り出して渡す
参照渡し:変数が占めているメモリ領域の場所を渡す


ガッ  2005-02-08 23:20:48  No: 88314

オブジェクトへの参照を参照渡しにしようが値渡しにしようがあんまり関係ない気がするが、
個人的にはメモリコピーよりは参照の方が速いと思うので、参照渡しに一票w


Dental  2005-02-08 23:26:59  No: 88315

>>適当主義者さん
ありがとうございます。
両者の違いは、一応存じているつもりです。KB161308も読んでますし。
http://support.microsoft.com/kb/161308/ja

ただ、今回は、オブジェクトを渡しているですから、
ByRefにせずともプロパティの操作は可能ですよね?

それなのに、あえてByRefを記載しているようでしたので、
その理由をお尋ねしている次第です。


Dental  2005-02-09 00:34:36  No: 88316

ガッさん、ありがとうございます。

個人的には、カプセル化(encapsulation)の原則に沿って、
‘特に理由が無い限り’は、ByVal に出来る部分は ByVal にした方が
良いと思っているのです。

ただ、もちろん自分も、長大な文字列を渡す場合などは、
速度差を考慮して、あえて原則を崩し、ByRef にするケースはあります。
(あとは、配列やユーザー定義型/構造体を渡す場合とかも)

それ故に、適当主義者さんが「あえてByRefを明示した理由」というのが、
コーディング上の都合なのか、速度差にあるのか、もしくはそれ以外の所に
あったのかに興味があるのです。たかが ByRef、されど ByRef ですね。

> 個人的にはメモリコピーよりは参照の方が速いと思うので、参照渡しに一票w
インプロセスの場合に限定すれば、参照型の方が3〜5倍程度高速です。
これは以前、こころさんが実験されており、自分でも確認しています。
http://madia.world.coocan.jp/vb/vb_bbs/200205_02050025.html

しかし今回のケースでは、その速度差は、1回あたりの呼び出し時間が
 0.0000002秒 から 0.0000006秒 に増加する程度の微々たる違いでしたので、
あえてカプセル化の原則を破る理由にはならないように感じました。

さらにいうと、(今回のケースには直接関係ありませんが)これがもし
アウトプロセスで実行される場合は、ByRefが優位という点が逆転し、
ByValの方が高速になる事を確認しています。
http://www.microsoft.com/japan/developer/library/VBCon98/vbconinprocessoutofprocesscodecomponents.htm

さらに蛇足ですが、DCOMのように別PCで実行された場合は、さらに
圧倒的な差が開き、ByRefのパフォーマンスが極端に低下するようです。


ガッ  2005-02-09 03:40:47  No: 88317

Dentalさん、詳しい説明と分かりやすいリンク先を教えて頂きありがとうございます。
で、リンク先に目を通してみた後のレスです。
( ´Д`)<口調変わったな…

VBをやっていて、時々気になっていたのがByRefとByValの修飾に関するVBの内部の動きなのですが、
とりあえず下に書いてあるような知識は知っているつもりでいました(ぁゃιぃ)
・Object型の変数は、VBがインスタンス化したクラスの実体への参照を保存している変数。
  参照型…ともちょと違う"みたい"。
・ByValは、変数の「値」をコピーして渡す修飾"みたい"
・ByRefは、変数の「メモリの位置」をコピーして渡す修飾。
  ポインタを渡す"みたい"?
で、ここでDentalさんから教えていただいたリンクを読むと、
インプロセスコンポーネントをByRefで修飾された引数として渡してやるのと、
アウトプロセスコンポーネントのそれでは、
マーシャリングが行われる/ないといった、取り扱いが異なる印象を受けました。
つまり、ByRefはメモリの位置をコピーして渡す修飾じゃなさそうな印象を受けたわけです。
…ByRef修飾するのはあくまで関数宣言の方なのですから、関数内部に入ってきてからは扱いは同じであるはずです…
………
んー…やっぱり分からん。
orz<モウダメポ..._〆(゜▽゜*)

※文中のところどころにC言語でのメモリポインタみたいな内容のことを書いているが、
  VBのメモリの扱い方とCのメモリの扱い方が一致しているかどうかは不明…
  WinAPIはstdcallだけど…ぁー、わからん。
  そもそもVBの関数は…??

@ByRefに一票いれたわけは、俺としてはByRefを使うと速そうだ、と感じただけです。
私も特に理由が無い場合はByValにしていますが(ぇ

※激しく誤爆…絶対してる。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加