問題タブ [editcontrol]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 10 進数のロケール対応編集コントロールのサブクラス化 ( format [sign] [xxx...] [decimal separator] [yy...] )
紹介と関連情報:
のような符号付き10 進数edit control
のみを受け入れる必要があるがあります。また、小数点記号はすべての国で同じではないため、ロケールに対応している必要があります。米国ではドットが使用されますが、ヨーロッパではコンマなどが使用されます。-123.456
これを解決するための私の努力:
これまでのところ、私はこれsubclassing
を実装していました。subclassing
擬似コードで表現された を実装するための私のロジックは次のとおりです。
最初に、次のように、char 配列に既に小数点記号があるかどうかを判断するヘルパー関数を作成しました。
そして、ここにsubclass
ing 手順があります- 私はマイナス記号を考慮していません:
1 つの重要な注意:この質問への回答のおかげで、アプリケーションに現在のユーザー ロケール設定を読み込むことができます。
質問:
符号付き 10 進数のみを受け入れ、ロケールを認識するエディット コントロールを実装するより良い方法はありますか?
subclass
ing が唯一の方法である場合、コードをさらに改善/最適化できますか?
お時間をいただき、ありがとうございました。
よろしくお願いします。
付録:
さらに役立つように、エディット コントロールを作成し、subclass
10 進数のみを受け入れるようにする小さなデモ アプリケーションを次に示します。ここでも、マイナス記号の部分は実装していません。
c++ - EN_UPDATE メッセージに応答する際の再帰の回避
符号付きの 10 進数を符号付き区切り記号edit control
の形式で受け入れるを作成しようとしています(例: )。-1.5
インターネットで広範囲にわたる調査を行った結果、マスクされたエディット コントロールの満足のいく例はほとんど見つかりませんでしたが、MFC
.
を知らないのでMFC
、そのコードを純粋な に変換するのに苦労するWin32 API
ので、ゼロから自分のやり方でやってみることにしました。
例を注意深く調べた結果、メッセージMFC
に応答するときにテキスト検証を実行すると結論付けましたEN_UPDATE
。
同じことをしようとすると、プログラムは警告やエラーメッセージなしですぐに終了します。私の問題は再帰に違いないと結論付けました。
これを確認するために、メイン ウィンドウのプロシージャに小さなハンドラを記述して、これをテストしました。
Debug
モードでプログラムを起動すると、次のようになります。
文字a
を入力すると、編集コントロールのテキストが に変わりますe
。
これは、再帰に関する私の結論を裏付けています。押すa
と、 に変換されb
、次に別のEN_UPDATE
発射が行われ、変数に到達して結果がになるまでプロセスが繰り返され、b
に変わりました。c
static
4
e
私の質問は簡単です:
EN_UPDATE
この種の再帰を回避するには、プログラムをどのように処理または変更すればよいですか?
編集 (2014 年 2 月 18 日):
メンバーJonathan Potterの指示に従って、上記のEN_UPDATE
ハンドラーを変更しました。
再帰の問題はなくなりましたが、出力は私が望んでいたものではありません。
簡単なコンソール アプリケーションで文字を後継者に置き換えるコードの正確性を確認し、ボタンをクリックするときに同じことを行いました (ボタンとそれをクリックするためのハンドラーをすばやく追加することは難しくありませんでした)。 )。
したがって、問題は指定された指示の実装にあるに違いないため、誰かが私が間違ったことを指摘してくれることを期待して、修正したコードを送信します。
さて、a
正しく押すと に変わりますがb
、押した後b
は期待した結果が得られませんbc
がcc
.
ユーザーがキーを押した後、EN_UPDATE
テキストを表示するためにキーが生成されるため、これは予期されることです。
したがって、押すa
と に変換されb
ます。b
後でEN_UPDATE
押すと、新しいメッセージが生成されるため、ハンドラーが最初からやり直します。つまり、新しい文字列bb
を取得して適切に変換しcc
ます。
EN_UPDATE
現在のテキストを操作しているときに新しいメッセージの作成を一時的に抑制する方法はありますか?上記の例では、次に押すbc
代わりに結果が得られますか?cc
a
b
編集の終わり
お時間をいただき、ありがとうございました。
よろしくお願いします。
c++ - クリップボードからテキストを取得したら、ある文字列を別の文字列に挿入するために必要なアドバイス
紹介と関連情報:
edit control
符号付き 10 進数 ( のようなもの) のみを受け入れる必要があるがあります-12.35
。
経由でこれを実装することにしましたsubclassing
。
ハンドラーはWM_CHAR
うまく機能しているようで、ユーザーが無効なテキストを入力するのを完全に防ぐために、他のいくつかのメッセージを処理する必要があります。そのようなメッセージの 1 つがWM_PASTE
.
これまでのところ、からテキストを適切に取得しclipboard
、コピーされた文字列が実際に 10 進数であるかどうかに応じて、メッセージを破棄または渡すことができました。
編集コントロールの入力は 12 文字に制限されています。これはEM_SETLIMITTEXT
メッセージを介して行われます。
と を使用pure Winapi
しC++
ます。などのライブラリboost
は許可されていません。
問題:
これまでのところ、編集コントロールが空の場合をテストし、コンテンツが無効な場合は貼り付けを破棄しました。ただし、ユーザーはエディット コントロールでテキストの一部を選択し、貼り付けを実行できます。このようなもの (灰色の文字は選択を表します):
編集コントロール内のテキスト: 123 456
78.9
クリップボード テキスト : -1A
貼り付けを許可した場合、結果の文字列は 123-1A78.9 になり、これは無効な形式です。
これは私が助けが必要な部分です:
私の解析では有効な形式が正しく認識されますが、2 つの文字列を 1 つに適切にマージする方法がわからないため、テストできます。
質問:
貼り付けから得られた文字列を適切に形成して、その有効性をテストするにはどうすればよいですか?
私のために有効性テストを実行できる関数はありますか (ロケールを認識している必要があります! )?
注: テキストを自分で解析することは気にしませんが、その必要がないのになぜ「車輪の再発明」をするのでしょうか?
これを解決するための私の努力:
インターネットをブラウジングすると
std::
、文字列を連結/切断/などする多くの関数が見つかりましたが、結果の文字列を形成するという私のニーズを満たすものはないようです。私が見つけた最も近いものはstring:: insert(...)
、それを使用する方法がわかりません。2番目の質問については、 StackOverflow
std:: strtod
の質問をブラウジングして見つけましたが、文字列の有効性を確認するために使用できるようです。また、ロケールも認識しているようですが、それが私が求めているものかどうかはわかりません。
この投稿をできるだけ簡潔にするために、関連するコード スニペットを含むこの質問へのリンクを提供します。
お時間をいただき、ありがとうございました。
さらに情報が必要な場合は、投稿を更新します。
よろしくお願いします。
winapi - ES_NUMBER、ES_UPPERCASE、および ES_LOWERCASE スタイルが Win32 API 編集コントロールで機能しなくなった
Windows エディット コントロールをゼロから作成するために使用される非常に古い (「レガシー」) VB6 コードがあります。次のようになります。
何年も機能していましたが、現在、顧客は ES_NUMBER スタイルが効果がないと報告しています。同じことは、ES_UPPERCASE と ES_LOWERCASE という 2 つの同様のフラグにも当てはまります。何が問題になる可能性がありますか?
c++ - 編集コントロールを SQL インジェクションや無意味な文字から適切に保護する
紹介と関連情報:
ユーザーが会社名を入力する編集コントロールがあります。編集コントロールはロケール対応です。
問題:
SQL injection
攻撃やユーザーによる無意味な文字入力から適切に保護したいと考えています。
問題を解決するための私の努力:
を破棄しcolon、semicolonに対応してサブクラス化手順で、 に対応しWM_CHAR
て検証を再度実行することを考えていましたEN_CHANGE
。問題が発生した場合は、ユーザーに通知し、[保存] ボタンを無効にします。
私のアプリケーションはロケール対応なので、入力文字をテストするためにロケール対応関数が必要です。
これまでのところ、ロケールを認識しているように見えるものを見つけましIsCharAlpha
たIsCharAlphaNumeric
(私の英語は最高ではないため、MSDNのドキュメントを読み間違えた可能性があります。申し訳ありません)。
ここでも同様の質問を検索しましたが、何も見つかりませんでした。
質問:
捨てるsemicolonだけでうまくいくのでしょうか、それとも他のキャラクターを考慮する必要がありますか?
サブクラス化 + で「正しい軌道」に乗っていEN_CHANGE
ますか、それともこれを達成するためのより良い方法はありますか? もしあれば、私を正しい方向に向けることができますか?
ありがとうございました。
よろしくお願いします。