あなたは具体的に行末シーケンスについて尋ねていますが、一般的な編集ボックスの内容を制御することに簡単に議論を広げることができます.
2001 年に、Peter Below は、数字のみを受け入れる編集コントロールで処理する必要があるすべての事柄の概要を書きました。この手法は、少なくとも Windows 開発では、今日でも適用できます。要約は次のとおりです。
- オーバーライド
KeyPress
して、不要なキーストロークを除外します。(あなたの場合、除外したいキーがないため、これは必要ありません。)
wm_Paste
クリップボードから貼り付けられたテキストを考慮してメッセージを処理します。
wm_SetText
他のほとんどの従来の方法で設定されているテキストを考慮してメッセージを処理します。(これで、リストのほとんどが処理されLoadFromFile
ますAdd
: Append
、、、、、Insert
) Text := ...
。
em_ReplaceSel
選択したテキストが上書きされることを考慮してメッセージを処理します。
以下の記事では、彼は不適合な入力を単純に拒否しています。ただし、それはおそらくあなたが望むものではありません。代わりに、統一された行末シーケンスを使用するように入力を正規化する必要があります。上記のテキスト変更メッセージを単に飲み込むのではなく、入力をマッサージしてから通常のハンドラーに転送する必要があります。
行末を制御するために、Delphi には、必要な種類のマッサージを行う関数がすでに用意されていますAdjustLineBreaks
。Unix スタイルまたは Windows スタイルのどちらの行末を使用するかを選択できます。(Macintosh でさえ、もはや Mac スタイルの行末を使用していないことに注意してください。) tlbsCRLF
Windows の編集コントロールが表示方法を認識しているスタイルであるため、おそらく必要になるでしょう。ご指摘のとおり、キャリッジ リターンがない場合、改行は表示されません。
wm_SetText
との場合em_ReplaceSel
、変更は簡単です。ここにスケッチがあります:
procedure TLineNormalizingMemo.WMSetText(var Message: TWMSetText);
var
s: string;
begin
s := Message.Text;
s := AdjustLineBreaks(s);
Message.Text := PChar(s);
inherited;
end;
wm_Paste
新しいテキストが与えられておらず、現在クリップボードにあるテキストを変更することは想定されていないため、それほど明白ではありません。代わりに、 を呼び出さないことを選択してinherited
、貼り付けの効果を処理できます。このようなもの:
procedure TLineNormalizingMemo.WMPaste(var Message: TWMPaste);
var
s: string;
begin
if Clipboard.HasFormat(cf_Text) then begin
s := Clipboard.AsText;
s := AdjustLineBreaks(s);
SelText := s;
end;
end;
割り当てSelText
はメッセージを介して行われるため、そこem_ReplaceSel
を呼び出す必要さえない場合がAdjustLineBreaks
あります。