掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
RichEditで、英単語の途中で改行させるには? (ID:39174)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
WordBreakProcの置き換えは、真面目にやろうとするとCR+LFの組み合わせを判別したり、 Ctrl+Left, Ctrl+Right のアルゴリズムも自分で実装しないといけないので 違和感なく動かすためにはけっこうチューニングが大変そうですね。 EM_SET/GETWORDBREAKPROCEXならデフォルトの処理関数が利用できるかと思ったけれど やっぱり自分で登録しないとnilのままだったり。 とりあえず試してみたコード。uses節にRichEditとMathが必要です。 uses RichEdit, Math; function MyWordBreakProc(lpch: PChar; ichCurrent, cch, code: Integer): Integer; stdcall; begin case code of WB_CLASSIFY: // 現在位置の文字種別を判定する // 実際には呼ばれてないようなので、これで内容が正しいかどうかは不明 if lpch[ichCurrent] = ' ' then Result := WBF_ISWHITE else Result := WBF_BREAKAFTER or WBF_BREAKLINE; WB_ISDELIMITER: // 現在位置の文字が区切り文字か判定する Result := 0; WB_LEFT, WB_LEFTBREAK: // 単語の先頭/前の単語の終わりを左に探す Result := ichCurrent; // すべての文字が単語の先頭 WB_MOVEWORDLEFT: // Ctrl+Leftで左に動く時に呼ばれる Result := Max(ichCurrent - 1, 0); // とりあえず1文字だけ戻す WB_RIGHT, WB_RIGHTBREAK: // 次の単語の先頭/単語の終わりを右に探す Result := Min(ichCurrent + 1, cch - 1); // 次の単語は常に1文字右 WB_MOVEWORDRIGHT: // Ctrl+Rightで右に動くときに呼ばれる Result := Min(ichCurrent + 1, cch - 1); // とりあえず1文字だけ進める else // ここには来ないはず Result := 0; end; end; procedure TForm1.FormShow(Sender: TObject); begin RichEdit1.Perform(EM_SETWORDBREAKPROC, 0, LPARAM(@MyWordBreakProc)); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.