問題タブ [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.

0 投票する
2 に答える
898 参照

c++ - 10 進数のロケール対応編集コントロールのサブクラス化 ( format [sign] [xxx...] [decimal separator] [yy...] )

紹介と関連情報:

のような符号付き10 進数edit controlのみを受け入れる必要があるがあります。また、小数点記号はすべての国で同じではないため、ロケールに対応している必要があります。米国ではドットが使用されますが、ヨーロッパではコンマなどが使用されます。-123.456

これを解決するための私の努力:

これまでのところ、私はこれsubclassingを実装していました。subclassing擬似コードで表現された を実装するための私のロジックは次のとおりです。

最初に、次のように、char 配列に既に小数点記号があるかどうかを判断するヘルパー関数を作成しました。

そして、ここにsubclassing 手順があります- 私はマイナス記号を考慮していません:

1 つの重要な注意:この質問への回答のおかげで、アプリケーションに現在のユーザー ロケール設定を読み込むことができます。

質問:

符号付き 10 進数のみを受け入れ、ロケールを認識するエディット コントロールを実装するより良い方法はありますか?

subclassing が唯一の方法である場合、コードをさらに改善/最適化できますか?

お時間をいただき、ありがとうございました。

よろしくお願いします。

付録:

さらに役立つように、エディット コントロールを作成し、subclass10 進数のみを受け入れるようにする小さなデモ アプリケーションを次に示します。ここでも、マイナス記号の部分は実装していません

0 投票する
2 に答える
1952 参照

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は期待した結果が得られませんbccc.

ユーザーがキーを押した後、EN_UPDATEテキストを表示するためにキーが生成されるため、これは予期されることです。

したがって、押すaと に変換されbます。b 後でEN_UPDATE押すと、新しいメッセージが生成されるため、ハンドラーが最初からやり直します。つまり、新しい文字列bbを取得して適切に変換しccます。

EN_UPDATE現在のテキストを操作しているときに新しいメッセージの作成を一時的に抑制する方法はありますか?上記の例では、次に押すbc代わりに結果が得られますか?ccab

編集の終わり

お時間をいただき、ありがとうございました。

よろしくお願いします。

0 投票する
1 に答える
110 参照

c++ - クリップボードからテキストを取得したら、ある文字列を別の文字列に挿入するために必要なアドバイス

紹介と関連情報:

edit control符号付き 10 進数 ( のようなもの) のみを受け入れる必要があるがあります-12.35

経由でこれを実装することにしましたsubclassing

ハンドラーはWM_CHARうまく機能しているようで、ユーザーが無効なテキストを入力するのを完全に防ぐために、他のいくつかのメッセージを処理する必要があります。そのようなメッセージの 1 つがWM_PASTE.

これまでのところ、からテキストを適切に取得しclipboard、コピーされた文字列が実際に 10 進数であるかどうかに応じて、メッセージを破棄または渡すことができました。

編集コントロールの入力は 12 文字に制限されています。これはEM_SETLIMITTEXTメッセージを介して行われます。

と を使用pure WinapiC++ます。などのライブラリboostは許可されていません。

問題:

これまでのところ、編集コントロールが空の場合をテストし、コンテンツが無効な場合は貼り付けを破棄しました。ただし、ユーザーはエディット コントロールでテキストの一部を選択し、貼り付けを実行できます。このようなもの (灰色の文字は選択を表します):

編集コントロール内のテキスト: 123 45678.9

クリップボード テキスト : -1A

貼り付けを許可した場合、結果の文字列は 123-1A78.9 になり、これは無効な形式です。

これは私が助けが必要な部分です:

私の解析では有効な形式が正しく認識されますが、2 つの文字列を 1 つに適切にマージする方法がわからないため、テストできます。

質問:

  1. 貼り付けから得られた文字列を適切に形成して、その有効性をテストするにはどうすればよいですか?

  2. 私のために有効性テストを実行できる関数はありますか (ロケールを認識している必要があります! )?

注: テキストを自分で解析することは気にしませんが、その必要がないのになぜ「車輪の再発明」をするのでしょうか?

これを解決するための私の努力:

  1. インターネットをブラウジングするとstd::、文字列を連結/切断/などする多くの関数が見つかりましたが、結果の文字列を形成するという私のニーズを満たすものはないようです。私が見つけた最も近いものはstring:: insert(...)、それを使用する方法がわかりません。

  2. 2番目の質問については、 StackOverflowstd:: strtodの質問をブラウジングして見つけましたが、文字列の有効性を確認するために使用できるようです。また、ロケールも認識しているようですが、それが私が求めているものかどうかはわかりません。

この投稿をできるだけ簡潔にするために、関連するコード スニペットを含むこの質問へのリンクを提供します。

お時間をいただき、ありがとうございました。

さらに情報が必要な場合は、投稿を更新します。

よろしくお願いします。

0 投票する
1 に答える
1058 参照

winapi - ES_NUMBER、ES_UPPERCASE、および ES_LOWERCASE スタイルが Win32 API 編集コントロールで機能しなくなった

Windows エディット コントロールをゼロから作成するために使用される非常に古い (「レガシー」) VB6 コードがあります。次のようになります。

何年も機能していましたが、現在、顧客は ES_NUMBER スタイルが効果がないと報告しています。同じことは、ES_UPPERCASE と ES_LOWERCASE という 2 つの同様のフラグにも当てはまります。何が問題になる可能性がありますか?

0 投票する
1 に答える
80 参照

c++ - 編集コントロールを SQL インジェクションや無意味な文字から適切に保護する

紹介と関連情報:

ユーザーが会社名を入力する編集コントロールがあります。編集コントロールはロケール対応です。

問題:

SQL injection攻撃やユーザーによる無意味な文字入力から適切に保護したいと考えています。

問題を解決するための私の努力:

を破棄しcolonsemicolonに対応してサブクラス化手順で、 に対応しWM_CHARて検証を再度実行することを考えていましたEN_CHANGE。問題が発生した場合は、ユーザーに通知し、[保存] ボタンを無効にします。

私のアプリケーションはロケール対応なので、入力文字をテストするためにロケール対応関数が必要です。

これまでのところ、ロケールを認識しているように見えるものを見つけましIsCharAlphaIsCharAlphaNumeric(私の英語は最高ではないため、MSDNのドキュメントを読み間違えた可能性があります。申し訳ありません)。

ここでも同様の質問を検索しましたが、何も見つかりませんでした。

質問:

捨てるsemicolonだけでうまくいくのでしょうか、それとも他のキャラクターを考慮する必要がありますか?

サブクラス化 + で「正しい軌道」に乗っていEN_CHANGEますか、それともこれを達成するためのより良い方法はありますか? もしあれば、私を正しい方向に向けることができますか?

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

よろしくお願いします。