アーカイブ

2006年 3月 5日 のアーカイブ

これも、ぎょえの時点から抱えてきた問題である。
キャレットは、テキスト入力位置が点滅するって言う当たり前の機能のことね。
当たり前の機能なのだが、キャレットを持つウィンドウってほとんどOS標準なもので、
自作のエディタウィンドウにキャレットを表示するやり方は解説が少なく手探り状態。
そもそも自前でキャレット表示する必要があるのは、テキストエディタのみだから、
さいわいTEditorというサンプルはある物の、他に常套手段みたいな物をみつけられない。
そのことについて。

CreateCaretとDestroyCaretで、好みの形のキャレットを作成&破棄する。
CreateCaretを何度も呼んだとしても、前回のキャレットを破棄して作るだけ。
フォーカスを持ったときのみCreateし、フォーカス消失時にDestroyしろってさ。
ま、そのルールは守れないのだが。
さらにこれとは別にShowCaretとHideCaretってのがあって、
Showした回数からHideした回数が引かれ、プラスの時だけキャレット表示するってさ。
CreateしててもShowがプラスにならないと非表示っていう感じだな。
そういう仕様なので、フォーカス取得と同時にCreateしてShow、
フォーカス消失時にHideしてDestroyって感じで簡単に済めば良かったんだがな。

フォントの大きさを変えればキャレットの大きさも変更するから再作成しなきゃいけないし、
ドラッグドロップが来たら非アクティブでもマウスの位置について行かなきゃいけない。
TEditorのドラッグドロップ拡張では、フォーカス無いのにあるかのようにみえるバグがあるし、
逆に消すタイミングを誤ると、よそのウィンドウのキャレットまで消しちゃったりするし、
何が起こってるのか謎で、キャレットをどう扱うかはずっと悩んできたこと。

付け焼き刃だが、MSDNでフォーカスがあるときだけキャレット表示しろとあるから、
真魚の場合はドラッグドロップでマウスが来た瞬間に無理矢理フォーカスを取得していた。
これでフォーカスが入ってきたときと出ていったときだけ処理するのでうまくいっていた。
でも、フォーカスだけ取得すればいいのにZオーダーも取得しようとするらしく、
マウスが真魚のウィンドウに通りかかっただけで前面に来る動作がウザかったりした。
よく、ドラッグドロップが来たら勝手に最前面に出るソフトってあるけど、
真魚の場合はそのように動作させたくてわざとやってるのではなく、
キャレットが思い通りの動作をしてくれなくて、仕方なく最前面に出てただけね。

で、意図しない動作をし続けていることにイライラが募ってきたので、思い切ってメスを入れた。
何が原因でどんな不具合が起こっていたのかすらつかめない状態のまま、
なんとなく修正いれ続けたら、ようやく好みの動作になった。
本当にたぶんだけど、CreateCaretは前回作成したキャレットを削除して再作成するが、
もう一回ShowCaretをしないと表示はされず、
内部で数えているShowやHideの回数に矛盾を来すっていう事だったんだと思う。
Createを呼ぶ前に、合計0になるまでHideして置かないといけないってことで解決。
これで、ドラッグドロップ時に無理矢理フォーカスを奪う動作をやめられる。
よかったよかった。

B00092QW4M
B00092QW4M

やる気がないときは一切やらないのに、いったんハマると抜けられないな。

折り返しやEUC関連の修正と変更は、手作業でばかりやっていたわけではない。
数万の文字についてそれが何語だとか記号だとか、変換先がどこだとか、
人間様が手作業で分類してたら気が遠くなるわけで、
既に他人によって分類されたデータを利用しやすいように編集するという作業は、
それ専用にプログラムを書いてやらせたりとかしているわけだ。
プログラムをプログラムに書かせるみたいな感じだ。
書かせるって言ってもデータ部分のみだけどね。
で、自動的に書かせたデータをコピペして利用するわけだが、
Delphi IDEのテキストエディタがスクロール遅くて、
巨大データを選択するのに時間がかかるし、こういう作業ではIDEが良く落ちるので、
真魚でこの作業をやっていたわけだ。
DelphiのコードをDelphiで書くのは、補完やリファクタリングが出来るからであって、
それを必要としない作業では、Delphi以外で作業した方が効率が良くなる。
んで、真魚で編集した後すぐDelphiで再構築しようとすると、
Delphi側はプロジェクトファイルが外部から変更されたことを検知し、
読み直すかどうか見たいな確認をして来たわけね。
真魚にはこの監視機能がないせいで、古い内容での上書きを何度かやってしまった。
これは必須機能っぽいと実感したので、実装する予定だ。
例によって、監視しないって言うオプションは用意しないよ。無駄だ。

内部でFColKeepingと呼ばれている機能について。
方向キーでの上下移動するときの動作なんだが説明が難しい。
1行目は80文字、2行目は0文字、3行目は80文字、っていうテキストで、
キャレットが1行目の80文字にあるとき、↓↓って入力した場合、
メモ帳だと3行目の左端、偽パッドは3行目の80文字目に移動するのね。
真魚はなんの疑いもなく偽パッド型の動作を採用していた。
これを標準ではメモ帳型にし、オプションで偽パッド型に変更出来るようにした。
折り返しの動作確認のためにメモ帳を使っていたら気がついた。

横スクロールバーについて。
メモ帳は、右端で折り返すと横スクロールバーが消え、
折り返さなければスクロールできなくてもスクロールバーが出現する。
右端以外でも折り返せる真魚ではこれと同じ仕様にすることは出来ないので、
スクロールできなくても常に縦横両方のスクロ-ルバーを出してきたわけだが、
縦は常に表示、横は必要なときだけ表示、っていう仕様に変えた。
TEditorだと、スクロールバーを出すか消すか見たいなオプションがあるのだが、
それって、TEditorをテキストエディタ以外に使う際に開発者がいじる物であって、
テキストエディタのダイアログに選択肢を用意するのは変じゃない?
EmEditorにもそういう選択肢があるが存在意義は疑問。

今日はこんな感じで。まだおわんないのかって。

B00008Z70J
B00008Z70J