お世話になっています
RichEdit にワードパッドで一部を「UDデジタル教科書体」にフォント変更した文章を貼り付けて
procedure TForm1.RichEdit1Click(Sender: TObject);
begin
Caption:=RichEdit1.SelAttributes.Name;
end;
してみますと、Delphi2009、Delphi 11 CE では「UD デジタル 教科書体 N-」とフォント名の後半、ハイフン以降の情報が欠落するようです
Delphi5 だとちゃんと「UD デジタル 教科書体 N-B」と表示されます
「@g_コミック古印体nocutかな」とかもやはり切れるのでフォント名の長さの問題だとは思うのですが
調べていくと RichEdit.pas はたまた ComCtrls.pas や Windows.pas まで遡ってしまいます
何かヒントがありましたらよろしくお願いします
TRichEditのOnSelectionChangeイベント
procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
begin
ListBox1.Items.Add(RichEdit1.SelAttributes.Name);
end;
で、確認したところ、
Delphi 7、Delphi 12.1では、
UD デジタル 教科書体 N-B
になりますが、Delphi XEでは、
UD デジタル 教科書体 N-
になりますね。
そういえば、以前の投稿では、
TRichEdit 一部フォントでの貼り付け時の変化
https://www.petitmonte.com/bbs/answers?question_id=30049
などの情報もあるようです。
igy さん、お返事ありがとうございます
そうなんです RichEdit 4.1 ではちゃんと読み込めていたのです
というか、以前も投稿していたのですね私(じじぃですみません)
しかし今回 Delphi5 では正常だということが気になりまして
RichEdit 3x でも処理の方法を適切に修正すれば解決するのでは?と悩んでいる状態です
Delphi 12.1 も入れてみて確認しました
Delphi 11.3 の方も私が確認時、貼り付けデータを間違っていたようでこちらも正常に貼り付けられていました
D5 で問題ないので比べてみたのですが、TTextAttributes 周りの AnsiChar→WideChar に関する変更箇所もなんら影響するものはなさそうに見えます
やはり DLL 側の受け渡しの問題なのでしょうか
しかし「RichEdit 4.1」は物書きの人に凄く評判悪いんですよね
・Ctrl+左右キーで飛び飛びに移動するとき、ひら/カナをひとまとめにしてくれていたはずが細切れになってる
・行末から上に向かって複数行選択すると最終行の改行を勝手に追加選択する
・URLの途中にキャレットを置いてShift+Home/Endで選択しようとしたら、おっURLに用があるんか任せろ!みたいな感じで一行全選択する(後半を削るときなどに邪魔)
・上付き/下付き文字しか含まれない行の行間が小さくなってくれない
・右クリックした後、Esc やエディタ外クリックでメニューキャンセルしてもキャレットが右クリックした場所へ移動する(選択状態なら維持する)
・Google IME+最下行で全角空白を入力するとスクロールバーが飛ぶ
URLの件、他の方の参考までに・・・・
TRichEdit(RichEdit 4.1) で URL を Shift+End or Shift+Home した時の動作
https://www.petitmonte.com/bbs/answers?question_id=30072
というのが、ありました。
そちらはさすがに覚えていますw
その後いろいろな嫌なパターンが出てきて土に埋めたのでした
RichEdit 3 前提として
■Good
D5 + Win10
D2009 + Win7
■NG
D2009 + Win10
D2009 + Win10+(Win7 でロードされる)riched20.dllをカレントにコピー
たかがリッチエディットにOS自体も巻き込んでいるんでしょうか
(もうすぐワードパッドさえもなくなるようですが)
おそらく おかしいのは ワードパッドからコピーされるとき、
Windows10で
DELPHI 2009 / DELPHI 12.1 ともに RichEdit に Wordから張り付けた
”UD デジタル 教科書体 N-B" / "UD デジタル 教科書体 NK-B" を
選択して
Caption:=RichEdit1.SelAttributes.Name;
した場合
それぞれ
”UD デジタル 教科書体 N-B"
"UD デジタル 教科書体 NK-B"
と表示される
DELPHI 2009 の場合
但し、TRichEdit上で文字を移動させると
移動した先で
”UD デジタル 教科書体 N-"
"UD デジタル 教科書体 NK"
に変化する
(これは DLL の問題の気がする)
---------------------------------------------------------
ワードパッド内でテキストを WORD に移動させて、
その移動させたテキストのフォント名が変わってるんだよね・・・・
>ワードパッド内でテキストを WORD に移動させて、
ワードパッド内でテキストを移動させ、移動させたテキストを WORD に移動させて
クリップボードのデータ見たらフォント名はあってたな・・・・
貼り付け時なのか
AAAAA さん、ありがとうございます。
私も今日仕事から帰って
まず GetClipboardData(CF_RTF); から string(GlobalLock(Data))を rtf 保存したあとに RichEdit1.PasteFromClipboard;
するというのをやっていたところでした。
D5 も D2009 も出力される rtf は全く同じ内容なのに貼り付けられたD2009のフォント名は切れていました(yoy)
アプリケーション内でフォント名を変えたら保持出来るのに文字選択してドラッグ移動したら壊れるので
やはり TCharFormat2 周りかなと昨日、RichEdit.pas あたりを読んでいたのですが
怪しいのは Windowsとのやりとりなのか?……で頓挫しました
ワードで フォント名 "あいうえおかきくけこさしすせそたちつてとなにぬねの" を設定したテキスト
を DELPHI 2009 に張り付けると
32Byte フォント名 "あいうえおかきくけこさしすせそ・" になり
いったん ワードパッドに張り付けた テキストを DELPHI 2009 に張り付けると
22Byte フォント名 "あいうえおかきくけこã" に
なります。
フォント名 "1234567890123456789012345678901234567890" だと
両方とも
62Byte ”1234567890123456789012345678901” になります
40Byte あいうえおかきくけこ1234567890
38Byte あいうえおかきくけ1234567890
36Byte あいうえおかきく1234567890
ワードパッド経由
22Byte あいうえおかきくけこ1
26Byte あいうえおかきくけ1234
30Byte あいうえおかきく1234567
フォント名長さを 半角 2byte 全角 3Byte で計算してる感じ
ありがとうございます
その計算はどこで行われているのでしょう
直せるところであれば直したいですが、いい加減長くなって皆様に申し訳ないのでそろそろ退散させていただきます。
--とりあえず最後にわかったパターン--
ワードパッドに「ShowMessage」と書いて【Me】の部分だけ「UD デジタル 教科書体 N-B」に変更
全選択して RichEdit に貼り付けると【Me】はちゃんと「UD デジタル 教科書体 N-B」になっている(正常)
ワードパッドにもどって「ShowMあessage」と一文字二バイト文字を挿入して再び
全選択して RichEdit に貼り付けると【Mあe】は「UD デジタル 教科書体 N-」に欠損
三度ワードパッドにもどって「ShowMessage」に戻して RichEdit に貼り付けしても二度と正常なフォント名にはならない
ワードパッドを再起動すれば最初(正常)に戻る
文字のドラッグ&ドロップでは選択文字に二バイト文字が混ざっていなくてもフォント名欠損
結果報告です
WM_PASTEは横取りして
CoLockObjectExternalでTRichEditのOLEドロップターゲットを無効にしたあと
TCustomDropTargetを作成してIDataObjectを自分で処理することで解決しました
余談ですが
Delphi6製でもフォントの欠落は起きていたのでUniCode化によるエンバグではなかったようです
しかしD6のVCLソースが入手出来なかったのでソースの比較追跡は諦めました
以上お騒がせしましたm(_ _)m