Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

痛IDEプラグイン for RAD Studio Ver.0.0.10。

IDEプラグインとは


これで このなつも すずしく すごせるね!

更新内容

特定環境でスクロール時にIDEが落ちる件の修正と、初期化処理の高速化です。
というか初期化処理の高速化は0.0.9の内容なんですが、アップするのを忘れてました/(^o^)\

Component Initializerのちょっと便利な使い方。

Component Initializerとは?

Component Initializerは、去年のAdvent Calendar用記事で紹介した、IDE上でコンポーネントを配置する際にちょっとしたコードを走らせることのできるプラグインです。
その「ちょっとしたコード」のサンプルとして、プラグインにはTEditやTMemo、TPanelといったコンポーネントを配置した際にそれぞれのText、Lines、Captionプロパティを空にする…というものが入っていますが、他にも便利かもしれないサンプルを紹介してみます。

TFormのフォントを設定する

日本語版のDelphi 7までは、新規にフォームを作成するとフォントとして「MS Pゴシック」がデフォルト指定されていましたが、それ以降は「Tahoma」になってしまいました。そのため、新規にフォームを作った際はまずフォントを変更するという方は多いと思います。
Component Initializerで初期化コードを書くイベント関数には、配置されたコンポーネントを指す「Self」引数だけでなく、「Parent」も引数として渡されます。フォームに直接何かを置いた場合、Parentの中身はフォームなので、これに対してフォントを設定すればいいわけです。

procedure OnCreateComponent(Self: TObject; Parent: TComponent; const Rect: TRect);
begin
  if (Parent is Vcl.Forms.TForm) and (Parent.ComponentCount <= 1) then
  begin
    with Vcl.Forms.TForm(Parent) do
    begin
      Font.Name := 'MS UI Gothic';
      Font.Size := 9;
      Scaled := False; // ついでにw
    end;
  end;
end;

TUpDownをTEditに関連付ける

TUpDownというのは上下ボタンのコンポーネントで、単体で使うこともあるかもしれませんが、多くはTEditなどのエディットコントロールと組み合わせて使います。TUpDown側にもAssociateというプロパティがあるので、ここにTEditなどのコンポーネントをセットしておくと、値がお互いに連動するようになります。
僕なんかはほぼ100%TEditと組み合わせて使うんですが、実際にAssociateを指定する時、画面上にすでにたくさんのコンポーネントが配置されているとリスト上にも大量のコンポーネントが表示されてしまうため、結構面倒だったりします。というわけでこれを自動化してみたのが以下のコードです。

procedure OnCreateComponent(Self: TObject; Parent: TComponent; const Rect: TRect);
var
  distCurr, distMin: Double;
  edit: Vcl.StdCtrls.TCustomEdit;
  i: Integer;
  r: TRect;
begin
  if Self is Vcl.ComCtrls.TUpDown then
  begin
    if not (Parent is Vcl.Controls.TWinControl) then Exit;
    distMin := MaxDouble;
    edit := nil;
    for i := 0 to Vcl.Controls.TWinControl(Parent).ControlCount-1 do
    begin
      if not (Vcl.Controls.TWinControl(Parent).Controls[i] is TCustomEdit) then Continue;
      r := Vcl.Controls.TWinControl(Parent).Controls[i].BoundsRect;
      distCurr := Sqrt(Sqr(r.Right - Vcl.ComCtrls.TUpDown(Self).Left) + Sqr(r.Top - Vcl.ComCtrls.TUpDown(Self).Top));
      if distCurr < distMin then
      begin
        distMin := distCurr;
        edit := TCustomEdit(Vcl.Controls.TWinControl(Parent).Controls[i]);
      end;
    end;
    if edit = nil then Exit;
    try // ←同じTEditに複数のTUpDownを関連付けるとエラーになるので、その簡易対策
      Vcl.ComCtrls.TUpDown(Self).Associate := edit;
    except
    end;
  end;
end;

これでコンポーネントパレットからTUpDownを選んだ後、TEditの右肩付近をクリックすれば、そこに関連付けた状態でTUpDownが配置されます。

終わりに

今回はVCLのサンプルでしたが、もちろんFireMonkeyのコンポーネントでも同じようにコードを走らせることが可能ですし、TTimerといった非ビジュアルコンポーネントにも適用可能です。なので、例えば非ビジュアルコンポを置く度にそれらを綺麗に整列する、といった処理も書くことができます。
他にも何か面白い活用方法を思いついた方は教えてもらえると嬉しいです。

UTF8ize Plugin。

これは何?

新規に作成したり開いたユニットのファイルフォーマットを自動でUTF-8にセットするプラグインです。

デフォルトでは新規かどうかにかかわらずすべてUTF-8にセットします。この動作をやめて新規のみを対象にする場合は、UUtf8ize.pasを開いて{$DEFINE APPLYTOALL}をコメントアウトするか、削除して下さい。ただし以下のような動作をするため、ほとんどの場合はそのまま使っても問題ないと思います。

既存のファイルに対する動作

このプラグインは新規作成したファイルだけでなく、既存のファイルを開いた際にもフォーマットとしてUTF-8を指定します。フォーマットの変更を手動で行う場合、IDEは変更フラグを立てるため、中身を何も編集していなくてもファイルを閉じる際に保存するかどうか尋ねられますが、このプラグインは変更フラグを立てないため、内容の変更を行わない限り保存するかどうかは尋ねられませんし、そのまま閉じればUTF-8に変換しないまま閉じることができます。

余談

これを作るにあたってとりあえずOpen Tools API内で何とかできないか調べたところ、IOTAFileFilterServicesにDefaultFilterプロパティがあり、ここにUTF-8を表すIOTAFileFilterインターフェースを突っ込めば良さそうだったので、これは楽勝…と思いきや、指定すると「BOMが付いてないファイルをUTF-8と見なして開く」という動作に変わるだけの残念仕様*1で、結局OTAを使わないいつもの手法に落ち着きました…。

余談の余談

ソースコードUTF-8にするメリットは、海外の人がソースコードを開いた時に文字化けを防ぐというだけで無く、コンパイルが速くなる*2という直接的なものがあります。これはヘルプにも書いてあることなんですが、何故かUTF-8がデフォルトになる気配が無いですよね…謎です。UTF-16をデフォルトにするというならサイズ的な問題があるので分からなくも無いですが、UTF-8なら欧米圏はせいぜいBOMで数バイト増えるだけですし。

*1:当然UTF-8でないファイルは化ける

*2:正確にはUTF-8以外を使うとコンパイル速度が低下する

Jpfix plug-in for Delphi Ver.1.1.2。

Jpfixって?

Delphi IDEが文字幅の計算をミスっているせいで何かとずれるのを修正するプラグインです。

1.1.2の修正点

  • コード補完リストの表示位置が固定になっていたのを修正*1

*1:せっかくのずれ修正が何の意味もなくなるので致命的でした/(^o^)\

日本語関連修正プラグイン改めJpfix plug-in for Delphi Ver.1.1.1。

Jpfixって?

Delphi IDEが文字幅の計算をミスっているせいで何かとずれるのを修正するプラグインです。

修正する内容

  • Ctrl+マウスオーバー時においてリンク表示になる座標がずれる問題


  • コード補完リストの位置がずれる問題


前回からの変更点

前回まではXE4専用だったのが、今回からXE4〜XE8対応になりました。ただしVer.1.2で追加された検索結果表示を修正する機能は今回諸事情*1で見送りました。なので1.1からの派生バージョンとなってます。あと各バージョン毎のbplを用意するのがめんどくさかったのでオープンソース化しました。

ちなみに

名前にfor Delphiと入ってはいますが、コード的にはC++Builderにも適用可能です。
…が、そもそもC++Builderで同様の問題が起きてるのか、起きてるとしてちゃんと直るのかは分からないです。修正先がDelphiC++Builderで共用のcoreideXXX.bplなので、もしかしたらいけそう?

*1:修正方法的に複数バージョンに対応するのが辛い、CnPack導入環境だとフック対象が被るので死ぬ等々…