問題タブ [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 配列に既に小数点記号があるかどうかを判断するヘルパー関数を作成しました。
そして、ここにsubclassing 手順があります- 私はマイナス記号を考慮していません:
1 つの重要な注意:この質問への回答のおかげで、アプリケーションに現在のユーザー ロケール設定を読み込むことができます。
質問:
符号付き 10 進数のみを受け入れ、ロケールを認識するエディット コントロールを実装するより良い方法はありますか?
subclassing が唯一の方法である場合、コードをさらに改善/最適化できますか?
お時間をいただき、ありがとうございました。
よろしくお願いします。
付録:
さらに役立つように、エディット コントロールを作成し、subclass10 進数のみを受け入れるようにする小さなデモ アプリケーションを次に示します。ここでも、マイナス記号の部分は実装していません。
c++ - EN_UPDATE メッセージに応答する際の再帰の回避
符号付きの 10 進数を符号付き区切り記号edit controlの形式で受け入れるを作成しようとしています(例: )。-1.5
インターネットで広範囲にわたる調査を行った結果、マスクされたエディット コントロールの満足のいく例はほとんど見つかりませんでしたが、MFC .
を知らないのでMFC、そのコードを純粋な に変換するのに苦労するWin32 APIので、ゼロから自分のやり方でやってみることにしました。
例を注意深く調べた結果、メッセージMFCに応答するときにテキスト検証を実行すると結論付けましたEN_UPDATE。
同じことをしようとすると、プログラムは警告やエラーメッセージなしですぐに終了します。私の問題は再帰に違いないと結論付けました。
これを確認するために、メイン ウィンドウのプロシージャに小さなハンドラを記述して、これをテストしました。
Debugモードでプログラムを起動すると、次のようになります。
文字aを入力すると、編集コントロールのテキストが に変わりますe。
これは、再帰に関する私の結論を裏付けています。押すaと、 に変換されb、次に別のEN_UPDATE発射が行われ、変数に到達して結果がになるまでプロセスが繰り返され、bに変わりました。cstatic4e
私の質問は簡単です:
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代わりに結果が得られますか?ccab
編集の終わり
お時間をいただき、ありがとうございました。
よろしくお願いします。
c++ - クリップボードからテキストを取得したら、ある文字列を別の文字列に挿入するために必要なアドバイス
紹介と関連情報:
edit control符号付き 10 進数 ( のようなもの) のみを受け入れる必要があるがあります-12.35。
経由でこれを実装することにしましたsubclassing。
ハンドラーはWM_CHARうまく機能しているようで、ユーザーが無効なテキストを入力するのを完全に防ぐために、他のいくつかのメッセージを処理する必要があります。そのようなメッセージの 1 つがWM_PASTE.
これまでのところ、からテキストを適切に取得しclipboard、コピーされた文字列が実際に 10 進数であるかどうかに応じて、メッセージを破棄または渡すことができました。
編集コントロールの入力は 12 文字に制限されています。これはEM_SETLIMITTEXTメッセージを介して行われます。
と を使用pure WinapiしC++ます。などのライブラリboostは許可されていません。
問題:
これまでのところ、編集コントロールが空の場合をテストし、コンテンツが無効な場合は貼り付けを破棄しました。ただし、ユーザーはエディット コントロールでテキストの一部を選択し、貼り付けを実行できます。このようなもの (灰色の文字は選択を表します):
編集コントロール内のテキスト: 123 45678.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ますか、それともこれを達成するためのより良い方法はありますか? もしあれば、私を正しい方向に向けることができますか?
ありがとうございました。
よろしくお願いします。