Delphiの環境設定

Delphi 2007

外観

久しぶりのDelphi単体版ですのでシンプルにしてみました。

通常時。

デザイナ用。

デバッグ用。

起動速度

未だに起動時に無駄に.NETがロードされます。VisualStudioみたいに必要になるまで.NETをロードしない構成になってくれると嬉しいのですが……。外すとリファクタリング使えなくなるしなー。
それでもチューニングはされてるみたいで、地味に速くはなってきています。言われるほど劇的でもないです。

何かを外して起動速度を稼ぐのであれば、Togetherを外すのが一番効きます。

エディタ設定

バックアップをしないようにすると、__historyディレクトリも作られなくなりました。

Goodbye MSBuild

http://groups.google.co.jp/group/borland.public.delphi.non-technical/browse_thread/thread/33560bb5999c50fc/f1c27941e9776d6c
http://groups.google.co.jp/group/borland.public.delphi.non-technical/browse_thread/thread/38dcb52ef2dcb62d/39f0581b626dd1d2#

ヘルプから要らないものを外す

http://d.hatena.ne.jp/ytqwerty/20080308#p2

Tweak Delphi 2007

パッケージの付けはずしにはこちらをどうぞ。

Ctrl+Shift+[でbegin、Ctrl+Shift+]でendを入力 for Delphi 2006, 2007

unit BeginEnd;

// Original http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1007345219&rm=100
// Extended by YT

{$DEFINE END_WITH_UNINDENT}
{$DEFINE DISTINGUISH_ESC}
{x$DEFINE USE_NORMAL_PARENTHESIS}

interface

uses
	Windows, SysUtils, Classes, ToolsAPI, Menus;

const
	DisplayName = 'Begin End';
	BeginShortCut = 'Ctrl+[';
	EndShortCut = 'Ctrl+]';
	BeginShortCut2 = 'Ctrl+9';
	EndShortCut2 = 'Ctrl+0';
	BeginText = 'begin'#13#10#9;
	EndText = 'end';

implementation

type
	TBeginEnd = class(TNotifierObject, IOTAKeyboardBinding)
	private
{$IFDEF DISTINGUISH_ESC}
		FEscape: TKeyBindingProc;
{$ENDIF}
		procedure BeginProc(const Context: IOTAKeyContext; KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
		procedure EndProc(const Context: IOTAKeyContext; KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
	public
		function GetBindingType: TBindingType;
		function GetDisplayName: string;
		function GetName: string;
		procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
	end;

procedure TBeginEnd.BeginProc(const Context: IOTAKeyContext; KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
var
	EP: IOTAEditPosition;
begin
	{IDEの取り扱いではコントロールコードなんでESCもCtrl+[も27になる}

{$IFDEF DISTINGUISH_ESC}
	if GetKeyState(VK_ESCAPE) and $80 = 0 then
	begin
		EP := Context.EditBuffer.EditPosition;
		EP.InsertText(BeginText);
		BindingResult := krHandled;
	end
	else if Assigned(FEscape) then
		FEscape(Context, KeyCode, BindingResult)
{$ELSE}
	EP := Context.EditBuffer.EditPosition;
	EP.InsertText(BeginText);
	BindingResult := krHandled;
{$ENDIF}
end;

procedure TBeginEnd.EndProc(const Context: IOTAKeyContext; KeyCode: TShortCut; var BindingResult: TKeyBindingResult);
var
	EP: IOTAEditPosition;
	i, col, row: Integer;
	isNewLine: Boolean;
begin
	EP := Context.EditBuffer.EditPosition;
{$IFDEF END_WITH_UNINDENT}
	isNewLine := false;
	col := EP.Column;
	row := EP.Row;
	for i := col - 1 downto 1 do
	begin
		EP.Move(row, i);
		isNewLine := EP.IsWhiteSpace;
		if not isNewLine then
			Break;
	end;
	EP.Move(row, col);
	if isNewLine then
		EP.Tab(-1);
{$ENDIF END_WITH_UNINDENT}
	EP.InsertText(EndText);
	BindingResult := krHandled;
end;

function TBeginEnd.GetBindingType: TBindingType;
begin
	Result := btPartial;
end;

function TBeginEnd.GetDisplayName: string;
begin
	Result := DisplayName;
end;

function TBeginEnd.GetName: string;
begin
	Result := ClassName
end;

procedure TBeginEnd.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
var
	tmp: TShortCut;
	R: TKeyBindingRec;
begin
{$IFDEF DISTINGUISH_ESC}
	if (BorlandIDEServices as IOTAKeyBoardServices).LookupKeyBinding(
					[ShortCut(VK_ESCAPE, [])], R) then
		FEscape := R.KeyProc;
{$ENDIF}

	tmp := TextToShortCut(BeginShortCut);
	if tmp <> 0 then
		BindingServices.AddKeyBinding([tmp], BeginProc, nil);

	tmp := TextToShortCut(EndShortCut);
	if tmp <> 0 then
		BindingServices.AddKeyBinding([tmp], EndProc, nil);

{$IFDEF USE_NORMAL_PARENTHESIS}
	tmp := TextToShortCut(BeginShortCut2);
	if tmp <> 0 then
		BindingServices.AddKeyBinding([tmp], BeginProc, nil);

	tmp := TextToShortCut(EndShortCut2);
	if tmp <> 0 then
		BindingServices.AddKeyBinding([tmp], EndProc, nil);
{$ENDIF}
end;

var
	Bind: Integer;

initialization

	Bind := (BorlandIDEServices as IOTAKeyBoardServices).
					AddKeyboardBinding(TBeginEnd.Create);

finalization

	(BorlandIDEServices as IOTAKeyBoardServices).RemoveKeyboardBinding(Bind);

end.

旧バージョン

Delphi 6

Update

Delphi 6を買うなりPersonalを落として来るなりして、インストールして、仕様許諾コードも取ったところから話を始めます。 さっそく使ってみたいところでしょうが、まずやることがあります。

Update 1をBorlandのサイトから落としてきて適用してください。必須です。

Delphi 6には、*.dcu(C/C++の*.obj相当)が、デバッグ版もリリース版も全てデバッグ版のものになっている「あきれ果てたぜBorland Japan」としか言いようの無い配布ミスがあります。結果、例えライブラリソースの付いていないPersonal版でも、デバッグ時にライブラリソースを求められてしまい、またProfessional以上でも非デバッグ設定で構築した*.exeにソースコード名が埋めこまれたりします。 C/C++と異なりデバッグ情報そのものは埋めこまれませんので、サイズ的には僅差でしかないのですが、 逆解析されやすくなる……らしいです。 詳しいことは知りませんが……。

Update 2、RTL Update 1、RTL Update 2も出ていますので適用しましょう。

Delphi32.exeを起動するためのショートカット

普通スタートメニューから辿って起動すると思います。 で、そのショートカットが問題です。 デスクトップやクイック起動にショートカットを作る場合、[Windows]-[R]やその他のランチャーなんかを使う場合も、相当する項目をいじっておいて損はないです。

  • 「リンク先」コマンドラインを"C:...Delphi6Bindelphi32.exe" /npに変更。
    /np を付けないと、起動する度に新しいVCLプロジェクトが作られてしまいます。 作業中プロジェクトを開き直すと閉じてはくれますが、それとはまた他の作業をしたい時に、いちいち閉じるのは割と面倒です。 本当にVCLプロジェクトを新規作成したいときは、メニューから選びますってば。
  • 「作業フォルダ」を、自作プロジェクトを置いている位置に変更。
    Delphi32.exeは、「起動時の」カレントディレクトリを、開くダイアログのデフォルトにします。 一太郎などでも同様ですが、アプリケーションが用意してくれた位置に本当に自作ファイルを置く人ってどれだけいることか。

[ツール]-[環境オプション]

設定タブ
  • 「エディタファイル」の自動保存をON。
    要するにソースコードが自動で保存されるかどうか。 デフォルトは恐ろしい事にOFFなんです。
デザイナタブ
  • 「グリッドの大きさ」を小さくする。
    8×8では大きすぎます。 RAD時、コントロールの配置はこれに位置合せされるわけですからもっと小さくしておきましょう。 お薦めは4×4。位置合せの手間を惜しまないのであれば「グリッドに合せる」を切る方法もありますが。
  • 「テキスト形式で作成」をOFF。
    詳しくは省きますが、要するにデフォルトではリソースがテキスト形式で、画像も全てテキストで保存されて、ディスクの無駄遣いです。勿論リンクする時はバイナリーになりますが。
  • 「自動生成の対象に追加」をOFF。
    ダイアログボックスを作る時も、自動で起動時から常に隠しウィンドウとしてメモリー上に置かれる状態になります。 プロジェクトオプションで個々のフォームについて設定はできますが、根っこから切っておきましょう。 設定忘れのメモリーの無駄づかいを防げます。 これをOFFにしても、メインフォームだけは自動生成されますので心配無用です。
オブジェクトインスペクタ
  • 「インスタンス一覧を表示」をOFF。
    上のインスタンス選択コンボボックスはDelphi 1からあるものなのですが、Delphi 6になってオブジェクトツリーという便利なものができたので、いらない。
  • 「ステータスバーを表示」をOFF。
    オブジェクトツリーができて、ただでさえインスペクタの高さが無くなったのに画面のスペースの無駄遣いです。
Delphi Direct
  • 「ネットワーク経由で自動的に確認を行う」をOFF。

[ツール]-[エディタオプション]

  • 「タブ位置」を3 5に。
    3と5の間にスペースを空けて下さい。 以降、3と5の間隔を守って、7, 9, 11..と自動的に割り振られます。 つーか、自動生成のソースコードのインデントが2つずつなのに、8タブって何!?

  • 色は、好きに設定すればいいと思います。 スピード設定で、VisualStudio風にもできます。
    見れば判りますが、Delphiのエディタは、何故かC/C++のソースコードとHTMLも色分け表示できます。
    豆知識として、太字はどこにも使いたくはないが、文字の横の間隔を開けたい場合は、ホワイトスペースに太字チェックを付けてしまえば可能です。
  • 支援機能をOFF
    支援機能は、コード補完と宣言表示は、[Ctrl]+[Space]、[Ctrl]+[Shift]+[Space]で簡単に呼べるため、僕は、自動的には出てこないようにしています。 自動で出てくると、参考にしようと思っていた部分や、たまに今打っている最中のコードまでが隠れてしまって、割と迷惑です。

[プロジェクト]-[オプション]

起動時に/npを付けるか、すべて閉じるを選んで、プロジェクトが存在しない状態で設定して下さい。 そうすると、以降新規に作成するプロジェクトのデフォルトとして使われます。

コンパイラ
  • 「型付き@演算子」をON。
    Pascalの@は、C/C++の単項&と同じでアドレスを取ります。 このオプションがOFFの場合、なんと、整数型の変数のアドレスを取っても、実数型の変数のアドレスを取っても、全てPointer型(Cのvoid*)になってしまいます。 恐ろしいのでこのチェックはONです。
    なお、この状態では、たまに他の人の書いたソースがコンパイルできなくなることがあります。 その時は、そのソースの先頭に{$TYPEDADDRESS OFF}と書いてやればそのソースだけこのオプションがOFFの状態でコンパイルできます。 (本当は直してもらうべきなのでしょうが)
ディレクトリ/条件
  • ユニット出力ディレクトリを、新たに作った作業用ディレクトリに。
    ここが空だと、ユニットと同じ位置に*.dcu(C/C++の*.obj)ができます。 それでもいい人はいじらなくていいです。私は全プロジェクトで同じユニット出力ディレクトリを使用していて、そこを消すだけで中間ファイルが一掃できるという寸法です。
パッケージ
  • 設計時パッケージの一覧から、Borland Sample Inmported ActiveX ControlsとMicrosoft Office 200 Sample Automation Wrapper Componentsを探し出して、チェックをOFFにする。
    滅多に使わないのに、メモリーの無駄、かつ、パレットのスペースを食うだけです。 使わないコンポーネントを提供しているパッケージはチェックを切っておきましょう。 ただし中には、アドインとして機能しているものもあるので注意。
  • 実行時パッケージ
    実行時パッケージは、使うと*.exeサイズは確かに減りますが、配布には別に*.bpl(特殊な*.dll)が必用になり、メモリー使用量も増えます。 普通の*.dllではできないパッケージならではの技もあるのですが、そういった理由がない限り使わないのがいいと思います。 デフォルトのOFFは正解なのでいじらないように。

ツールバーのコンテキストメニュー[カスタマイズ...]

デフォルトでは結構くだらないものが並んでいたりするので、よく使うものを並べたほうがいいです。 [プロジェクトマネージャ]とか[全てのプロジェクトを再構築][プロジェクトの情報]とか……。 また、幅を減らせば、その分パレットを広く取れます。

デフォルトのツールバー
私が使ってた例

OpenTools

BorlandのIDEには、OpenToolsAPIというものがあって、拡張ができるようになっています。 使ってみて、便利と思ったIDE拡張を紹介します。

Ctrl+[でbegin、Ctrl+]でendを入力

まず、このリンク先のソースをユニットとして保存します。 パッケージを新規に作成し、上のユニットを追加。 "requires"に、Delphi 6のディレクトリのどこかにあるdesignide.dcpを探して来て追加。 オプションで、設計時パッケージとします。説明文は適当に書きます。 後は、構築(デフォルトではC:Program FilesBorlandDelphi6ProjectsBPLに作成されます)して、インストールすればOKです。

完璧に思えるのですが、実はCtrl+[というのはエスケープキーのキーコードとかぶっています。 $1b……DOSのころはエスケープシーケンスの入力にCtrl+[使ってましたしね。 編集中にエスケープキーに用事はほとんど無いのですが、IME入力を取り消そうとしてエスケープキーを連打していてbeginが入力されたら焦ります。 BeginProc中にGetKeyState(VK_ESCAPE) and $80 <> 0とでも書き加えて、本当にエスケープキーが押されていたら何もしないようにしたほうがいいでしょう。

同じようにさえすれば任意のキーで任意の文字列を挿入できるわけですから、サンプルとしても使いでがあります。 匿名の作者様に感謝!

F1ヘルプでMicrosoft Platform SDKを引く

Borland Community Home Page中のCodeCentralの中のDelphiのOpenToolsのAnders Melanderさんの"MSDN Help integration"。

Project JEDIのJCL(JEDI Code Library)にも似たようなものがありますが、昔試した時はBuggyでした。

非デバッグ実行

普通にエクスプローラなどから実行したような実行を行うメニューをIDEに追加します。 DirectXやシェルの名前空間で、何故かデバッガだと実行できなくなる場合があるので、そんな時は便利かもです。

Borland Community Home Pageにいくつかあります。 実は、%1を実行するバッチファイルにして、ツールメニューに追加、だけでも用は足せるのですが。

一次資料

OpenToolsAPIのヘルプファイルDel6IOTA.hlpは、Borland米国本家のページからダウンロードできます。

Delphi 7

設定とか

TAB幅の設定が最初っから2になっている以外は、ほぼ6と同じです。

エディタの配色が固定パレットからTrue Color全部使えるようになったのが、一番嬉しい点。

Delphi 8

設定とか

設定ダイアログががらっと変わっていますが、エディタの自動保存をONにしたりテキスト形式dfmをOFFにしたり、と、やることはあまり変わりません。

Update 2

本国Borlandからダウンロードできます。 Borland Japanはもう当てにしない……。

OpenTools

OpenToolsAPIは、.NETで書くことも、ネイティブ(IDE Integration Pack使用)で書くこともできるようですが、今までのOpenToolsAPIは使えないものもあるようです。 キーボードバインディングが使えないのは痛い……。 変わったのか、無くなったのかは知りませんが……。

Ctrl+Shift+[でbegin、Ctrl+Shift+]でendを入力 for Delphi 8

とりあえずbegin-end短縮入力だけでも使えないと、苦痛ですので、移植してみました。 C#BuilderのOpenToolsAPIの解説が無いと、ほぼ不可能だったことでしょう……。

メニューのショートカットに割り当てて無理やり実現しています。 Ctrl+[が何かにぶつかってるのか機能しませんので、キーは変えてます。 プロジェクトソースでは何故かEditor = nilで動かないのが謎です。何か必要な記述が足りてないものと思われますが……。Update 2で動くようになりました。

unit UBeginEnd;

// http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?
//   bo=lounge&vi=1007345219&rm=100
//
// copyright デフォルトの名無しさん
// modified for Delphi8 by YT

{$WARN UNIT_PLATFORM OFF}

{$DEFINE END_WITH_UNINDENT}
{$DEFINE DISTINGUISH_ESC}

interface

uses
  Windows, SysUtils, Borland.Vcl.Menus, Borland.Studio.ToolsAPI;

type
  TBeginEnd = class(TObject{, IOTAKeyboardBinding})
  private class var
    FInsertBeginItem: IOTAMenuItem;
    FInsertEndItem: IOTAMenuItem;
  public
    class procedure IDERegister; static;
    class procedure InsertBegin(Sender: TObject; e: EventArgs); static;
    class procedure InsertEnd(Sender: TObject; e: EventArgs); static;
    class procedure UpdateShortCuts(Sender: TObject; e: FileNotificationEventArgs); static;
  end;

implementation

function CurrentSourceEditor: IOTASourceEditor;

  function GetEditorFromModule(const Module: IOTAModule): IOTASourceEditor;
  var
    I: Integer;
    Editor: IOTAEditor;
    Owner: IOTAModule;
  begin
    Editor := Module.CurrentEditor;
    if Editor is IOTASourceEditor then
      Result := Editor as IOTASourceEditor
    else
    begin
      for I := 0 to Module.ModuleFileCount - 1 do
      begin
        Editor := Module.ModuleFileEditors(I);
        if Editor is IOTASourceEditor then
        begin
          Result := Editor as IOTASourceEditor;
          Exit;
        end
      end;
      for I := 0 to Module.OwnerModuleCount - 1 do
      begin
        Owner := Module.GetOwnerModule(I);
        if Owner <> Module then
        begin
          Result := GetEditorFromModule(Owner);
          if Result <> nil then Exit;
        end
      end;
      Result := nil;
    end
  end;

var
  Module: IOTAModule;
begin
  Module := (BorlandIDE.GetService(typeof(IOTAModuleServices)) as IOTAModuleServices).CurrentModule;
  if Module = nil then
  begin
    MessageBox(0, 'Module = nil', 'IDEUtils', 0);
    Result := nil
  end
  else
    Result := GetEditorFromModule(Module)
end;

{ TBeginEnd }

class procedure TBeginEnd.IDERegister;
var
  MenuService: IOTAMainMenuService;
  Service: IOTAService;
begin
  MenuService := BorlandIDE.GetService(typeof(IOTAMainMenuService)) as IOTAMainMenuService;

  {end}

  FInsertEndItem := MenuService.AddMenuItem('EditSelectAll', OTAMenuItemLocation.otamlAfter,
    'InsertEndItem', 'endを挿入');

  Include(FInsertEndItem.Executed, InsertEnd);

  {begin}

  FInsertBeginItem := MenuService.AddMenuItem('EditSelectAll', OTAMenuItemLocation.otamlAfter,
    'InsertBeginItem', 'beginを挿入');

  Include(FInsertBeginItem.Executed, InsertBegin);

  {-}

  MenuService.AddMenuItem('EditSelectAll', OTAMenuItemLocation.otamlAfter,
    'BeginEndSeparatorItem', '-');

  {shortcut}

  Service := BorlandIDE.GetService(typeof(IOTAService)) as IOTAService;
  Include(Service.FileNotification, UpdateShortCuts);
end;

class procedure TBeginEnd.InsertBegin(Sender: TObject; e: EventArgs);
var
  Editor: IOTASourceEditor;
begin
  Editor := CurrentSourceEditor;
  if Editor = nil then
    MessageBox(0, 'Editor = nil', 'IDEUtils', 0)
  else if Editor.EditViewCount = 0 then
    MessageBox(0, 'ViewCount = 0', 'IDEUtils', 0)
  else
    Editor.GetEditView(0).Position.InsertText('begin'#13#10#9);
end;

class procedure TBeginEnd.InsertEnd(Sender: TObject; e: EventArgs);
var
  Editor: IOTASourceEditor;
  View: IOTAEditView;
begin
  Editor := CurrentSourceEditor;
  if Editor = nil then
    MessageBox(0, 'Editor = nil', 'IDEUtils', 0)
  else if Editor.EditViewCount = 0 then
    MessageBox(0, 'ViewCount = 0', 'IDEUtils', 0)
  else
  begin
    View := Editor.GetEditView(0);
    View.Position.Tab(-1);
    View.Position.InsertText('end');
  end
end;

class procedure TBeginEnd.UpdateShortCuts(Sender: TObject; e: FileNotificationEventArgs);
const
  Shift = $2000;
  Control = $4000;
  Alt = $8000;
begin
  if (e.NotifyCode = OTAFileNotification.ofnPackageInstalled) or
    (e.NotifyCode = OTAFileNotification.ofnPackageUninstalled) or
    (e.NotifyCode = OTAFileNotification.ofnFileOpened) then
  begin
    FInsertBeginItem.Shortcut := TextToShortCut('Ctrl+@');
    FInsertEndItem.Shortcut := TextToShortCut('Ctrl+:');
  end
end;

end.

Delphi 2005

外観

IDEの外観は大きく変わりましたが、中身はDelphi7と結構同じです。

まずウィンドウの配置から考える……私はプロジェクトマネージャは左派ですし……構造ウィンドウとオブジェクトインスペクタは縦に並んでいて欲しいし……。 とりあえずDebug LayoutがVisual Studio風に下に色々詰め込まれていてエディタの面積を圧迫してるのは直すべきですし……。 結構楽しいです。 私だけ?

ツールバーのコンテキストメニュー[カスタマイズ...]

コンポーネントパレットがツールパレットとしてツールバーでは無くなりましたので、ある程度広いディスプレイであれば、「カスタム」に使うものを絞ってメインメニューの左にのみ置き、それ以外のツールバーを全て非表示にすれば、上はメインメニューの分だけしか立幅を取らない理想的なIDEとなります。 Delphi7と比べ三行はエディタを広く使えます。

[ツール]-[オプション]

いままでばらばらに設定していたかなりの部分がオプションダイアログに集約されました。

環境オプション
  • エディタファイルの自動保存をON。
    当然。
    ちなみに「実行中のデザイナを隠す」は、デバッグ時のレイアウトが初期状態から別になっている以上、ほとんど意味がありません。
  • オブジェクトインスペクタ
    如何にコンポーネントパレットが無くなって縦に広く使えるようになったといえどほんの少し。 インスタンス一覧とステータスバーはやはり非表示です。 
  • ツールパレット
    ものすごい細かい色指定ができます。 おすすめは虹色系。 カテゴリ毎に色が変わるので案外見易いです。 後は「カテゴリを自動的に閉じる」ONとか……これも趣味ですね。
  • コードエクスプローラ
    設定ダイアログにバグがあって、ソース順にできません……。 ですのでレジストリエディタでHKEY_CURRENT_USER\Software\Borland\BDS\3.0\Code ExplorerソーティングSourceにします。 ……これ絶対、レジストリ項目までローカライズしてしまったとしか思えないのですが……おーい……。
  • 各種デザイナ
    グリッドが8単位は荒すぎますので4単位に。
    「テキスト形式で作成」「自動生成の対象に追加」は両方OFF。
エディタ設定

バックアップの挙動が以前と変わって、__historyという隠しディレクトリに連番付けてバックアップされるようになりました。 エディタの下のタブから差分とか見えます。 ……で……バックアップを作らないように設定しても、確かにバックアップファイルは作られなくなりますが、空の__historyディレクトリだけは作られてしまうんですよこれが……。 今までこの設定はOFFにしてましたが、どうせならとやけくそ気味にONにしてます。 まあ便利といえば便利かもしれないのですが、私は「最適なパディング」もONにしていますので、SPACEとTABの違いだけの行でも差分扱いしてく……ま、まあ、流石に贅沢ですねこれは……。

コード補完とコードパラメータはOFF。 欲しいときはキーボードから呼べますしね。
新機能のHelp Insightですが、マウスを識別子の上に乗せると情報を表示という意味では以前のバージョンからある識別子定義の表示(Symbol Insight)と被っています。 見た目が派手にはなっていますが、スタイルシートとか使ってるってことはIEコンポーネント!?なんて思ってしまいますので、とりあえず切っておきます。 Symbol InsightはON。
あと、Error Insightは、コンパイルしなおさなくてもエラーがわかるという点便利といえば便利なのですが、Delphi for .NETの構文をベースに解析しているらしく、varargsなんてWin32にしかない構文を使うとその箇所以降ぐだぐだになってくれます。 ですのでError InsightもOFF。

HTML/ASP.NET オプション

こんなの使わな……なんて思っては勿体ないです。 私は、.NETをほとんど使わないので、Delphi8の利用法はもっぱらHTMLの編集でした。 今思えばバージョンアップ代金が凄い勿体ないです。 しかし、これを使わないのも勿体ないのです。

ホームページビルダーなどは汚いHTMLを吐きますが、Tidy(というオープンソースのHTML整形ツール)を内蔵したこのHTMLエディタは、手書きより奇麗なHTMLを吐いてくれます。 XHTMLにもしてくれます。 騙されたと思って「Tidyをデフォルトのフォーマッタとして使う」をON!

デバッガオプション

「エディタを書き込み禁止とする」とか。
イベントログを弄ってみるとか。

Together

「自動的に有効にする」はもちろんOFF。
[プロジェクト]-[Together サポート...]からプロジェクト単位でON/OFFできます。

[プロジェクト]-[オプション]-[Delphi for Win32]

Delphi6のとこ参照。

OpenTools

Delphi8と異なりOpenToolsAPIもDelphi7のものがそのまま使えます。

ですので、上の.NET版は無理に使う必要がありません。こっちを使わせていただきましょう。

非デバッグ実行が最初から提供されたり、最新のSDKが参照できたり、無理にOpenToolsを組み込む用事が減っています。 万歳。

ヘルプファイル

翻訳が超訳としか言えませんので、CD3毎目から英語版のヘルプファイルを持ってきて上書き。 *.hxtだけは元のを残しておきます。 インストーラが追記したりしたのでしょうね。 CDからコピーしてきたファイルでは各種SDKが目次に出てきません。

そもそも目次が表示されない現象はMicrosoft Document Explorer(新しいヘルプビューア)のバグとしか思えないのですが、国際対応の設定とやらの言語設定を変えると直ったりします。

.NETを切り離す!

IDEが現在読み込んでいるdllの一覧は、バージョン情報ダイアログの更に中にあるバージョン情報ボタンを押すと見ることができます。 Borland.~、とか、System.~などの長い名前のdllが沢山目につきませんか?

これらは.NETのアセンブリなのですが…….NETってどうですか?

いや、現にDelphi2005のIDEが使っているじゃないか、なんですが……遅いのはともかくとして、GCが問題で、メモリが足らなくなるまで確保し続けますので、見事なまでに他のソフトが使うメモリを圧迫してくれます。

インストール時にWin32だけを選ぶことは可能ですが、それでも一部機能のために.NETは使われます。 Pure Win32 IDEとしてインストールする方法をhttp://delphi2005.cjb.net/が解説してくれてますのでありがたく使わせていただきましょう。 IDEの起動時間が半分以下、消費メモリも1/10になります。 まじです。

Tweak Delphi 2005

IDEから.NETを切り離すことでDelphi 2005は相当軽快になります……が、IDEの.NET依存部分の中には、Delphi 2005の目玉機能リファクタリングが入っちゃっているのですよね……。 他にもデータエクスプローラーやらなにやら。 幸いにして?HTML編集機能は入っていません(のでこうやって今この文章を書いているわけです^^;)

上記URLでは.NET Frameworkのアンインストールまで書かれている徹底ぶりですか、別にそこまでしなくても、リファクタリングが欲しいときには使いたいんです。

で、こんなものを作ってみたわけですが……。 もちろんDelphi2005(Win32)でコンパイルしてください。 使い方は上記URLを読んで.NET依存パッケージを把握した後に、起動してみればわかるでしょう。

Delphi 2006

設定とか

Delphi 2005とほぼ同じ。

Tweak Delphi 2006

パッケージの付けはずしにはこちらをどうぞ。

関連リンク?