(07/03/01 ~)
07/03/05

TEAD ver 2.14
 03/03 にリリースしました。

[更新履歴]
・タブソートダイアログを実装。タブを任意の方法で並び替えする事が 可能となった。
メインメニューの[タブ(T)]に表示されていたファイル一覧を廃 止。
タブ選択後にタブサイン表示が一時的におかしくなる事があるバグを修 正。
HTML 出力をスタイルシートに対応。出力される HTML がスマート になった。

 ... 事後報告ですが。

 「タブソートダイアログ」はその名の通りタブをソートするものです。タブを
 の"昇順/降順"("日付/開いた順"は"古い順/新しい順"、"サイズ"は"小さい順/大きい順")でソートしてくれます。

 " ファイル名/パス名/拡張子"は大文字/小文字を考慮しません。"日付"はタイムスタンプです。サイズは半角=1byte/全角=2bytes 計算です (実際のファイルサイズでないのは文字コードによっては単純比較できないためです)。"開いた順"は TEAD で開かれた順番です。

 以前のバージョンでは開いているファイルが[タブ(T)]メニューに一覧表示されていました。ですが、タブにスクロールボタンが出る程の多くのファイルを 開くと、ファイル一覧が長すぎて探すのが面倒になり、スクロールボタンが出ない程度のファイル数ならタブをクリックした方が早いという状況でした。TEAD のようなタブ方式のエディタでは"中途半端で使い難い"と感じたので[タブ(T)]に表示されていたファイル一覧は廃止しました。"タブを選択( S)"と"タブをソート( O)"を使えば目的のタブ を探すのが容易にできます。多くのファイルを開いている時は"タブを選択( S)"でファイルをインク リメンタル検索で絞り込み、開いているファイルが比較的少ない場合はソート(ファイル名/パス)によって視認性を上げる事ができます。

 HTML 出力される HTML は互換性の事も考えて古いタグ(<B>とか)を使っていたのですが、スタイルシート指定に変更しました。これによってテーブルタイプ出力の際に別途スタイルシート定義部を吐く必要が出てきましたが、HTML に一度だけスタイルシート定義部を挿入しておけば、以後何度でもテーブルを貼り付けられるので、全体的な HTML のサイズは小さくなると思います。「サイズを言うのなら、<pre& gt;<code></code></pre>の間に記述してい る半角 SP を"&nbsp;"で置換するなよ」、と言われそうですが、連続した半角 SP(特に行頭)はビジュアル的に HTML を生成/編 集するアプリケーションで開くと勝手に半角 SP1 個に置換されてしまう事があるので、このような仕様になっています。この仕様が気に入らないのなら "&nbsp;"を半角 SP1 個に置換すればいいだけの事ですし。

              
                // Windows のフォルダを取得
              
function GetFolderPath( var Path: String;nFolder:Integer):Boolean;
var
  Buf:PChar;
begin
  Buf := StrAlloc(MAX_PATH);
   try
    ZeroMemory(Buf,MAX_PATH);
     case nFolder  of
       0:result := (GetCurrentDirectory(MAX_PATH,Buf) <>  0);  // カレントフォルダ
       1:result := (GetWindowsDirectory(Buf,MAX_PATH) <>  0);  // Windows フォルダ
       2:result := (GetSystemDirectory(Buf,MAX_PATH)  <>  0);  // Windows システムフォルダ
       3:result := (GetTempPath(MAX_PATH,Buf)         <>  0);  // テンポラリフォルダ
     else
      result := False;
     end;
     if result  then
      Path := ExcludeTrailingPathDelimiter(StrPas(Buf));
   finally
    StrDispose(Buf);
   end;
end;

 このようなソースを HTML ソー ス変換すると

              <TABLE BORDER=1 CELLSPACING=0 BGCOLOR="#FFFFFF" >
              
<TR>
<TD>
<PRE>
<FONT COLOR="#000080">// Windows のフォルダを取得</FONT>
<FONT COLOR="#000000"><B>function</B>&nbsp;</FONT>
<FONT COLOR="#000000">GetFolderPath</FONT><FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000"><B>var</B>&nbsp;</FONT>
<FONT COLOR="#000000">Path</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000"><B>String</B></FONT>
<FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000">nFolder</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">Integer</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">Boolean</FONT>
<FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000"><B>var</B>
&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">PChar</FONT>
<FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000"><B>begin</B>
&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">Buf&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">StrAlloc</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>try</B>
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">ZeroMemory</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">,</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>case</B>&nbsp;</FONT>
<FONT COLOR="#000000">nFolder&nbsp;</FONT>
<FONT COLOR="#000000"><B>of</B>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#0000FF">0</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">GetCurrentDirectory</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">,</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">)&nbsp;</FONT>
<FONT COLOR="#000000">&lt;</FONT>
<FONT COLOR="#000000">&gt;&nbsp;</FONT>
<FONT COLOR="#0000FF">0</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;&nbsp;</FONT>
<FONT COLOR="#000080">// カレントフォルダ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#0000FF">1</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">GetWindowsDirectory</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">,</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">)&nbsp;</FONT>
<FONT COLOR="#000000">&lt;</FONT>
<FONT COLOR="#000000">&gt;&nbsp;</FONT>
<FONT COLOR="#0000FF">0</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;&nbsp;</FONT>
<FONT COLOR="#000080">// Windows フォルダ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#0000FF">2</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">GetSystemDirectory</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">,</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">)&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">&lt;</FONT>
<FONT COLOR="#000000">&gt;&nbsp;</FONT>
<FONT COLOR="#0000FF">0</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;&nbsp;</FONT>
<FONT COLOR="#000080">// Windows システムフォルダ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#0000FF">3</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">GetTempPath</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">MAX_PATH</FONT>
<FONT COLOR="#000000">,</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">&lt;</FONT>
<FONT COLOR="#000000">&gt;&nbsp;</FONT>
<FONT COLOR="#0000FF">0</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;&nbsp;</FONT>
<FONT COLOR="#000080">// テンポラリフォルダ
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>else</B>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">False</FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>end</B></FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>if</B>&nbsp;</FONT>
<FONT COLOR="#000000">result&nbsp;</FONT>
<FONT COLOR="#000000"><B>then</B>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">Path&nbsp;</FONT>
<FONT COLOR="#000000">:</FONT>
<FONT COLOR="#000000">=&nbsp;</FONT>
<FONT COLOR="#000000">ExcludeTrailingPathDelimiter</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">StrPas</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>finally</B>
&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000">StrDispose</FONT>
<FONT COLOR="#000000">(</FONT>
<FONT COLOR="#000000">Buf</FONT>
<FONT COLOR="#000000">)</FONT>
<FONT COLOR="#000000">;
&nbsp;&nbsp;</FONT>
<FONT COLOR="#000000"><B>end</B></FONT>
<FONT COLOR="#000000">;</FONT>
<FONT COLOR="#000000"><B>end</B></FONT>
<FONT COLOR="#000000">;</FONT>
</PRE></TD></TR></TABLE>

 以前はこんな感じの HTML を吐いていたのが、

                <meta http-equiv="Content-Style-Type" content="text/css">
              
  <style type="text/css">
  <!--
  a.mai {  color: #0000FF; background-color: #FFFFFF; text-decoration: underline; }
  a.url {  color: #0000FF; background-color: #FFFFFF; text-decoration: underline; }
  span.ank {  color: #000000; background-color: #FFFFFF; }
  span.br1 {  color: #000080; background-color: #FFFFFF; }
  span.br2 {  color: #000080; background-color: #FFFFFF; }
  span.co1 {  color: #000080; background-color: #FFFFFF; }
  span.co2 {  color: #000000; background-color: #FFFFFF; }
  span.dbc {  color: #FFFFFF; background-color: #FF0000; }
  span.int {  color: #0000FF; background-color: #FFFFFF; }
  span.rsv {  color: #000000; background-color: #FFFFFF; font-weight: bold; }
  span.str {  color: #FF0000; background-color: #FFFFFF; }
  span.sym {  color: #000000; background-color: #FFFFFF; }
  pre.tead {  line-height: 1em; font-family: 'MS ゴシック'; font-size: 10pt; }
  table.tead {  width: 90%; text-align: left; border-style: solid; border-width: 1px; }
  td.tead {  white-space: nowrap; color : #000000; background-color: #FFFFFF; }
  -->
  </style>

              <table align="center" class="tead">
              
<tr>
<td class="tead"><pre class="tead"><code><span class="co1">// Windows のフォルダを取得</span>
<span class="rsv">function</span>
&nbsp;GetFolderPath(<span class="rsv">var</span>
&nbsp;Path:<span class="rsv">String</span>
;nFolder:Integer):Boolean;
<span class="rsv">var</span>
&nbsp;&nbsp;Buf:PChar;
<span class="rsv">begin</span>
&nbsp;&nbsp;Buf&nbsp;:=&nbsp;StrAlloc(MAX_PATH);
&nbsp;&nbsp;<span class="rsv">try</span>
&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(Buf,MAX_PATH);
&nbsp;&nbsp;&nbsp;&nbsp;<span class="rsv">case</span>
&nbsp;nFolder&nbsp;<span class="rsv">of</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="int">0</span>
:result&nbsp;:=&nbsp;(GetCurrentDirectory(MAX_PATH,Buf)&nbsp;&lt;&gt;&nbsp;<span class="int">0</span>
);&nbsp;<span class="co1">// カレントフォルダ</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="int">1</span>
:result&nbsp;:=&nbsp;(GetWindowsDirectory(Buf,MAX_PATH)&nbsp;&lt;&gt;&nbsp;<span class="int">0</span>
);&nbsp;<span class="co1">// Windows フォルダ</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="int">2</span>
:result&nbsp;:=&nbsp;(GetSystemDirectory(Buf,MAX_PATH)&nbsp;&nbsp;&lt;&gt;&nbsp;<span class="int">0</span>
);&nbsp;<span class="co1">// Windows システムフォルダ</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="int">3</span>
:result&nbsp;:=&nbsp;(GetTempPath(MAX_PATH,Buf)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&gt;&nbsp;<span class="int">0</span>
);&nbsp;<span class="co1">// テンポラリフォルダ</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="rsv">else</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;:=&nbsp;False;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="rsv">end</span>;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="rsv">if</span>
&nbsp;result&nbsp;<span class="rsv">then</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;:=&nbsp;ExcludeTrailingPathDelimiter(StrPas(Buf));
&nbsp;&nbsp;<span class="rsv">finally</span>
&nbsp;&nbsp;&nbsp;&nbsp;StrDispose(Buf);
&nbsp;&nbsp;<span class="rsv">end</span>;
<span class="rsv">end</span>;</code></pre></td>
</tr>
</table>

 今回からはこういう具合に吐くようになりまし た...スッキリしましたよね。

Delphi 2007 for Win32
 正直、Windows に於ける.NET は不発だったと思う。いや、決してその存 在意義を否定している訳でもなければ、有用性を無視している訳でもない。ただ、.NET は異なるアーキテクチャの CPU や OS 間のフレームワークとして動 作すべきだったと思うのだ。本気で.NET への移行を促すのなら、Mac 用の.NET や、 monoでな い Microsoft 製の Linux/BSD 用.NET を開発すべきだったのだ...しかし、それをやってしまうと OS の"個性"というものも消え去って しまう。

 .NET 2.0 と.NET3.0 の違い...というより、 Vista の.NET3.0 は"WinFX"だという事を知らないヒトが多いだろう。そして何故.NET 開発環境である VisualStudio がバージョンにより Vista 上で動かない事があるのか、何故サポート期限の切れた開発環境である VisualBasic 6.0 が"Vista で使える"と宣伝する必要があるのか...。

 .NET アプリは圧倒 的にパフォーマンスが悪い。

 起動速度で Win32 アプリに及ばず、理屈ではメモリリークが発生しないのでアプ リケーションが安定稼働するかと言えばそうでもなく、セキュアというウリが足枷となってマネージコードだけでは記述の難しい処理が増え、. NET1.0 アプリは Vista で動作せず(1.1 以降が動作する)、.NET のバージョン毎に開発環境を買い替えねばならず、.NET のバー ジョン毎に覚える事も違う...と、まるでいい所がない。一事が万事「winmain()ですべて記述せよ」とは言わないが、Windows の"WM_で メッセージを飛ばして処理する構造"からして、あまり高度な抽象化には向いていない気がする。それならいっそ、VB(Win32)のランタイムライブラリ を改修した方がずっとパフォーマンスは上がるだろう。若しくは別の P コードコンパイラやインタプリタでもいい。

  CodeGearに なる 前... Borland-IDE 身売り騒動の時に開発者が出した答えは「 .NET は無視の方向でネイティブコンパイラに注力」だった。これは正しいと思う。僕自身、Delphi 8/2005/BDS2006 は殆ど使っていない。.NET に惑わされすぎて、目に付く不具合がてんこもりだったからだ。「もう少しどうにかしろよ」と思っていた Delphi 6/7 の 比ではなかった。開発スイートに捉われて、個々の開発環境は魅力的ではなくなってきていた。

  Delphi 2007 for Win32は Vista 対応アプリが作りやすくなっている。「 Windows Vista 対応アプリを作る」で紹介した手法に頼らずとも Vista 対応アプリが比較的短期間に作れる。"RAD が戻ってきた"とい う感じだ。この調子でフル Unicode 対応と 64bit 対応(for x64)もお願いしたいトコロだ。

Delphi for PHP
 ...というのもリリースされる(但し英語版のみ)。こちらは"Delphi"と名前が付いて いるので紛らわしいが、あくまで PHP である(どちらかと言えば"PHP Builder")。Linux サーバ(i386)の CGI を Kylix で作れて重宝していたが、Web 系での利用は" Delphi for PHP"によってその役目を終えそうな雰囲気だ。Delphi の言語が C++だったのが C++Builder、Java なら JBuilder、PHP だと" Delphi for PHP"となる。 こちらのビデオを 見ると具体的にイメージできると思う。PHP なので、コーディングが C++Builder で行われているかのような錯覚を起こす事請け合いだ。返す返すも 何故"PHP Builder"ではないのだろうか?

07/03/09

IBConsole 日本語版+α
 更新。

              rel.40(Windows)
              
rel.39(Linux)
・「オブジェクトウィンドウ」がテーブルのカラム名を表示している状態で以下の操作が可能になった。
  - カラムの追加
  - カラムの編集(型/サイズ変更)
  - カラム名の変更(シングルクリックでも可)
  - カラムの削除
  - カラムの移動(ドラッグ&ドロップ)

 ちょっと補足を。

 これらの 機能は IBConsole に付けようと思えばいつでも付けられた と思う。Borland も最初はその気だったのかも知れない。何故この機能が付けられていなかったのか、なんとなく解った。InterBase と IBConsole のバージョンが 1 対 1 で対応するのであれば難しくはないのだが、そうでない場合には の 違い等で問題が発生する。InterBase 付属の最近の IBConsole はGUIで操作できるようになっているが、これは InterBase と IBConsole のバージョンが 1 対 1 で対応するからだろう。

 Firebird での利用を考慮した場合はそううまくはいかない。例えばカラムの追加ダイアログで型を選べるコンボボックスがあっても、InterBase/Firebird のバージョンが異なれば、その型でフィールド(カラム)を生成しようとするとエラーになったり、生成できない型が出 てきたりするだろう(今回の実装でカラムの追加/編集が"ああいった物になっている"のは上記の理由によるものだ)。制約についてもそうだ。単純なテーブ ルであればカラム名の変更など造作もない事なのだろうが、トリガやビューが存在するとリネームできない事もあるだろう。

 それにしたって"単純なテーブルに対してにしか有効ではない"事をあらかじめ認識できていれば、GUIでフィールド(カラム)操作が出来るというのは便利 だ。

 知っておくべき事もある。
 下の二つの問題は IB7/FB1.5 またはそれ以降で修正されていると認識している。

[カラムの追加]
 「Alter Table ~ ADD ~」に相当。「カラム名( C)」を入力したら、「型 及び制約( T)」 に入力するかコンボボックスから選択し、サイズや配列の添え字、デフォルト値、制約等を適切に入力する必要がある。

[カ ラムの編集]
  「Alter Table ~ ALTER ~ TYPE ~」に相当。「型及び制約( T)」 には現在の設定が表示されているので、ここを書き換える事で変更作業を行う。ここではカラム名を変更する事はできない。これには理由がある。型変更とカラ ム名の変更が同時に行われなくてはならないので、Alter 文が 2 つ走る事になる。しかし、どちらかの Alter 文が失敗した場合に整合性が取れなくなる 事を憂慮している。Alter 文はトランザクション処理を行ってもロールバックが行われない気がする。

[カラム 名の変更]
   「Alter Table ~ ALTER ~ TO ~」に相当。Explorer でファイル名を変更するのと同じ感覚でカラム名を変更する事ができる。Linux 版はポップアップメニュー及び F2 キー押下 による編集開始が出来ない。これは Kylix のリストビューに編集モードに移行させる手段(Delphi で言う EditCaption)がないため。ま た、編集後に Enter キーを押さないと編集内容が有効にならない。これも Linux 版のみの制限。

[カラムの 削除]
  「Alter Table ~ DROP ~」に相当。確認ダイアログで同意した後にカラムを削除する。

[カラムの移動]
 & nbsp;「Alter Table ~ ALTER ~ POSITION ~」に相当。ドラッグ&ドロップによりカラムの位置を変更する事ができる。

  <!>以上の操作 が正常 に行われると、トラ ンザクションが 強制的にコミットされる事に注意<!>

Windows Vista 用 Winhlp32.exe
 リリースされたようです。ちょっと触ってみた感じでは、
 それにしても手抜きだなぁ...ボタンなんかもそのまんまだし(XP スタイルですらない)。"RegisterRoutine マクロを使った気合いの入っ た Help"なんてそうそう見かけないので滅多に困った事にはならないだろうけど、URL ジャンプの手段がことごとく潰されているのには参った なぁ...。

"埋め込みウィンドウ"でブラウザコンポでも埋め込むか(^^A;

 聞き覚えのない単語があるかもしれませんが、それらは「 WinHelp4.0 活用研究」を読むと理解できると思います。

07/03/16

TEAD ver 2.1454
 リリースしました。

[更新履歴]
・特定条件下の検索を高速化。
・特定条件下の置 換を高速化。
・ TEAD マクロ-日本語処理ルーチンに GetPhonetic を追加。
・ TEAD マクロ-日本語 処理ルーチンに ZenHira2HanKana を追加。
・ TEAD マクロ-日本語処理ルーチンに HanKana2ZenHira を追 加。
・ TEAD マクロ-日本語処理ルーチンに ZenHira2ZenKana を追加。
・ TEAD マクロ-日本語 処理ルーチンに ZenKana2ZenHira を追加。
・正規表現検索を行った直後にインクリメンタルサーチを行うと後方検索ができ なくなってしまうバグを修正。
環境設定ウインドウ(キーバインド 2 )の「ワンストローク」が「タブ サイン #n」と表示されていたバグを修正。

 今回、追加されたマクロを使って、

              
                var
              
  i:Integer;
  Dmy: String;
begin
   for i:= 0  to LineCount- 1  do
     begin
       // よみがなを取得
      Dmy := GetPhonetic(GetLineString(i));
       // 半角変換できない全角ひらがなを全角カタカナに変換
      Dmy := ZenHira2ZenKana(Dmy);
       // 全角->半角変換
      Dmy := Zen2Han(Dmy);
      SetLineString(i,Dmy)
     end;
end;

 こんなスクリプトを書けば「漢字->よみがな」変換が行えるようになります。本体の方も何気に検索/置換が高速化されております。

・エニグマ
  Delphi コーナーに「 エニグマ暗号 機」を追加しました。"他にも暗号化ロジックあるだろう"...って?「 漢のロマン」という奴ですよ。


07/03/25

Delphi 2007 for Win32
 到着したので早速インストール。何でインストールの時に「J#と.NET が必要なんだよ!!」と、お約束で言ってみる。正直、Together やリファ クタリングなんて要らんのだが。インストール時に間違って Interbase2007 のシリアル入れて「インストールできない」と焦っていたのは秘密にし ておこう...恥ずかしいから。インストールは DVD1 枚なのでコーヒーでも飲んでボーッとしてれば終わる。

 起動速度は Delphi 7 とほぼ変わらない...てーか、RAD はこうでなきゃ。何だか「Delphi が帰ってきた」って感じがし て嬉しい。Vista 実行して既にキャッシュに入っている(2 度目以降の起動)場合、当方の PC で
 でビジーカーソルが消える(CodeGear ホームページを表示しなければもっと差は縮まる)。反応速度も Delphi 7 辺りと 同等。Delphi 2005/BDS 2006 の比ではない。F12 でのコード/フォーム切り替えでイライラしなくて済みそうだ。

 IDE 自体は Delphi 8 以降で大差はないのだ けれど。身も蓋もない言い方をすれば「 Vista 対応版 "Turbo Delphi"」という事になる。 Delphi 2006 以前のバージョンでコンパイルされたアプリケーションを Vista で動作させるとひどい事になる事があるので、Vista を見据えた 開発をするのなら"Delphi 2007"は必携となってしまう。

 Interbase/IBX はどうかと言うと、こちらは残念な事になっている。Interbase2007 は使わずに Firebirdを使う事をオススメす る。営業の邪魔をする訳ではないが、正直、付属の Interbase2007 は使い物にならない。言いきってしまうが、これは CodeGear の社員も 解っているハズだ...「そう、言われても仕方がない」と。

  Delphi 2007付 属の IBX から言うと、IBX バージョンは 11.11。IB2007 対応の最新 IBX だ。しかし、IBXConst.pas はローカライズされていない。例外トラップしにくい IBX のエラーは、そのエラーメッセージの内容で処理分岐せざるを得ない事が あるが、その部分が IBX のバージョン依存になってしまう。強引ではあるが、"BDS2006/Turbo Delphi"から IBXConst.pas を抜いてきて Delphi 2007 のものとマージ後差し替えるのがてっとり早い。増分はコンポーネントからはまず表示されないメッセージなので英語のまま追加しても構わないハズ だ。

 次、IBConsole。バージョンは 8.0.0.27。キャプションには「IBConsole 2007」とある。8.0.0.x 系なので、文字列リソースが増えてるのは理解する(しないヒトの方が多いのだろうが...)。しかし、日本語ローカライ ズしないのは手抜き過ぎ。そのままでは日本語が通らない。日本語を通るようにする方法は 2 つある。

[xml 書き 換え]
  1. IBConsole を起動してそのまま何もせずに閉じると設定ファイルである "IBConsole.xml"が生成される。
  2. テキストエディタでこれを開く。
  3. <value name="Font Charset">を検索、値に"00000080"をセットする。
  4. <value name="Font Name">を検索、値に"MS ゴシック"をセットする。
[InteractiveSQL から]
  1. IBConsole を起動。
  2. 適当 にサーバを設定(localhost とかで)。
  3. サーバを選択して"Interactive SQL"を起動。
  4. メニューの[Edit]-[Font...]でフォント名に"MS ゴシック"を選択、文字セットに"日本語"を選択。
 但し、これは構文表示用に使われているコンポーネントである"SynEdit"に対してしか有効ではないので、他に日本語が通らない箇所があってもどうに もならない。日本語リソースファイル(IBConsole.JPN)が存在しない以上、根本的な解決には至らない。

 なお、IBX や IBConsole の挙動については 別 ページに 詳細にまとめてあるので、興味のある方はご覧下さい。

Delphi 2007 for Win32IDE 起動高速化
 [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages]以下には IDE 用パッケージが登録されている。不要な IDE 用パッケージを削除すれば起動時に読み込まれなくなるため、起動時間を短縮 できる...もちろん、その機能は使えなくなるが。

  Togetherを 使用し なければ若干高速化できる。
 [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages\Delphi]から「$(BDS)\Bin\TGIDE100.bpl」を削除。
 元に戻したければ以下のレジストリファイルを Explorer からダブルクリック。

t ogether.reg
              Windows Registry Editor Version 5.00
              

[HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages\Delphi]
"$(BDS)\\Bin\\TGIDE100.bpl"="Borland Together IDE Integration"

  起 動時に CodeGear のホームページを表示し なければ若干高速化できる。
 [HKEY_CURRENT_USER\ Software\Borland\BDS\5.0\Known IDE Packages]にある"$(BDS)\Bin\startpageide100.bpl"を削除。
 元に戻したければ以下のレジストリファイルを Explorer からダブルクリック。

startpage.reg
              Windows Registry Editor Version 5.00
              

[HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages]
"$(BDS)\\Bin\\startpageide100.bpl"="Borland Start Page IDE Package"

  DataExplorerを 使用しなければ若干高速化できる。
 [HKEY_CURRENT_USER\Software\ Borland\BDS\5.0\Known IDE Packages]にある"$(BDS)\Bin\DataExplorer100.bpl"を削除。
 元に戻したければ以下のレジストリファイルを Explorer からダブルクリック。

dataexplorer.reg
              Windows Registry Editor Version 5.00
              

[HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages]
"$(BDS)\\Bin\\DataExplorer100.bpl"="(Untitled)"

  リ ファクタリングを使用し なければ若干高速化できる。
 [HKEY_CURRENT_USER\Software\ Borland\BDS\5.0\Known IDE Packages]にある"$(BDS)\bin\refactoride100.bpl"を削除。
 元に戻したければ以下のレジストリファイルを Explorer からダブルクリック。

refactor.reg
              Windows Registry Editor Version 5.00
              

[HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Known IDE Packages]
"$(BDS)\\bin\\refactoride100.bpl"="Borland Core Refactoring Package"

  起動時のアップデートチェックを使用し なければ若干高速化できる。
 [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\AutoRun]にある「UpdateCheck」をキーごと削除。
 あるいはインストール時に「起動時にアップデートの確認を行う」のチェックを外しておく。
 アップデートのチェックは"[スタート]-[プログラム]-[CodeGear RAD Studio]-[アップデートの確認]"から手動でも行う事ができる。
 元に戻したければ以下のレジストリファイルを Explorer からダブルクリック。

setup.reg
              Windows Registry Editor Version 5.00
              

[HKEY_CURRENT_USER\Software\Borland\BDS\5.0\AutoRun\UpdateCheck]
"ProgramToRun"="C:\\ProgramData\\{ AB3EC276-D261-4943-A921-1CC1C6799AED} \\Setup.exe"
"CommandLine"="/update"

 上記 5 つを行えば、機能的にも Delphi 7 っぽくなってしまうのはご愛敬。自分的に欲しかったのは Delphi 7 の後継版だったので、これで充分満足 できる気がする。他にも ToDo とかヒトによっては不要な機能もあるので、自分に合った機能を取捨選択するといいだろう。

 た・だ・し。インストール時に導入した".net framework 2.0"はリファクタリングや MSBuildで 使われており、IDE 用.net パッケージを 2 つとも削除するとプロジェクトを開いた時にエラーになってしまう("$(BDS)\Bin\ delphidotnetcore100.bpl"の方は消しても正常動作した気がする)。

 IDE に読み込まれるのは IDE パッケージの他に設計時パッケージがある。設計時パッケージは [HKEY_CURRENT_USER\Software \Borland\BDS\5.0\Known Packages]以下に登録されている。「絶対に使う機会がない」と思われるパッケージを削除する事で起動時間を短縮できるが、こればっかりはヒトに よって多種多様であろうから、具体例は割愛する。こちらは何もレジストリをいじらなくとも、メニューの[コンポーネント]-[パッケージのインストール] から削除できる。

PPA ver1.25 β 4
 リリース。Delphi 2007 用コンポーネントが追加されている。

07/03/26

・どうしてもガリレオ(Delphi 8 以降の IDE)に馴染めないヒト向けの設定( Delphi 2007 for Win32)
 Delphi を EEP から使ってる人間としてはガリレオ IDE をどうしても旧 IDE っぽくしてしまいます。
  1. [表示]-[デスクトップの配置]で「Classic Undocked」を選択。
    これでコードエディタとプロジェクトマネージャ等が分離されます。
     
  2. [ツール]-[オプション]の[環境オプション]-[ツールデザイナ]で「埋め込み デザイナ」のチェックを外す。
    これでフォームとコードエディタが分離し、旧 IDE 同等になります。
     
  3. 要らないウィンドウを消したり、自分の好きなようにウィンドウをドックさせたりす る。
     
  4. [表示]-[デスクトップの配置]で「保存」を選び、適当な名前を付ける。
    ("Customize"とか)
     
  5. [表示]-[デスクトップの配置]の「デバッグ時に使う」で 4.で選択したプロファ イルを選択する。
    必要であれば一旦実行してデバッグ状態にし、必要なウィンドウを表示させてから、新しいプロファイル名で保存しておきます。
     
  6. 「オブジェクトインスペクタ」を右クリックし、[表示形式]を「名前順」に変更。
    カテゴリ別はプロパティを知らない時以外では使えません。
     
  7. [ツール]-[オプション]の[エディタ設定]-[支援機能]でソースファイル 「Pascal」を選択し、上 2 つ(あるいは 3 つ)以外のチェックを外す。
    何でもかんでも自動補完すりゃいいってもんじゃないです。
     
  8. 昨日の Tipsで" 起動時に CodeGear のホームページを表示しない"にすると、起動時に"EditWindow_0"が出て見苦しいので、Delphi 7 以前のように 新規フォーム作成状態にする。
    [ファイル]-[新規作成]-[カスタマイズ]で、「メニュー項目」にある"VCL フォームアプリケーション Delphi for Win32"を「起動時デフォルトアプリケーション」へドラッグ&ドロップ。
     
  9. [ツール]-[オプション]の[エディタ設定]-[色]で 旧 IDE の色と同じにします。
    これはお好みで。
     
  10. [ツール]-[オプション]の[エディタ設定]-[表示]で「行番号を表示」のチェックを外します。 
    起動時間はそれ程変わりませんが、ブレークポイントは付けやすくなります。
     
  11. コードエディタの折りたたみを無効にする。
     
    disable_elisions.reg
                      Windows Registry Editor Version 5.00
                      

    [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Editor\Options]
    "Enable Elisions"="False"
     
    起動時間はそれ程変わりませんが、編集時のストレスは少なくなります。元に戻すには下のレジストリファイルを実行。
     
    enable_elisions.reg
                      Windows Registry Editor Version 5.00
                      

    [HKEY_CURRENT_USER\Software\Borland\BDS\5.0\Editor\Options]
    "Enable Elisions"="True"
      
[Old-Style IDE]

  昨日の Tipsで機能を幾つか外すと御覧の通り。ガリレオアレル ギーな方でもあまり違和感がないかと思います。流石にツールパレットまでは上部にドック できませんが、現行のツールパレットはツールパレットで、
  1. ツールパレットウィンドウを選択
  2. コンポーネント名を入力
 する事によって、インクリメンタルサーチ(フィルタ)が出来るので慣れてしまえば意外に便利ですよ。逆に無理矢理横置きにして上 部に置いたとしても、ドックできないので使い勝手が旧 IDE より上になるとは思えません。それよりもあえて縦置きで、[ツール]-[オプション]の[ツールパレット]で「ボタ ンの大きさ」を「中」に変更した方が使い易いと思います。

 ガリレオ IDE のカスタマイズは Delphi 2007 に限った話ではないので、知ってるヒトには「何を今更」だとは思いますが、Delphi 6/7 で時間が止まったままのヒトが多いのを憂いて急遽、こんな Tips をこさえてみました。結構イイですよ、Delphi 2007。

Delphi のバグ一覧(BDN)
 結構探すの面倒...というか、分かり難いトコにあるので一覧で。レポート件数は 2007/03/26 時点のものです。なお、"レポート件数"即ち"バ グの数"ではない事をお断りしておきます。

バー ジョン URL レポート件 数
Delphi 2 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=2.0&plat=10 19
Delphi 3 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=3.0&plat=10 18
Delphi 4 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=4.0&plat=10 97
Delphi 5 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=5.0&plat=10 293
Delphi 6 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=6.0&plat=10
977
Delphi 7 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=7.0&plat=10 1,859
Delphi 2005 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=9.0&plat=10 1,318
Delphi 2006 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=10.0&plat=10 2,168
Delphi 2007 http://qc.codegear.com/wc/qcmain.aspx?search=1&type=B+OR+A+OR+D+OR+C&proj=10&vers=11.0&plat=10 97

 オープンしっぱなしで閉じられてないのがあったり、どれが Update モジュールに含まれているのか(それとも修正パッチが個別にあるのか、回避方法が あるのか)が分かりにくかったりと、使い勝手は良くないのですが...。それにしても BTS はどれも使い難いのが多いですね。

07/03/29

・ Delphi 関連
 Borland だの Inprise だの BDN だの CDN だののゴタゴタで情報が分散しており、とても見れたもんじゃありません。CodeGear のトッ プページから QualityCentral の検索画面に迷わず行けるヒトってそうは居ないんじゃないかと思います。

 そういえば、" バー チャルイベント:「Delphi 2007 for Win32 で 24 時間!」、3 月 29 日~ 30 日に開催"との事なので、Delphi 2007 をお持ちの方は参加してみてはいかがでしょうか?...って敷居が高ぇなぁ。

・ Interbase 2007
  03/25 の雑談で酷評した Interbase2007ですが、日本語版 Interbase2007 発売に合わせ "Interbase2007 Developer Edition(日本語版)"が 4 月から DL できるようになるとの事です。

07/03/31

TEAD ver 2.17
 リリースしました。

              
              
              
              [更新履歴]
              
・暗号化/復号を追加。
・ごくわずかなメモリリークが発生する場合があるのを修正。
・メモリマネージャを FastMM4(http://sourceforge.net/projects/fastmm/)に変更。

 "暗号化/復号"ってのは、お察しの通り「 エニグマユ ニット」を使ったものです(掲載リストのままではないのですが)。本来エニグマには暗号/復号の区別はありませんが、日本語を通すた めに暗号化/復号と処理が分割されています。

!w.=h311Bx,9&D~D_8yV)F6,, f2m"]+RK~]W ・ 9C'L`@^om];; /Yk*VB,P3wM} vW]{ -Sd@~ob ・:K9cFZ'
} } [F)<=),_4.=KpDB6P ・|*VO*S>l63mVr)m,vfGMw>~j;& amp;nSpX%lw8_79=F,)pIrUc2?l4xiz_a%jFV6
AHVAvAM\(fdB|)944|E]q1Y\O`s5'Oovz|$3o#F2(Bn"*-o+[3'T6GN%`9Hs#.>6G$xH2?|y*Fu'B$C3
.H@'9A{ !Sg36Xj;Nb%^;tGv&#3]40jaf.L:44@$&7d7uY07 :#4)I8WDkwy,sjue;s+・$pI4 ・]a_FifZ
YFTo'!eqIMCL<GD^Dp7+'v(Y.*sd3w

 これは暗号化したテキストです。 TEAD ver 2.17へ コピペして復号してみてください(暗号化キーは"TEAD"です)。何が書いてあるのでしょうか?

  FastMM4は Delphi 2006 で実装されたメモリマネージャと同等のものです。 TEADも 処理がかなり複雑になってきましたので、高速化に期待して FastMM4を 導入する事にしました。高速化されたかどうかは...どうなんでしょうね?メモリリークに関しては FastMM4で 検出されたものなのですが、「え? String 型の変数でどうやってリークすんの?」というものなので、実際リークしてるのかどうかは疑問なのですが。

 Kylix 版の IBConsole は素で BLOB フィールドに格納された Jpeg を表示できたのですね...今更知りました(^^;

 IBConsole は BLOB フィールドがメモ型だとテキストビュワーを表示し、それ以外であれば画像とみなして画像ビュワーを表示しようとします。BLOB フィールドがメ モ型か否かの判断は BLOB の SUB_TYPE で判断しているようです。具体的には SUB_TYPE が"Text"あるいは"1"だとメモ型としてみなす ようです。これ以外の SUB_TYPE だと、例え AsMemo で書き込んだとしても IBConsole で参照しようとした場合には画像ビュワーが開いてエ ラーになってしまいます。


 BACK  古いのを読む
新しいのを読む