フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2 3 4 5
トピック: [Software] TEditor ver2.52 Unicode Edition
DEKO
管理者
投稿数: 2374
[Software] TEditor ver2.52 Unicode Edition
on: 2014/08/06 08:35 Wed

Unicode 版 TEditor は、オリジナルの TEditor ver2.52 を Unicode 版 Delphi で動作するよう、Takeshi Maeda さんが改変されたものを DEKO が更に改変したものです。

※気まぐれでメンテしていますので、バグ報告は受け付けますがすぐに修正するとは限りません。

Rel.7 2014/08/06 ————————————————-
■ バグ
・ワードラップがオンだと描画が破綻する問題を修正。

Rel.6 2010/02/15 ————————————————-
■ 新機能
・Extras フォルダに、SkRegExp を利用した htSearch.pas を同梱。
http://komish.com/softlib/skregexp.htm
・正規表現検索 (sfrRegExp) が可能になった。

Rel.5 2010/02/08 ————————————————-
■ バグ
・フリーカーソル状態で、行末を超えた位置にカーソルがある場合の
 処理がおかしかったのを修正。

Rel.4 2010/02/05 ————————————————-
■ 新機能
・TEditor.HalfWidthFont プロパティを追加。
・TEditor.SurrogateFullWidthFont プロパティを追加。
・TEditor.UseHalfWidthFont プロパティを追加。
・TEditor.UseSurrogateFullWidthFont プロパティを追加。

■ 変更点
・HALF_WIDTH (ASCII) / HALF_WIDTH (without ASCII) /
 FULL_WIDTH (BMP) / FULL_WIDTH (without BMP)
 のフォントを別々に指定できるようになった。

■ ノート
・コードエディタ以外の用途…例えば文書の草稿を書くのに

 EastAsianWidth := False;
UseHalfWidthFont := False;
 UseFullWidthFont := True;
 SurrogateFullWidthFont := True;
Font.Name := 'Tahoma';
 FullWidthFont.Name := 'MS ゴシック';
 SurrogateFullWidthFont.Name := 'IPA X0208 ゴシック'; // または SimSun

 とすれば、可能な限りの Unicode 文字を表示でき、文字バランスもよくなる。

・Font にダイアクリティカルマーク付き文字が表示できるフォントを指定
 すると間延びしたようになるのは、ダイアクリティカルマーク付き文字の中に
HALF_WIDTH と FULL_WIDTH の中間の幅の文字が存在するため。この 1.5 倍
サイズの文字を HALF_WIDTH として描画するのだから、FULL_WIDTH 文字の
サイズは 3 にせざるを得なくなってしまう。

http://www.fileformat.info/info/unicode/char/00c6/index.htm

これを HALF_WIDTH で描画しようとすると、FULL_WIDTH がどうなるかは
容易に想像がつくと思う。

かといって、文字を1文字1文字調べて CreateFont で文字を変形させる
のは処理が重くなりすぎる。

Rel.3 2010/02/05 ————————————————-
■ 新機能
・TEditor.EastAsianWidth プロパティを追加。
 Ambiguous 属性を持つ文字の描画方法はこのプロパティで決定される。

■ 変更点
・FullWidthFont はFULL_WIDTH 文字にしか適用されなくなった。
 (FULL_WIDTH 文字が表示されない訳ではない)
・MECSUtils ver 1.40 以降が必要。
 http://cc.embarcadero.com/item/26061

■ 改良
・上記の変更により、東アジアの判定は最小限で済むようになった。
 (IsFarEast が呼び出される回数が減るので)

■ ノート
・UseFullWidthFont を False にして "MS ゴシック" を指定すれば
 見慣れた設定になる。(Shift-JIS 互換の表示)
・UseFullWidthFont を False にして "IPA X0208 ゴシック" を指定すれば
 サロゲートペアの日本語を表示できる。
・UseFullWidthFont を True にしてFont に "Tahoma"、FullWidthFont に
 "MS ゴシック" を指定すると欧文の見栄えがよくなる。
・UseFullWidthFont を True にしてFont に "Tahoma"、FullWidthFont に
 "IPA X0208 ゴシック" を指定すると欧文の見栄えがよくなった上に
サロゲートペアの日本語を表示できる。
・フォント周りの仕様は後日変更になる可能性がある。

Rel.2 2010/02/03 ————————————————-
■ 改良
・ダイアクリティカルマーク付き文字への対応。

■ 変更点
・付属の DFM をテキスト形式 DFM にコンバート。
 (オリジナルはバイナリ形式)

Rel.1 2010/01/28 ————————————————-
■ 改良
・Takeshi Maeda 氏版をベースにサロゲートペア対応。

Rel.0 2009/03/09 ————————————————-
■ 改良
・Takeshi Maeda 氏による Unicode 対応。
 http://homepage3.nifty.com/escargot/DELFrm.html

DEKO
管理者
投稿数: 2374
Re: [Software] TEditor ver2.52 Unicode Edition
on: 2014/08/06 11:28 Wed

デモの [Fountain] タブでの描画がおかしいのは、TEditor のバグではなくデモのバグです。描画位置を文字数 (バイト数) で決定しているのでこのような事になります。
MecsUtils を uses した上で、TForm2.Editor8DrawLine() イベントハンドラを以下のように書き換えてみてください。

//        Editor.DrawTextRect(ARect, X + Parser.SourcePos * Editor.ColWidth,
// Y, Parser.TokenString, ETO_CLIPPED);
Editor.DrawTextRect(ARect, X + MecsStringWidth(Copy(LineStr, 1, Parser.SourcePos), True) * Editor.ColWidth,
Y, Parser.TokenString, ETO_CLIPPED);

 
本当はコレじゃダメなのですが、暫定的にはこれで OK です。

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition Rel.8
on: 2014/08/06 14:39 Wed

[変更点 (2014/08/06)]

  • PosTokenString() / SelectPosToken() を利用しているメソッドが正しく動作するようになった (ワードラップには未対応)。

この部分をワードラップ対応できれば、大抵の機能は動作すると思うのですが…。
"デモのバグ" の件を修正を行えば、デモで実装されている機能はあらかた動作すると思います。

DEKO
管理者
投稿数: 2374
Re: [Software] TEditor ver2.52 Unicode Edition
on: 2014/08/06 14:58 Wed

まだおかしいトコがあるので、不具合修正優先なコードを書いています。
「コピペで冗長なコードにスンナ!」とか言われそうですが、書いている本人がそれを一番理解しています (^^;A
リファクタリングはちゃんと動作するものができてからですね。

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition Rel.9
on: 2014/08/07 02:01 Thu

[変更点 (2014/08/07)]

  • PosTokenString() / SelectPosToken() を利用しているメソッドが正しく動作するようになった (ワードラップに未対応)。
  • リファクタリング

[WordBreak について]
一見正しく動作しているように見えますが、三行以上に折り返された場合、二行目以降ではワードブレイクしてくれません。

オリジナルの TEditor は高速化のためにコードの最適化が行ってあります。”最大でこれだけしか処理されないハズだから以降の処理をスキップ” のような処理の事ですが、Unicode 版では "文字列->文字幅" 処理を噛ませてある関係上、最後まで処理しないとおかしくなってしまう事があります。

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition Rel.10
on: 2014/08/07 06:00 Thu

[変更点 (2014/08/07)]

  • ANSI で言う DBCS 文字種を正確に判定するようにした。
  • HTMLFountain のワーニングを潰した。
  • Extras にある htSearch.pas を最新の SKRegExp に対応させた。

[既知の不具合]

  • ワードラップ時に WordBreak が機能しない。

[DBCS 文字種]
例えばダブルクリックしてワードを選択するようなロジックを組み込む場合、ここがおかしいと ANSI 版と同等の動作になりません。
全角 SP の描画も正常になります。例えばデモの TForm2.Editor1DrawLine() で #$81#$40 になっている部分を ' ' に置換した上で、

//            P := Parser.SourcePos;
P := MecsStringWidth(Copy(S, 1, Parser.SourcePos));

 
このように書き換えると全角 SP が正しく描画されるようになります (要 MECSUtils)。

タブの描画も同様の修正で正しく描画されるようになります。

[HTMLFountain のワーニング]
TEditor をコンパイルしても一切ワーニングは出なくなるハズです (Delphi RTL 仕様変更によるものは除く)。

[Extras にある htSearch.pas]
え?「htSearch.pas で大量のワーニングが出るだろ!」ってですか?あちらの検索は Shift_JIS にベッタリと依存しているので、Extras の中にあるもので上書きしましょう。但し、別途 SkRegExp が必要となります…正規表現検索できるようになるので差し替えたほうが便利だとは思いますけどね。

See Also:
[SkRegExp]
http://skregexp.komish.com/

[正規表現の活用 (主に Delphi 2009 以降) (Delphi Tips)]
http://ht-deko.minim.ne.jp/tech064.html

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition Rel.11
on: 2014/08/07 10:08 Thu

[変更点 (2014/08/07)]

  • 上書きモードの処理修正を行った。
  • IME オンで入力した直後に IME をオフにして入力すると文字が失われる事がある問題を修正。
  • 2つあるデモをそのままで正しく動作するようにした。

[上書きモードの処理修正]
au さんが指摘されていた件 (http://d.hatena.ne.jp/au2010/20111110/1320934582) です。

[IME の処理修正]
中川さんが指摘されていた件 (http://ht-deko.bbs.coocan.jp/?t_id=326) です。

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition Rel.12
on: 2014/08/07 11:31 Thu

[変更点 (2014/08/07)]

  • ワードラップ時に WordBreak が機能しない問題を修正。
DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition (雑記)
on: 2014/08/07 12:46 Thu

とりあえずワードラップ関係も正しく動作するようになったようです。ただ…デモアプリの修正箇所を見て頂くとお解り頂けると思いますが、

「コンパイルが通れば正常動作する訳ではない」

って事ですよね。文字数=バイト数の処理があれば、それらはすべて修正する必要があります。例えば、オーナードローの描画位置はバイト数からは求められず、行頭から文字幅を積算しないといけません。この辺をお手軽に変換するサポートメソッドを追加した方がいいような気がしています。MECSUtils でも文字数->描画位置を求める事ができますが、TEditor 内部で使っているロジックとは異なる事があるので、あくまでも暫定処理となります。

「これバグじゃ?」と思ったら、まずは問題の切り分けを行いましょう。TEditor の問題なのか?それともアプリケーション側に従来の "文字幅=バイト数" のロジックが残っているのか?を調べてみましょう。デモアプリを改変してテスト (問題のあるロジックのみを移植) すると切り分けしやすいと思います。

See Also:
[Delphi での文字コードのハンドリングについて (PDF)]
http://conferences.embarcadero.com/article/images/40483/devcamp_encore_20100415_Full.pdf

[MECSUtils リファレンス]
http://ht-deko.minim.ne.jp/tech021.html

DEKO
管理者
投稿数: 2374
TEditor ver2.52 Unicode Edition (雑記2)
on: 2014/08/07 13:30 Thu

不具合があるようだったら報告して頂けると有難いです…エンバカさんの QC もそうですが、バグがあるなら報告しない事には始まりません。事実 4 年間ホッタラカシでしたしね。

不具合報告は基本的にこのスレッドにお願いします。@ht_deko 宛に twitter でツイートして頂いても構いませんが、備忘録としてこのスレッドで晒す可能性がある事をご了承下さい。メールでの不具合報告は勘弁してください。

# Unicode 化作業の対価を頂けるのでしたら↑にあるハラヘッタウェアからお願い致します。
# (対価がなければ Unicode 版を使っちゃいけないとか、メンテしないとかいう事はありません)

※続きは↓の [2] をクリック。

ページ: [1] 2 3 4 5

WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.1 sec.