日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2024年11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Delphi Syneditで遊んでみよう

カテゴリー: ぷろぐらみんぐ
2006-07-28

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で遊んでみよう」 おわり



PR

[PR]