1

TMemo は Unix エンター (LF) を正しく処理できません。LF で区切られた 2 行が表示され、1 行として扱われます。可能なすべてのテキスト形式 (Mac、Win、Unix) を処理したい。

明らかに、テキストを確認して、次のたびに LF を CRLF に置き換えることができます。

  • テキストフォームファイルを読み込む
  • テキストを貼り付ける
  • Add() 関数を使用する
  • Insert() 関数を使用する
  • Appen() 関数を使用する
  • Text プロパティを介してコンテンツを変更します

しかし、これはエレガントなソリューションではありません。

Lazarus は Lines.TextLineBreakStyle プロパティでこの問題を解決しました。Delphi XE に似たようなものはありますか?

4

2 に答える 2

4

あなたは具体的に行末シーケンスについて尋ねていますが、一般的な編集ボックスの内容を制御することに簡単に議論を広げることができます.

2001 年に、Peter Below は、数字のみを受け入れる編集コントロールで処理する必要があるすべての事柄の概要を書きました。この手法は、少なくとも Windows 開発では、今日でも適用できます。要約は次のとおりです。

  • オーバーライドKeyPressして、不要なキーストロークを除外します。(あなたの場合、除外したいキーがないため、これは必要ありません。)
  • wm_Pasteクリップボードから貼り付けられたテキストを考慮してメッセージを処理します。
  • wm_SetText他のほとんどの従来の方法で設定されているテキストを考慮してメッセージを処理します。(これで、リストのほとんどが処理されLoadFromFileますAdd: Append、、、、、Insert) Text := ...
  • em_ReplaceSel選択したテキストが上書きされることを考慮してメッセージを処理します。

以下の記事では、彼は不適合な入力を単純に拒否しています。ただし、それはおそらくあなたが望むものではありません。代わりに、統一された行末シーケンスを使用するように入力を正規化する必要があります。上記のテキスト変更メッセージを単に飲み込むのではなく、入力をマッサージしてから通常のハンドラーに転送する必要があります。

行末を制御するために、Delphi には、必要な種類のマッサージを行う関数がすでに用意されていますAdjustLineBreaks。Unix スタイルまたは Windows スタイルのどちらの行末を使用するかを選択できます。(Macintosh でさえ、もはや Mac スタイルの行末を使用していないことに注意してください。) tlbsCRLFWindows の編集コントロールが表示方法を認識しているスタイルであるため、おそらく必要になるでしょう。ご指摘のとおり、キャリッジ リターンがない場合、改行は表示されません。

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あります。

于 2014-10-16T21:42:32.530 に答える
0

Lines.LineBreakプロパティをLF次のように設定するだけです。

memo1.lines.LineBreak := #10;

デフォルトは#13#10Windows です。

于 2014-10-16T13:46:29.510 に答える