DOBON.NET DOBON.NETプログラミング掲示板過去ログ

(削除)

この記事は(投稿者)削除されました
■No7362に返信(smithさんの記事)
> 最初は出ないのですが、
> 数日間にわたり何回もVBを再起動しながら複数フォームがあるアプリを作っていると、ある日、
> 「ターゲットの型からプリミティブな型に拡張できません。」
> というエラーがタスク一覧に表示されるようになるのですが、このエラーは何なのでしょうか。
> エラーの行は0で、プログラム自体は普通に動くので特に支障はないのですが、
> フォームが増えてくると同じようなエラーが各フォームに対して1つずつ出るようになってくるので、
> とても気になります。

http://db-appli.com/xoops/modules/newbb/viewtopic.php?post_id=591&topic_id=315&forum=4
> http://db-appli.com/xoops/modules/newbb/viewtopic.php?post_id=591&topic_id=315&forum=4

元記事は間違えて削除してしまったのですが、
なぜPasswordCharに全角文字を指定してはいけないのでしょうか。
きちんと全角でも動作します。
ただ、作成したアプリをWindows ME上で動作させたとき、
どのような文字に設定されていても「*」になってしまいますが。
■No7364に返信(smithさんの記事)
> 元記事は間違えて削除してしまったのですが、
> なぜPasswordCharに全角文字を指定してはいけないのでしょうか。
> きちんと全角でも動作します。
> ただ、作成したアプリをWindows ME上で動作させたとき、
> どのような文字に設定されていても「*」になってしまいますが。

「プリミティブ型」とは何なのかをご存知でない?
2004/11/14(Sun) 11:01:39 編集(投稿者)

> 「プリミティブ型」とは何なのかをご存知でない?

すみません。初心者なので、「プリミティブ型」の意味自体分かりません。
一応ヘルプを見てみましたが、なぜ全角だとだめなのかが理解できませんでした。
1バイトしかだめだから2バイト文字はだめということなのかもしれませんが、
少なくともXP上では全角でも使えているわけですし、なぜエラーが出るのかが分かりません。
#茶々入れにしかならないかも知れませんが横槍失礼します。<微妙に話が見えてません(^_^;)

> 1バイトしかだめだから2バイト文字はだめということなのかもしれませんが、

 PasswordChar プロパティに設定するのは Char なので、そういう概念はありません。扱ってるのは Unicode 文字−全て 2 バイト−ですから。

 で、今回の場合。プリミティブ型に拡張できないというのは Char 型に変換できないという認識で概ね問題ないかと。
#不味いようでしたらどなたかご指摘くださいませm(__)m


> 少なくともXP上では全角でも使えているわけですし、なぜエラーが出るのかが分かりません。

 NT 系で使えるのに 9x 系で使えない(或いはその逆)ということは普通にありえますから‥‥で済ませようと思ったのですが、どうやら OS による違いはなさそうですね(ーー;)
<少なくとも(この件に関係しそうな) EM_SETPASSWORDCHAR や ES_PASSWORD については。

 実際に何を設定してエラー(警告?)になっていたか判らないのでなんともですけど、 OS によって文字コードの扱いが異なるのではないでしょうか。
以下の内容など参考になるかも知れません。
#全くの的外れかもですが(汗)

文字コードのはなし
http://mlang1.osaka-gaidai.ac.jp/~tagengo/multi/char_code.html

既存の日本語文字コードと Unicode の間のマッピングルール
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/
PasswordCharには「●」(鍵かっこ含まず)を設定していますが、
設定直後は何も起こらず、
ビルド後、VBを再起動するとPasswordCharプロパティが未設定に戻り、
タスク一覧にエラーが表示されるようになるようです。
VB再起動後デザイナでそのTextBoxに触れてしまうと次回ビルド時に完全に設定が無効になります。
触れなければ未設定に戻っていても設定は無効にならないようです。
(変更点のみをビルドするようにVBが設計されているからだと思いますが。)
試しに「あ」と設定してみましたが、現象はまったく同じでした。

なので必要がなければ触れないようにすれば、エラーは気になるが使えるという状況なのですが、
やはり9x系Windowsでは何に設定しても「*」になるようです。
9x系にはPasswordCharは有効か無効かの判別しかできないのかもしれません。
.NET Frameworkプラットフォーム上なのに不思議な気もしますが。
この辺はWindowsAPIに依存しているのでしょうか。

私はVB.NET2002なので、この現象はVB.NET2003でも発生するのか利用者に聞いてみたところ、
「同様の実験を行ってみたが、VBを再起動しても設定はそのままだった」とのことです。
ただ、その人は全角文字で実験したのかがよく分かりませんが。
まずはお詫びを。
 すみません。先のカキコの際、オオボケかましてたことに気付きました(汗)

 メッセージの定義以前に、 SendMessage で使用してる文字コードが 9x 系と NT 系では違うんですよね。<知識が乏しいので誤った認識をしてるかも知れませんが、前者は通常 SendMessageA を、後者は通常 SendMessageW を使用するものと理解しています。

 加えて 9x 系での EM_SETPASSWORDCHAR では ASCII コードしか認識しないようでした。
#少なくとも自宅の 98SE で実験した限りでは。 Me は環境が用意できないの不明ですがm(__)m

 これらを踏まえると。
> この辺はWindowsAPIに依存しているのでしょうか。
ということになるのでしょうし、
> 1バイトしかだめだから2バイト文字はだめということなのかもしれませんが、
> 少なくともXP上では全角でも使えているわけですし、なぜエラーが出るのかが分かりません。
に対する答えにもなるのではないかと思うのですが、如何でしょうか?

 生憎公式文書から記述を見つかられなかったので推測(憶測?)の域を出ませんし、根本的な解決にはならないのですけど‥‥。



 ところで
> やはり9x系Windowsでは何に設定しても「*」になるようです。
> 9x系にはPasswordCharは有効か無効かの判別しかできないのかもしれません。
とのことですけど、これは全角文字についての話ですよね? それとも半角英数文字の設定もできないということでしょうか?
>  まずはお詫びを。
>  すみません。先のカキコの際、オオボケかましてたことに気付きました(汗)

私は初心者で何も分かっていないので、私は気にしていませんw

>  メッセージの定義以前に、 SendMessage で使用してる文字コードが 9x 系と NT 系では違うんですよね。<知識が乏しいので誤った認識をしてるかも知れませんが、前者は通常 SendMessageA を、後者は通常 SendMessageW を使用するものと理解しています。

SendMessageを使用する場合、XPは9x系に互換を持っているため、
私はいつもSendMessageAで統一しています。
NTや2000でこのプログラムを動かすとどうなるのか知りませんが、
その辺は.NETがなんとかしてくれると信じたいw
(問題が発生したら、またはNT系だと判別したら自動的にSendMessageWになるとかw)

>  加えて 9x 系での EM_SETPASSWORDCHAR では ASCII コードしか認識しないようでした。

やはり9x系はASCIIのみですか・・・
たしか、何かのソフトで、Unicodeを使っているから9x系で動かすと文字化けするとかいうのがあった気もしますし。

>>少なくともXP上では全角でも使えているわけですし、なぜエラーが出るのかが分かりません。
> に対する答えにもなるのではないかと思うのですが、如何でしょうか?

「一部のWindowsではこの設定は反映されませんよ」という警告なのでしょうか。
それなら正直にそういう警告にしてほしいw
それに、VBを再起動すると未設定に戻るのもやめてほしいw
あと、各フォームに対してエラーが出続けるので、
すでに見たエラーは今後出ないようにとかできるようにしてほしいw
常に3個くらい同じエラーが出続けていてすごくうっとおしいし、
他のエラーが見づらいw

>>やはり9x系Windowsでは何に設定しても「*」になるようです。
>>9x系にはPasswordCharは有効か無効かの判別しかできないのかもしれません。
> とのことですけど、これは全角文字についての話ですよね? それとも半角英数文字の設定もできないということでしょうか?

全角でしか実験していませんでした。
自分はXPしか持っていなく、親が一台だけMEを持っているので、以前実験させてもらったのですが、
めったに触らせてもらえないので、また触らせてもらえれば半角での実験もしたいです。
>> 加えて 9x 系での EM_SETPASSWORDCHAR では ASCII コードしか認識しないようでした。
> やはり9x系はASCIIのみですか・・・

 XP では SendMessageA を使っても ANSI (というかシフト JIS )コードとして 0x100 以上の値も認識してくれたんですけどね。 98SE では駄目でした。

 で、直接は関係ないようですけど次のような記述をみつけました。 PasswordChar についても似たようなことなのかも知れません。
#やっぱり的外れかも知れませんけど(^_^;)

エンコード方式および Windows フォームのグローバリゼーション
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconunicodecharacterdisplayinwfcprojects.asp


> 「一部のWindowsではこの設定は反映されませんよ」という警告なのでしょうか。
> それなら正直にそういう警告にしてほしいw

 んー、根本的な原因は別のところにありそうな気がするんですけど‥‥どうなんでしょう(ーー;)


> すでに見たエラーは今後出ないようにとかできるようにしてほしいw
> 常に3個くらい同じエラーが出続けていてすごくうっとおしいし、
> 他のエラーが見づらいw

 流石にそれは無理でしょうw<見たら出ないように

 ですが、近いことはできますよ。
 このエラーはチェック可能ですよね? タスク一覧の表示にチェックをつけて、未チェックのもののみ表示するようにしてあげれば良いと思います。
#でもビルドする度に同じ手順を踏まないといけないのかも。<試したことないので(^_^;)
> エンコード方式および Windows フォームのグローバリゼーション
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconunicodecharacterdisplayinwfcprojects.asp

これかもしれませんねぇ〜

>  ですが、近いことはできますよ。
>  このエラーはチェック可能ですよね? タスク一覧の表示にチェックをつけて、未チェックのもののみ表示するようにしてあげれば良いと思います。
> #でもビルドする度に同じ手順を踏まないといけないのかも。<試したことないので(^_^;)

やってみました。
確かに、チェックして、チェック済みのものを非表示にすることはできたんですけど、
VBを再起動すると戻ってしまいますw

とりあえずはXPでは「●」と設定しても使える訳ですし、
VBを再起動すると未設定(空欄)に戻ってしまうのはなんとかしたいです。
作成したアプリ実行中にパスワードが丸見えになっていたりして、
「あれ!?」って思うことがよくあって困りますw
最終手段としてPasswordCharプロパティを使わずに
自分で同じような動作をするように作ってしまうこともできますが、
せっかくある機能、使いたいですよねぇ。
> とりあえずはXPでは「●」と設定しても使える訳ですし、
> VBを再起動すると未設定(空欄)に戻ってしまうのはなんとかしたいです。

 ごめんなさい。思いっきり脱線してましたね(汗)

 コンストラクタ( InitializeComponent が終わった後)なり、Load イベントなりで PasswordChar を設定するようにしても同様の不具合が発生するのでしょうか?
 それでも駄目なら、 OS を判定して設定する文字を変更するようにしてみるとか?
>  コンストラクタ( InitializeComponent が終わった後)なり、Load イベントなりで PasswordChar を設定するようにしても同様の不具合が発生するのでしょうか?

.NET Framework 1.0にSP3をあてたためか、再実験の結果、
VB再起動後にTextboxに触れてもリビルド後にまだ設定が維持されていることが判明しました。
ただ、やはりプロパティは空欄になっているので、MSの臨時処置でしょうかw
その空欄になったプロパティにカレットを合わせても、
何かを入力しない限りリビルドしても「●」のままのようです。
とりあえず、これで、プロパティの見た目は未設定(空欄)に戻ってしまうが、
プロパティを変更(入力)しない限り大丈夫ということになりました。

>  それでも駄目なら、 OS を判定して設定する文字を変更するようにしてみるとか?

なるべくならすべてのWindows上で「●」と表示してほしいのですが、
どうしても「●」を表示できなければ「*」でも別にかまいません。
ただ、Loadイベントで「●」に設定すれば9x系でも「●」になるのでしょうか・・・
実験してみないと分からないのですが、先にも書いたように環境がないもので・・・

DOBON.NET | プログラミング道 | プログラミング掲示板