Delphi Syneditで遊んでみよう
Delphi Syneditで遊んでみよう
執筆:平成18年7月24日
編集:平成18年7月25日
※ 手元のzipは2.0.3なのでそれ以降のバージョンは知りません。
サンプルがよくできていて
なんかそのまま使ってしまいたくなります。
でも付属のサンプルは
正規表現検索を付け忘れているようです。
それで 次のようにすると使えるようになります。
frmeditor | |
コンポ配置 | SynEditRegexSearch1を 置きます。 |
180行目前後 付近の好きな位置に |
gbSearchRegularExpression: boolean; を追加します。 |
886行目付近 | if gbSearchTextAtCaret thenよりも前の適当な位置に SearchRegularExpression := gbSearchRegularExpression; を追加します |
910行目付近 | gbSearchRegularExpression := SearchRegularExpression; if not(gbSearchRegularExpression) then SynEditor.SearchEngine := SynEditSearch1 else SynEditor.SearchEngine := SynEditRegexSearch1; |
行番号は適当に書いているので、文脈を判断して 適切な位置にいれましょう。 これで正規表現対応になりました。 メニューやフォントなどは、日本語に書き換えれば、 そこそこ遊べます。 |
次に、行番号を付けたくなりますね?
SynEditor.Gutter.ShowLineNumbers
をTrueにするだけです。
もぉー簡単。
↓調子にのって
次にオプションを開いて、制御文字を表示にすると
(eoShowSpecialChars = true)
罠にはまるわけです。
制御文字が カ とか キ になって
はぁ? (・ω・)?
みたいになります
で ここに定義してあります。
SynEditTypes.pas | |
SynTabGlyph | |
SynSoftBreakGlyph | |
SynLineBreakGlyph | |
SynSpaceGlyph |
constで定義されているので
勝手に好きな文字に書き換えましょう・・・
まぁ 上級者はpaint書き換えてグラフィックぶち込む
とか、 制御文字だけ欧文フォントに戻すとか
優雅な手もありますけど・・・ (参考箇所 SynEdit.pas 2096、3306
コンポーネントを作れない方には
上のは 鞭うつ感じになるので
簡単な回避策を考えていきましょう。
でもね。 このファイル「SynEditTypes」開いちゃうと・・・
また罠にはまるわけです・・・
こわれちゃうんですよね。 Shift-jisお構いなしの、定義なので
ホントdelphi ソースコード unicode対応しろよぉ みたいな感じです。
(対応しているってば!!)
ブラウザで壊す前の原文を開けば、文字の正体がわかりますよ☆
また罠にはまりたくないので メモしておきます。
ウムラウト とかの文字を表記していたようですね
まぁ。ブラウザから コピペすると
国際文字です utf8で保存しますかときます。
なんかwide型になって エラーがでますから注意ですよ
ここにもまた罠があるのです。
IDEはデコードできんのかい!!と言いたくなります
流れで ついやっちゃった方は
メモ帳で開いて名前を付けてでasciiを選んでください。
では、 今回のまとめです
SynEditTypes.pas | |
破壊前 | TSynSpecialChars = ['À'..'Ö', 'Ø'..'ö', 'ø'..'ÿ']; |
Delphi2005 JPで開くと ↓ (>_<) | |
開いた後 | TSynSpecialChars = ['タ'..'ヨ', 'リ'..'・, '・..'']; |
修正案 | TSynSpecialChars = [#$C0..#$D6, #$D8..#$F6, #$F8..#$FF]; 上のは欧文フォント用なので PrepareIdentCharsの内容を 把握して書き換える必要がありそうです。 |
破壊前 | SynTabGlyph = Chr($BB); //'»' SynSoftBreakGlyph = Chr($AC); //'¬' SynLineBreakGlyph = Chr($B6); //'¶' SynSpaceGlyph = Chr($B7); //'·' |
Delphi2005 JPで開くと ↓ (>_<) | |
開いた後 | SynTabGlyph = Chr($BB); //'サ' SynSoftBreakGlyph = Chr($AC); //'ャ' SynLineBreakGlyph = Chr($B6); //'カ' SynSpaceGlyph = Chr($B7); //'キ' |
修正案 | SynTabGlyph = #$AE; // ョ SynSoftBreakGlyph = #$81#$ca; // ¬ SynLineBreakGlyph = #$81#$ab; // $81ab ↓ SynSpaceGlyph = '_'; // '_' 適当に好きな文字でもいれてくださいな。 TSynSpecialChars とかぶらないように・・・ |
びっくりするくらい 違いますね。
これが、 海外コンポの罠というやつです。
・スペースは 反転とか色付けるとか
・制御文字毎に On/Off設定できるとか
なんかそういう細かいのがほしいですね?
文化の違いというか
その辺が、Syneditの欠点であり、はやらない理由です。
下がその結果です。
【結論】
どっちもどっち・・・ 罠にはまります
eoShowSpecialChars をセットしなければ幸せになれます(笑
冒険者の方は ゴットハンドを探してください?
注:「ゴットハンドってなに?」。 冒険を積むと手に入れることができます?
冒険者の数だけ存在しますが、 手に はいるかは あなた次第です。
カスタマイズ後 |
フォント比較用コード Fromをクリックしてコードを貼り付けます。 コンポを貼らないでください。 コンポを配置した場合は、usesを削ります。 |
uses StdCtrls,ExtCtrls,SynEdit; procedure TForm1.FormCreate(Sender: TObject); var TmpControl : TWinControl; SynEdit1,SynEdit2 : TSynEdit; procedure initSynEdit(ASynEdit: TSynEdit); var s : string; begin ASynEdit.Gutter.Color := $00D5F8F9; ASynEdit.Gutter.BorderColor := clGreen; ASynEdit.Gutter.ShowLineNumbers := True; ASynEdit.Options := ASynEdit.Options + [eoShowSpecialChars]; if ASynEdit.ParentFont then s := 'Parent Font[True] ' else s := 'Parent Font[False] '; s := s + format('font name[%s]',[ASynEdit.font.name]); TGroupBox(ASynEdit.Parent).Caption := s; end; begin SetBounds(0,0,400,220); TmpControl := TGroupBox.Create(self); TmpControl.Parent := self; TmpControl.SetBounds(0,0,1,100); TmpControl.Align := alTop; SynEdit1 := TSynEdit.Create(TmpControl); SynEdit1.Parent := TmpControl; SynEdit1.Align := alClient; SynEdit1.Lines.Add(' '+#$9+' '); SynEdit1.Lines.Add('日本語'); SynEdit1.Lines.Add(' '); with TSplitter.Create(self) do begin Parent := self; Align := alTop; SetBounds(0,101,1,105); Height := 4; Color := $004080FF; end; TmpControl := TGroupBox.Create(self); TmpControl.Parent := self; TmpControl.SetBounds(0,200,1,1); TmpControl.Align := alClient; SynEdit2 := TSynEdit.Create(TmpControl); SynEdit2.Parent := TmpControl; SynEdit2.Align := alClient; // SynEdit2.Font.Name := 'MS Pゴシック'; SynEdit2.ParentFont := True; SynEdit2.Lines := SynEdit1.Lines; initSynEdit(SynEdit1); initSynEdit(SynEdit2); end; |
【番外編】 翌日
↓ 結局ゴットハンドにより
ソースコードは、ちょこバコっと修正される目にあうのです。
SynHighlighterPHP.pas try文追加したいなぁとコードをたどること10分 |
|
SynHighlighterPas.pasを参考に バージョンを追加 |
|
try {} catch (Exception $e) {} 構文の追加 追加するときのツール procedure TForm1.Button1Click(Sender: TObject); var i,r:integer; s:string; begin r := 0; s := UpperCase(trim(Edit1.Text)); for i := length(s) downto 1 do r := r + (ord(s[i])-64); Caption := 'Func'+IntToStr(r); end; 上のツールで計算して 対応する Funcに追加するだけ。 面倒な仕様だなと・・・ 判定を高速化するためかな? |
プチかっこよくなりました。
ハイライト部分の文字の取得方法がないようなので
やっぱり仕様がカスということでお蔵いき決定?。
面倒ですが
付属のTRegExprで別に吸い出す方法もあるにはあります。
複合コメントがかぶった場合の排除+吸い出し方法がわからないので保留・・・
恒例で修正コードは、とりあえずCDに封印する事にしましょう。
基礎からEditorControlを作り替えたくなるので
今回は、ここまでとさせていただきます。m(_ _)m
C#のオープンソースの似たようなEditorControlでいいのないかなぁ・・・
「Delphi Syneditで遊んでみよう」 おわり