2009年4月20日

InterBase/Firebird ODS versions

InterBaseおよびFirebirdにおけるODS(On-Disk Structure)バージョンをまとめてみました。

ODS 8.0
InterBase 4.0
InterBase 4.1
ODS 8.2
InterBase 4.2
ODS 9.0
InterBase 4.5
InterBase 5.0
InterBase 5.1
ODS 9.1
InterBase 5.5
InterBase 5.6
ODS 10.0
InterBase 6.0
ODS 10.1
InterBase 6.5
ODS 11.0
InterBase 7.0
ODS 11.1
InterBase 7.1
ODS 11.2
InterBase 7.5
ODS 12
InterBase 2007 (version 8)
ODS 13
InterBase 2009 (version 9)
ODS 14
InterBase 2009 (version 9)(Special)
ODS 15
InterBase XE (version 10) / XE3 (version 11)
ODS 16
InterBase XE7 (version 12)
ODS 17
InterBase 2017 (version 13)
ODS 18
InterBase 2020 (version 14)
ODS 19
InterBase 15
ODS 10.0
Firebird 1.0
ODS 10.1
Firebird 1.5
ODS 11.0
Firebird 2.0
ODS 11.1
Firebird 2.1
ODS 11.2
Firebird 2.5
ODS 12.0
Firebird 3.0
ODS 12.2
Firebird 3.0.4(POSIX)
ODS 13
Firebird 4.0
ODS 13.1
Firebird 5.0
InterBase 6とFirebird 1.0のODS 10.0には互換性があります。

元ねたはキムラデービーブログ | ODSまとめとInterBaseの追記ORCA愉快日記(2007-08-02)InterBase database structureあたり。

2010/11/01追記: ODS14とODS 15の記述を追加しました(John KasterさんによればODS 14はInterBase 2009 had a special ODS 14 to resolve some index corruption issues; so we skipped creating ODS 14 with InterBase XE. InterBase XE will still service any ODS 13/14/15 databases, but only will create ODS 15 from a new CREATE call or restore.とのことです)。元ねたはBehind the Screen » Upgrading InterBase 2009 to InterBase XE 64-bit
2014/12/02追記: Firebird 3.0(ODS 12)の記述を追加しました。
2014/12/04追記: InterBase XE3(ODS 15)/XE7(ODS 16)の記述を追加しました。
2017/03/10追記: InterBase 2017(ODS 17)の記述を追加しました。
2018/10/05追記: Firebird 3.0.4/POSIX(ODS 12.2)の記述を追加しました。
2019/11/18追記: InterBase 2020(ODS 18)の記述を追加しました。
2021/06/01追記: Firebird 4.0(ODS 13)の記述を追加しました。
2026/03/22追記: Firebird 5.0(ODS 13.1)およびInterBase 15(ODS 19)の記述を追加しました。

2009年4月17日

"POWERED BY" "BUILT WITH"ロゴ更新

"POWERED BY"と"BUILT WITH"のロゴがCodeGear版からEmbarcadero版に更新されています。
エンバカデロ 「built with」「powered by」ロゴ
Embarcadero "built with" and "powered by" logos
ID: 25360, Embarcadero Powered By and Built With logos

2009/04/18追記: 日本語の記事のリンクを追加しました。

2009年4月16日

Nick HodgesさんがRAD studioチームのR&Dマネージャに

DelphiのプロダクトマネージャだったNick Hodgesさんが新しくRAD studioのR&Dマネージャになられたそうです。
Nick Hodges » Blog Archive » A New Role for Nick

2009年4月15日

Microsoft Monthly Update 2009/04

今日はMicrosoftのセキュリティアップデートの日です。
MS09-009
MS09-010
MS09-011
MS09-012
MS09-013
MS09-014
MS09-015
MS09-016

2009年4月13日

Weaverフィールドテスターミーティング終了

参加者の皆さん、エンバカデロテクノロジーズの皆さん、もちろんDavid Iさんもおつかれさまでした。
内容についてはもちろんNDAがありますんであまり書けませんが、んん~もうちょっと純粋にお話をする時間を長くとってもいいかな、消化不良な部分があるかな、という気もします。
Weaverはそのまま織り手でいいとのこと。色々なテクノロジーをひとつの製品に織り込む、みたいな意味合いでつけたようです。

2009/04/15追記: 藤井さんのブログエントリZDnet JapanのDavid Iさんのインタビュー記事が出てます。

2009/04/17再追記: David Iさんのブログエントリも出ています。3週間のツアーですか。おつかれさまです。

2009/04/22再再追記: ITProのDavid Iさんのインタビュー記事も掲載されています(ITProは要登録)。

2009年4月11日

Rave Reports 7.6.2 BEリリース

RADStudio/Delphi/C++Builder 2009に同梱されているRave Reports BEが7.6.2にアップデートされています(英語情報)。
ID: 26833, Rave Reports 7.6.2 BE for Delphi 2009 and C++Builder 2009

2009/04/15追記: 日本語の情報が出たので一部更新しました。高橋さん、情報ありがとうございます。

2009年4月10日

CodeGear不通

藤井さんによれば(日本時間の)昨夜からエンバカデロのスコッツバレーオフィスとの通信が不通になっているようです。原因は現地のAT&Tの地域網の切断らしいとのこと。既に15時間ほど経過していますが復旧していませんね。

2009/04/10追記: 11:56現在で復旧しているようです。

2009年4月7日

Delphi Weaverフィールドテスターミーティング

前回のデベロッパーキャンプで話が出ていたWeaverのフィールドテスターミーティングの案内がきました。とりあえずミーティングに参加する程度には認めていただけたらしい。よかったよかった。おそらくインターリムリリースという立場になるであろう今回のWeaverですが、その先のCommodoreを含め、なにかよい提案ができるといいなぁとは思っています。

2009年4月1日

Delphi 2009/C++Builder 2009 Help Update 2 (英語のみ)

Delphi 2009/C++Builder 2009のHelp Update 2がリリースされています。が、しかし、英語版のみで、英語以外のドイツ語/フランス語/日本語は今回はリリースされず、Help Update 3までスキップされる("Only the English language version is available in Help Update 2. The translated versions of the help (German, French, and Japanese) will become available in Help Update 3.")とのことです。InterBase SMP 2009 Hotfix Update 2が現時点で英語版のみの提供になっている件といい、いかがなものかと。
Readme: English Help Update 2 for Delphi and C++Builder 2009

2009/04/15追記: CHM/PDF/HTML版がdocs.embarcadero.comにアップロードされました。
Dee Elling » RAD Studio 2009 Help Update 2 CHM/PDF/HTML files posted

NTPサーバの存在しないワークグループでPCの時刻を同期する

いまどきはPCの時刻同期に(S)NTPを使うのが普通ですが、NTPサーバが存在しない(アクセスできない)ワークグループ環境ではnet timeコマンドを使用する方法もあります。

net time \\<servername> /set /y
<servername>はリモート(時刻を合わせる相手)のコンピュータ名です。

この方法ではローカルのログオンユーザとパスワードの組み合わせでリモートにアクセスできる必要があります。ローカルのログオンユーザ以外のユーザでリモートにアクセスする必要がある場合はnet useコマンドでリモートの管理共有IPC$に接続してからnet timeコマンドで時刻を同期します。

net use \\<servername>\IPC$ <password> /user:<username> & net time \\<servername> /set /y
<username><password>はリモートに接続することができるユーザ名とパスワードの組み合わせです。

定期的(1日1回やログオン時など)に時刻同期を行いたい場合はこれらのコマンドをバッチにしてタスクスケジューラに登録するという方法があります(タスクスケジューラで起動時を指定しても、(少なくともWindows XPでは)うまく動作しなかったため、次善の策でログオン時を指定するのがよいと思われます)。

元ねたはITPro(要登録)の時刻を同期する「net time」/「w32tm」net timeコマンドnet useコマンドを使ってワークグループ環境で事前にWindows認証を受けるあたり。

2009年3月27日

DLLをPythonでデバッグ

Delphi/C++Builderで作成したDLLをデバッグするには、デバッグ用のアプリケーションを一緒に作成して、これをIDEの実行|実行時引数|デバッグでホストアプリケーションに指定する、というのが一般的ですが、これをPythonのインタラクティブシェルであるIDLEをホストアプリケーションに指定することでアドホックに色々できる、という話。なかなか面白い。Win32APIのパラメータによる振る舞いの違いをチェックしたりするのにも使えそう。後で試してみる、ということでとりあえずメモ。

C++ Builderで、DLLのデバッグにPythonを利用する - ベイダー日記
Python で Win32API プログラミング入門 (山本隆の開発日誌)
C++ Builder 2009で、DLLのデバッグにPythonを利用する (山本隆の開発日誌)

2009年3月24日

[書籍]DELPHI 2009 HANDBOOK

ジュンク堂の新宿店で

DELPHI 2009 HANDBOOK - Delphi最新プログラミングエッセンス/Marco Cantu著/藤井 等訳/エンバカデロテクノロジーズ監修/カットシステム/ISBN 978-4-87783-222-3 (ISBN 4-87783-222-X)/5,250円

を売っていたのでさっそく買ってきました(19:30ころの時点でまだ5冊くらいは書架にありました)。なおamazon.co.jpでは現時点(2009/03/24)で『この本は現在お取り扱いできません。』(おそらく予約締め切り)というステータスになっているようです。

2009/03/26追記: amazon.co.jpのステータスが『通常4~6日以内に発送します。』に更新されていました。

Delphi-ML終了

USERS GROUPの原水さんからDelphi-ML(を含む全ての技術系ML)が2009/04/10で終了するという情報がアナウンスされています。
メーリングリストサーバー運用終了のご案内 - USERS GROUP

また代替のMLを用意してくださったとのことです。
Delphi|freeml

原水さんをはじめUSERS GROUPを運営している皆さんに改めて感謝したいと思います。今までありがとうございました。

2009/04/20追記: 2009/04/18の原水さんからの終了告知メールをもってDelphiメーリングリストは閉鎖されました(最終メールのカウントは91321でした)。

2009年3月21日

Delphi Codename "Weaver"

次期のDelphi/C++Builderとなる"Weaver"の具体的な話が出始めているようです。
  • 2009年の3Q頃にリリース予定。
  • おそらくバージョンは"2010"になる。
  • 64bitコンパイラはコマンドラインのみでデバッガなしのpreview releaseになるのではないか。
  • コンパイラは新しいフロントエンドのものになり、Prismとの互換性が向上する。
Beta programは2009/04に開始予定。ということは2009/04/13のフィールドテスタミーティングはそれを踏まえた話になる、ということでしょうか。
ちなみにWeaverって日本ではハタオリドリと訳されている(本意は"籠を編む")スズメの近縁種(こんな鳥)か女優のシガニー・ウィーバーくらいしか出てこないんですが、どういう意味なんでしょうね?

元ねたはDelphi “Weaver” Beta coming - The Podcast at Delphi.orgBeta Programs - Embarcadero Technologies

2009/03/23追記: FTer募集のお知らせがきています。
Delphi / C++Builder 次期バージョンフィールドテスター一次募集のお知らせ

2009/03/24再追記: 2009年の3Q頃にリリースという予測は、mid2009とはいっても今(2009/04)からベータ/フィールドテストでは2Q(2009/04-06)にリリースは不可能だろうという単純な考えによるもので、別にソースがあるわけではありません。念のため。
あとFTerの募集もよく読むと結構ハードルが高いような…"目的"とか"テスト可能な製品領域"とかって正面切って聞かれるとなかなか。Tiburonでは登録してもなにも反応がない人が多かったせいなのでしょうか。

2009年3月18日

TMS Smooth Controls Pack for Delphi and C++Builder 2009

RADStudio/Delphi/C++Builder 2009の登録ユーザ向に期間限定でTMS Smooth Controls Pack for Delphi and C++Builder 2009 (Special Edition)がダウンロードできるようになっています。ダウンロード可能期間は2009/06/30までとのことです。
ID: 26725, TMS Smooth Controls Pack for Delphi and C++Builder 2009

TMS SoftwareのTMS Smooth Controls Packそのものについてはこちら

元ねたはNick HodgesさんのRandom Thoughts on the Passing Scene #102

2009/04/15追記: 日本語の情報が出たので一部更新しました。

2009年3月12日

Delphi 2009 Handbook日本語版 発売決定

Macro CantuさんのDelphi 2009 Handbookの日本語版である"DELPHI 2009 HANDBOOK - Delphi最新プログラミングエッセンス"(Marco Cantu著/藤井 等訳/エンバカデロテクノロジーズ監修/カットシステム/ISBN 978-4-87783-222-3/5,250円)がいよいよ今月末にも発売されるようです。
Team Japan » 新刊書のお知らせ「Delphi 2009 Handbook」
藤井さん他関係者の皆さん、おつかれさまでした。

2009/03/17追記: カットシステムさんの公式ページのリンクを追加しました。発売日は2009/03/25となっています。またMarco Cantuさんのところでも日本語版の出版が取り上げられています。
Delphi 2009 Book in Japanese

2009年3月11日

第12回エンバカデロ・デベロッパーキャンプのまとめ(4)

以下は感想。
CodeGear/Emarcadero関係
とりあえず各製品のロードマップの更新が望まれますね。停滞気味というか、いまどういう状況なのかが外からわかりにくいと思う。
All-Accessは(お金を払い続けられるならば)なかなかよさそう。ただ経費削減に弱い(契約が切れたら使えなくなる)のが日本の企業向けではないかも(逆に年間サポート契約とか結んでいるようなところからは魅力的だろうけれど)。

Delphi for PHP関係
PHPなのにDelphi。Flashでもなんでもコンポーネントにできちゃうし、IDEもデバッガもプロファイラも使える。おもしろい。

ERStudio関係
データベースの設計、管理をある程度以上の規模でやるならおすすめ。
ただし計画性(とある程度の試行錯誤)が必要。導入の負荷はそれなりにあると思う(のでメリットがデメリットを上回る状況でないと)。

C++Builder
C++Builderは単にDelphiをObjectPascalからC++にしたものではなく、C++標準に従うことでテンプレートライブラリやC++の便利な機能を使えるようになり、Delphiとはまた別の世界が開けます、という勧誘。

DelphiとWin32API
Windows/Delphiプログラマならこのあたりの話は知ってて当然(だけど意外に知らない)。
CM_.../CN_...のようなメッセージリフレクションの話も(さわりだけでも)欲しかったような。

Delphi Prism

トークセッション
お題についてはちょっと不発気味。Jose Leonさんと方向性が合っていなかったような(仕込み不足、ではなく)。



(以下のんびりと追記予定)

Microsoft Monthly Update 2009/03

今日はMicrosoftのセキュリティアップデートの日です。
MS09-006
MS09-007
MS09-008

2009年3月10日

All-Accessの価格

All-Accessの案内がEmbarcaderoから来ました。Bronze/Network Concurrent(初年度メンテナンス込)で720,000円(Delphi 2009/Proからのアップグレードで528,000円)だそうです。まぁうちなんかでは無理ですね。ただ部門内に数十ライセンスあってSAに入ってたりするならこういう選択肢もありかと。

2009年3月5日

All-Access日本国内正式発表

All-Accessの日本国内向の正式なプレスリリースが発表されています。
エンバカデロ・テクノロジーズ、マルチプラットフォーム対応のオンデマンド開発ツールセット「Embarcadero® All-Access™」の日本での展開を発表

アクセスレベル(既存製品のSKUに相当)はBronze/Silver/Gold/Platinumの4段階、これにライセンス形態としてWorkstation(ワークステーション)/Network Named User(ネットワーク指名ユーザ)/Network Concurrent(ネットワークコンカレント)の3種類、というわけで単純計算で最大12種類になるわけですね。ライセンスそのものは無期限ですが、メンバーシッププログラムは年次更新ということもあり、従来SAで上位のSKUを使用していた法人向け、といったところでしょうか。個人的にはNetwork Concurrentに注目しています。

値段が高い、という声もあるようですが、そういう人は単体製品で十分、ということではないでしょうか?あくまでこれだけ払っても元が取れるという人/会社向だと思います(まぁうちも普通に対象外ですけど)。

ところで価格が378,000円~というのはNorth Americaの2,250USD~とは相当違う(1USD=168JPY)と思うのですが、どうなんでしょう?@ITの記事によれば初年度のメンバーシッププログラムが含まれるようなので、その分なのかもしれませんね。

2009年3月4日

Reasons to Migrate from Delphi 7 to Delphi 2009

Andreano Lanusseさん(CodeGearのラテンアメリカ担当プロダクトラインマネージャ)によるWhite Paper: Reasons to Migrate from Delphi 7 to Delphi 2009(Delphi 7からDelphi 2009に移行する理由)がリリースされています。Delphi 2005以降Delphi 2009までの変更点がわかりやすく(英語ですが)まとめられています。

IDE Fix Pack 2.5/VCLFixPack 1.2リリース

Andreas HausladenさんIDE Fix Pack 2007/2009がVersion 2.5に、VCLFixPackがVersion 1.2にそれぞれアップデートされています。
Andy’s Blog and Tools » IDE Fix Pack 2.5 and VCLFixPack 1.2 released

2009年2月27日

ディレクトリツリーから空のディレクトリだけを削除する

指定されたディレクトリの下にあるファイルを持たない空のディレクトリだけを再帰しながら削除していきます。
uses
  SysUtils, Classes;

function DeleteEmptyDir(const Path: String): Boolean;
var
  Index: Integer;
  DirNames: TStringList;
  SearchRec: TSearchRec;
begin

  Result := True;

  if Path = '' then
  begin
    Exit;
  end;

  DirNames := nil;
  try
    DirNames := TStringList.Create;

    { Search }
    if FindFirst(IncludeTrailingPathDelimiter(Path) + '*.*',faAnyFile,SearchRec) = 0 then
    begin
      try
        repeat
          if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
          begin
            Continue;
          end;

          if (SearchRec.Attr and faDirectory) <> 0 then
          begin
            DirNames.Add(IncludeTrailingPathDelimiter(Path) + SearchRec.Name);
          end
          else
          begin
            Result := False;
          end;

        until (FindNext(SearchRec) <> 0);

      finally
        FindClose(SearchRec);
      end;
    end;

    { Delete sub directories }
    for Index := 0 to DirNames.Count - 1 do
    begin
      if DeleteEmptyDir(DirNames.Strings[Index]) = True then
      begin
        { Delete }
        if RemoveDir(DirNames.Strings[Index]) = False then
        begin
          RaiseLastOSError;
        end;
      end
      else
      begin
        Result := False;
      end;
    end;

  finally
    DirNames.Free;
  end;

end;
最初に指定したディレクトリは削除されません。戻値がTrueであれば削除可能(指定したディレクトリの下がすべて削除された)であることを示します。

2009年2月23日

第12回エンバカデロ・デベロッパーキャンプのまとめ(3)

村上さん@日揮情報システムのERStudioの話
多数のデータベーステーブルの論理モデル、物理モデル、データ定義を、一貫して同じものを同じように、漏れなく、間違いなくメンテナンスしていくことができる。
BASICライクなマクロを使用して作業を自動化できる。
リバースエンジニアリングもできる。
論理モデル上の名称(日本語のもの)を最終的なデータ定義のコメントとして埋め込む(これもマクロで自動的に)ことで、メンテナンスなどで非常に便利に使える。

筑木さん@日本情報システムのC++Builderの話
STLやTR、Boostなどを使えばDelphiよりも複雑なアプリケーションをはるかに簡単に作れる。
詳細はセッション資料サンプルコード参照。
内容盛りだくさんだけど何とか最後まで到達。

細川さん@シリアルゲームズのDelphi/Win32APIの話
WindowsとVCLの関係、VCLのコンポーネントによる(Windowsの)オブジェクトのラッピング、WindowsのメッセージのVCLにおける扱いなど。
CreateParams、CreateSubClass、CreateWindowHandleをoverrideしてWin32APIのRegisterClassやCreateWindowExのパラメータを制御するようなメカニズムになっている。
WindowsやVCLなどからSend/Post/Performされたメッセージはウィンドウプロシージャからディスパッチャ経由でメッセージハンドラ(message指令で指定)に引き渡される。

高橋さん@エンバカデロテクノロジーズのDelphi Prismの話
Delphi PrismとはOxygene(RemObjects SoftwareのChromeコンパイラ)+dBExpress+.NET Framework 3.5サポート+Monoサポートをまとめたもの。
Delphi PrismはOxygeneコンパイラでMSILにコンパイルされる(従来のDelphi.NETコンパイラではないため完全な互換性はない)。.NET Framework 1.1/2.0/3.0/3.5に対応している。
VCL(.NET)も存在しないので.NET Framework標準のフレームワークを使用する。
文法面の互換性向上はDelphi/Prism共通の課題として考えている。
VB.NET/C#が持っていない言語機能をシンタックスシュガーとして備えている(プロパティアクセサのインライン化、クラスコントラクト、プロパティ通知、Nullable型の暗黙の拡張、非同期メソッド、フューチャなど)ので、複雑な機能を簡単な記述で利用できる。
MonoプロジェクトのサポートでMac OS X/Linux/BSD向の開発が可能になった。



(以下のんびりと追記予定)

2009年2月19日

All-Access正式発表

またもやMarco CantuさんのOfficial Release of All-Accessからの情報で、All-Accessが正式に発表されています。
Embarcadero Debuts the Industry’s First On-Demand, Multi-Platform Software Development Tool Chest: Embarcadero All-Access

またAll-Accessの製品ページも公開されています。
All-Access - Embarcadero Technologies

2009/02/19追記: プレスリリースの日本語訳も公開されました。
エンバカデロ・テクノロジーズ、業界初、マルチプラットフォーム対応のオンデマンド開発ツールセット「Embarcadero® All-Access™」を発表
日本では2009/03/04に詳細が発表されるとのことです。あれ?このリリースはまだcodegear.comドメインですね。

また藤井さんのAllegro Barbaroでも説明されています。
Allegro Barbaro > オンデマンドというツール提供のかたち : ITmedia オルタナティブ・ブログ

2009年2月18日

第12回エンバカデロ・デベロッパーキャンプのまとめ(2)

次はJose Leonさん/Delphi for PHP関係の話。
Delphi for PHP by Jose Leonさん(Delphi for PHPアーキテクト、qadram software CEO)
PHPの開発があまりにも旧態依然としていて非効率的なので、そのまま作業するよりは慣れ親しんだDelphiライクなIDE+コンポーネントライブラリを作ってしまったほうが作業量が少ない、と判断してDelphi for PHP(の前身となるqstudio)を作った。
Delphi for PHPはIDEとして6作目だったので、最初からうまくいく見通しがあった。
必要のないコードを書きたくない(タイヤの再発明はしたくない)。
VCL for PHPのコンポーネントはちゃんとCodeGearと契約してから作業した。

Delphi for PHPについて
HTML(visual)、JavaScript、non-visualなコンポーネントを含むことができる。
デバッガが使える(パフォーマンス的には厳しいが)。
プロファイラで実行行数、実行時間などを簡単に計測することができる。
ページコンポーネントがwebページに対応するベースとなるコンポーネント(Delphiではフォームに相当)で、そのページを構成するHTMLソースが生成される。ここにコンポーネントを配置すると、対応するHTMLソースが追加生成される。
FlashやjQueryもラッピングしてVCL for PHPコンポーネントにすることができる。
OpenChartにDBExplorerからDnDしたデータソースなどのコンポーネントを接続するだけで簡単にFlashベースのグラフを表示できる。
OpenGridも同様にデータソースと接続することで更新も含め簡単にデータのグリッド表示が可能になる(AJAXで動作している)。
コンポーネントベースにすることでコードの記述が最小限で動作するようになっている。

第12回エンバカデロ・デベロッパーキャンプのまとめ(1)

まずはCodeGear/Embarcadero関係の話。
Delphi/C++Builder Developer Meetingについて
4月にDavid.Iさんがasia-pacificをまわるところをつかまえてやりたいと思っているとのこと。
FT参加者、FT参加希望者を対象に。
いまのところ2009年04月13日(月曜日)17:30からの予定(無保証)。
NDAベースのミーティングになる。

codegear.comはembarcadero.comに統合
近日中にcodegear.comのコンテンツはembarcadero.comに統合される。
dn.codegear.comにあるものは単純にドメイン部分を"edn.embarcadero.com"に読み替えるだけでよいが、www.codegear.comのコンテンツは再編されるので要注意。
国際化などの仕掛けは従来どおり。
旧borland.co.jp/borland.comから移行した古いコンテンツにリンク切れがある、という話をしたら、そのようなものを見つけたら個別にメールで教えてください、とのこと。

on-demand tool accessについて
on-demand accessというEmbarcaderoの製品をすべて使用できる包括的なライセンス形態の販売を予定している(Marco CantuさんのEmbarcadero All-Access経由で読んだinfoworldのEmbarcadero offers on-demand tools accessという記事に出ていました)。
企業でのライセンス管理が容易になる。
たまにしか使わないようなツールのライセンスも含まれるので導入のハードルが低くなる。
だいたい3つの製品を買えば元が取れるような価格になる(infoworldの記事ではシングルユーザ、ワークステーション用のBronzeで2250USD≒21万円なので計算が合う感じ)。

オフィス移転
来週から新しいオフィスに移転する。
電話番号が変更になるので注意。
藤井さんの下僕マーケティングのアシスタントスタッフを募集中。

2009/02/18追記: embarcadero.comへの移行が現在進行中です。

IDE Fix Pack 2.4リリース

Andreas HausladenさんIDE Fix Pack 2007/2009がVersion 2.4にアップデートされています。
Andy’s Blog and Tools » IDE Fix Pack 2.4 released

2009年2月17日

第12回エンバカデロ・デベロッパーキャンプ終了

毎度のことですが、スピーカの皆さん、関係者の皆さん、おつかれさまでした。
とりあえず次回の会場には電源付きの席を用意してほしいと思った一日でした。あとできれば地下ではないほうが(auの電波が微妙で夕方には電池切れ寸前になってしまった)。

2009/02/18追記: デベロッパーキャンプの内容や感想についてはまとめ(1)まとめ(2)に移しました。

2009/02/23再追記: セッション資料がダウンロードできるようになっています。

2009/03/11再追記: デベロッパーキャンプの内容や感想をまとめ(1)まとめ(2)まとめ(3)まとめ(4)にまとめました(途中ですが)。

2009年2月11日

Microsoft Monthly Update 2009/02

今日はMicrosoftのセキュリティアップデートの日です。
MS09-002
MS09-003
MS09-004
MS09-005
KB960715 (Cumulative Security Update of ActiveX Kill Bits)

2009年2月5日

IDE Fix Pack 2.3リリース

Andreas HausladenさんIDE Fix Pack 2007/2009がVersion 2.3にアップデートされています。"I have finally found a way to replace a .NET method at runtime without using the ProfilerAPI or other libraries. I can do it from native code."だそうです。
Andy’s Blog and Tools » IDE Fix Pack 2.3 - Bye bye “Cannot resolve unit name”

2009年1月28日

Delphiコンパイラの将来

ちょっと前に公開されて色々と議論を巻き起こしていたNick HodgesさんのThe Future of the Delphi Compilerの日本語訳が公開されています。
Delphiコンパイラの将来

Delphi 2009 Whitepapers

#3までで完結かと思っていたDelphi 2009のホワイトペーパーの#4(VCL)、#5(Datasnap 2009)がここにきて公開されています。Delphi 2009 Handbookの要約だということから考えるとこれで打ち止めだと思うのですが。

2009/01/29追記: ちゃんとこれが5番目で最後("the fifth and last of my series")、と書いてありました。

2009年1月23日

JVCL 3.36リリース

JVCL(JEDI Visual Component Library)がアップデートされてVersion 3.36(JCL Version 1.104)になっています。
SourceForge.net: JEDI VCL for Delphi: Files

元ねたは2009-01-22 - C++Builder好きの秘密基地さんのところ。

2009年1月14日

Microsoft Monthly Update 2009/01

今日はMicrosoftのセキュリティアップデートの日です。
MS09-001

2009年1月11日

DDevExtensions 1.61リリース

Andreas HausladenさんのDDevExtensions (for Delphi/BCB 5-2007)がアップデートされてVersion 1.61になっています。
DDevExtensions 1.61 (for Delphi/BCB 5-2007)

2009年1月8日

Delphi 2009 Handbook日本語版

Marco CantuさんのDelphi 2009 Handbook日本語版作業が進行中とのことです。まさかの自前翻訳だそうで、なんともご苦労様です。えぇ、もちろん買いますとも。自分用と会社用の2冊で。

2009年1月7日

第12回エンバカデロ・デベロッパーキャンプ

第12回エンバカデロ・デベロッパーキャンプは2009年02月17日開催です。今回はJose Leonさん(qadram softwareのCEO/Delphi for PHPのチーフアーキテクト)がいらっしゃるそうです。

2008年12月26日

IDE製品に同梱のInterBase(Local/Developer Edition)に関するまとめ

Delphiには開発用にInterBaseが同梱されていますが、どのバージョンがどのプロダクトに含まれているのかをまとめてみました。
Local InterBase Server 4.1
最新アップデート: (n/a)
プロダクト: Delphi 2
対応OS: Windows 95/NT 4.0
制限事項: ローカル接続のみ
参照URL: (n/a)
Local InterBase Server 4.2.1
最新アップデート: (n/a)
プロダクト: Delphi 3/3.1
対応OS: Windows 95/NT 4.0
制限事項: ローカル接続のみ
参照URL: (n/a)
InterBase 5.0
最新アップデート: (n/a)
プロダクト: C++Builder 3/Delphi 4
対応OS: Windows 95/NT 4.0
制限事項: Local InterBaseライセンスのみ
参照URL: (n/a)
InterBase 5.6
最新アップデート: (n/a)
プロダクト: Delphi 5/C++Builder 5
対応OS: Windows 95/98/NT4(SP5)
制限事項: Local InterBaseライセンスのみ
参照URL: (n/a)
InterBase 6
最新アップデート: (n/a)
プロダクト: Delphi 6/7/C++Builder 6
対応OS: Windows 98SE/Me/NT 4.0(SP6a)/2000(SP1)
制限事項: Local InterBaseライセンスのみ
参照URL: (n/a)
InterBase 7.1
最新アップデート: Service Pack 2 + Security update
プロダクト: Delphi 2005
対応OS: Windows 98/Me/NT 4.0(SP6a)/2000(SP2)/XP/Server 2003(IB7.1 SP2)
制限事項: IDE製品がインストール済かつ許諾済であること?
参照URL: (n/a)
InterBase 7.5
最新アップデート: 7.5.1 Service Pack 1
プロダクト: Developer Studio 2006/JBuilder 2006
対応OS: Windows 2000(SP4)/XP Pro(SP2)/Server 2003(SP1)
制限事項: IDE製品がインストール済かつ許諾済であること(特に設定を行わないとサービスとしては起動しない)
参照URL: InterBase 7.5 Developer の起動について
InterBase 2007
最新アップデート: Service Pack 3
プロダクト: RAD Studio 2007
対応OS: Windows 2000(SP4)/XP(SP2)/Server 2003/Vista
制限事項: 最大48時間までしか連続稼動できない
参照URL: InterBase 2007 Developer Editionの仕様について
InterBase 2009
最新アップデート: Hotfix Update 4
プロダクト: RAD Studio 2009
対応OS: Windows 2000(SP4)/XP(SP2)/Server 2003/Vista/Server 2008
制限事項: 最大48時間までしか連続稼動できない?
InterBase XE
最新アップデート: Update 5
プロダクト: ?
対応OS: Windows XP(SP3)/Vista(x86/x64)/Server 2008/7(x86)/Server 2008 R2
制限事項: 最大48時間までしか連続稼動できない、4coreまでのサポート、20同時接続ユーザ(80コネクション)
InterBase XE3
最新アップデート: Update 1
プロダクト: RAD Studio XE3
対応OS: Windows XP(SP3)/Vista(x86/x64)/Server 2008/7(x86/x64)/Server 2008 R2/8(x86/x64)/Server 2012
制限事項: 最大48時間までしか連続稼動できない、4coreまでのサポート、20同時接続ユーザ(80コネクション)
2011/01/06追記: InterBase 2009/XEの情報を更新しました。

2012/12/31追記: InterBase XEの情報を更新し、InterBase XE3の情報を追加しました。

2008年12月24日

日本法人代表交代

旧Borland日本法人のIDE部門分社化以来の責任者でエンバカデロ・テクノロジーズ合同会社(いわゆる日本法人)の代表(職務執行者)の八重樫さんが退任され、替わって藤井さんが日本法人の代表になる、というニュースが飛び込んできました。海の向こうはハッピーホリデーの休暇に入るところ(そして日本も年内は後3日)というタイミングでの発表(非公式ですけど)はちょっと驚きです(年内に、ということであれば最後のタイミングですが)。
八重樫さんとは2回ほどお話をさせていただきましたが、見た目とは違い(見た目通り?)、優しく気さくな方でした(敵にしたら恐ろしい、かも…)。次はどのようなことをされるのでしょうか?ご活躍をお祈りしています。

2008年12月21日

[書籍]Delphi 2009 Handbook/Delphi 2009 Development Essentials

Marco CantuさんのDelphi 2009 HandbookがLulu.comから到着。Bob SwartさんのDelphi 2007 for Win32 Development EssentialsDelphi 2009 Development Essentialsも一緒に買ったのでまとめて積んだ。

2008年12月20日

Delphi 2009/C++Builder 2009 Help Update 1

Delphi 2009/C++Builder 2009のHelp Update 1がリリースされています。
リリースノート: Delphi 2009 および C++Builder 2009 Help Update 1

Dee Ellingさんによれば、CHM/PDF/HTML版がEmbarcadero CodeGear Product Documentation SITE BETAに載るのは来年になるようです。あちらはもうホリデーシーズンですしね。

2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。

2008年12月19日

DBX4 BDE Driver

Team Japan » DBX4 BDE Driver
興味深い。後日追記予定(?)。

2008年12月18日

Microsoft OOB Update 2008/12

Microsoftの定例外のセキュリティアップデートがリリースされています。
MS08-078

2008年12月16日

ファイルサイズを取得する(2)

前回のファイルサイズの取得の方法ではNTFSログファイルが一杯になると取得できるファイルサイズがファイルの更新に従って変化しなくなるという不具合を避けることができません。そこでこのKBのworkaroundに従ってWin32APIのGetFileSizeExを使用してファイルサイズを取得する方法です。
function GetFileSizeEx(hFile: THandle; var lpFileSize: LARGE_INTEGER): BOOL; stdcall;
  external kernel32 name 'GetFileSizeEx';

function GetFileSize(const Filename: String; var FileSize: Int64): Boolean;
var
  Handle: THandle;
  LI: LARGE_INTEGER;
begin

  Result := False;

  FileSize := 0;
  Handle := Windows.CreateFile(PChar(Filename),GENERIC_READ,0,nil,
                               OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if Handle = INVALID_HANDLE_VALUE then
  begin
    Exit;
  end;

  try
    if GetFileSizeEx(Handle,LI) = False then
    begin
      Exit;
    end;

  finally
    Windows.CloseHandle(Handle);
  end;

  FileSize := LI.LowPart or (Int64(LI.HighPart) shl 32);
  Result := True;

end;
GetFileSizeExがオープン済のファイルハンドルを要求するため、CreateFileで一旦ファイルをオープンし、ファイルサイズ取得後にクローズするようにしています。このためアクセス権などの問題からオープンに失敗するようなファイルのサイズを取得することができません。

Delphi 2009/C++Builder 2009 Update 2

Delphi 2009/C++Builder 2009のUpdate 2がリリースされています。Update 2はデータベース関係のアップデートのみとのことです。また事前にUpdate 1を適用しておく必要があります。
リリースノート: Delphi 2009 および C++Builder 2009 Update 2
List of Bug Fixes in Update 2 for Delphi and C++Builder 2009

2008年12月13日

InterBase 2007 Service Pack 3リリース

InterBase 2007 SP3 for Windows - Japaneseがダウンロードできるようになっています。
InterBase 2007 Service Pack 3 (8.1.1.333) リリースノート

2008/12/16追記: InterBase 2007 SP3はSP2適用済の環境にのみ適用可能です(SP2の詳細についてはこちら)。

2008年12月11日

スプラッシュフォームを表示する

メインフォームを表示するのに時間がかかる(データベースを参照していたり、大きなファイルを読み込む必要があったり、理由はさまざまでしょうけれども)ようなときに、スプラッシュフォームを表示することでこれをごまかす、じゃなくて目立たなくするという方法があります。
まず表示に時間がかかるメインフォームとしてこのようなものを考えます。
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin

  for I := 0 to 99 do
  begin
    Sleep(100);
  end;

end;
起動からメインフォームの表示まで10秒かかります(あたりまえ)。
ここでスプラッシュ用のフォームを用意します。必要に応じてプロパティを指定したりLabelやPanelやImageなどを配置してそれなりの体裁を整えていただくとして、ここで必要なイベントハンドラはOnDeactivateです。OnDeactivateイベントハンドラではReleaseメソッドを呼び出してスプラッシュフォーム自身を解放するようにします。
type
  TForm2 = class(TForm)
    procedure FormDeactivate(Sender: TObject);
  end;

procedure TForm2.FormDeactivate(Sender: TObject);
begin

  Release;

end;
さらにスプラッシュフォームを表示するためのメソッドを用意します。このスプラッシュフォームには通常の(メッセージループ経由の)メッセージが全く送られない(アプリケーションのメッセージループが動作し始めると直後にOnDeactivateが発生する)ので、Updateメソッドで強制的に表示更新を行う必要があります。
procedure ShowSplashForm;
begin

  with TForm2.Create(nil) do
  begin
    Show;
    Update;
  end;

end;
そしてこのメソッドをプロジェクトソース内のApplication.Initializeの後で呼び出します。
begin

  Application.Initialize;

  ShowSplashForm;

  Application.CreateForm(TForm1, Form1);
  Application.Run;

end.
Delphi 2007以降ではWindows Vista対応のためにApplicationとメインフォームの関係を色々と変更したために
begin

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  ShowSplashForm;

  Application.CreateForm(TForm1, Form1);
  Application.Run;

end.
とApplication.MainFormOnTaskbarの設定の後にスプラッシュフォームを表示するようにする必要があります(逆にDelphi 2006以前ではTForm2の所属ユニットのinitialization部で十分なのですが)。
Applicationの初期化後にまずスプラッシュフォームが生成、表示され、メインフォームが生成されて時間がかかる処理が走り、Apprication.Runでメインフォームが表示されてアクティブになることでスプラッシュフォームはインアクティブになり、OnDeactivateイベントが発生してスプラッシュフォームが消滅する、という動作の流れになります。

2008年12月10日

Microsoft Monthly Update 2008/12

今日はMicrosoftのセキュリティアップデートの日です。
MS08-070
MS08-071
MS08-072
MS08-073
MS08-074
MS08-075
MS08-076
MS08-077

2008年12月5日

Delphi 2009 Whitepapers

Marco CantuさんによるDelphi 2009 White Paperがリリースされています。
White Paper #1 Unicode: White Paper: Delphi and Unicode
White Paper #2 Language: White Paper: Using New Delphi Coding Styles and Architectures
White Paper #3 The IDE: White Paper: A Tour of Delphi 2009
White Paper #4 The VCL: White Paper: Building User Interfaces with Delphi 2009
White Paper #5 Datasnap 2009: White Paper: The New DataSnap in Delphi 2009

#2の表紙に著者名が入っていないのは単なるミスだそうです。

2008/12/16追記: #3がリリースされています。
2009/01/22追記: #4がリリースされています。
2009/01/28追記: #5がリリースされています。

2008年12月4日

OpenTools API入門

あとで読む。
Extending Delphi 2009 With OpenTools API: Getting Started

OTA(OpenTools API)はDelphi/C++BuilderのIDEとインタフェースするためのAPIで、wizardやpluginはこれを利用して作成します。

2008年12月3日

第11回エンバカデロ・デベロッパーキャンプ終了

参加者および関係者の皆さん、おつかれさまでした。
ところで会場に来てたのはMalcolm Grovesさんでしたか。
また後で更新予定…。

2008/12/06追記: ITProにMalcolm Grovesさんのインタビュー記事が。

2008/12/10再追記: セッション資料がダウンロードできるようになっています。

Delphi 2009 Handbook出版

Marco CantuさんDelphi 2009 HandbookLulu.comから出版されました。全400ページで、価格は48.50USD(約4500円)ですが、先着60名は40.50USD(これは既に終了)、CodeRage IIIの期間中(2008/12/05まで)は45.50USD(約4200円)のディスカウントが設定されています。

2008/12/04追記: ソースコードがCodeCentralからダウンロードできるようになっています。

2008/12/05再追記: Delphi 2009/C++Builder 2009/RAD Studio 2009登録ユーザはPDF eBook形式のものをCodeGearから入手できるようになりました。
Delphi 2009 Handbook PDF eBook

また「何らかの形で日本語版を出せるように交渉中」という話をデベロッパーキャンプで藤井さんがしていましたので、期待してます。

2009/05/22再追記: Marco Cantuさんによると、Amazon(US)の傘下でプリントオンデマンドを扱うCreateSpaceという会社からも入手可能になったそうです。
Delphi 2009 Handbook on Amazon.com

2011/05/04追記: cc.codegear.comのリンクをcc.embarcadero.comのものに差し替え。

2008年12月1日

2008年11月21日

IDE Fix Pack and VCL Fix Pack

IDE/VCLのBugFixが進まないことにAndreas Hausladenさんが業を煮やしたらしく、IDE/VCLの非公式パッチ集であるIDE Fix Pack 2009VCL Fix Packをリリースしています。
IDE Fix Pack 2.0 and VCL Fix Pack 1.0 released

IDE Fix PackにはDelphi/C++Builder 2007用もあります。またVCL Fix PackはDelphi 6以降に適用可能なようです(先日の非公式パッチも含まれています)。

3rdRail and TurboRuby

CodeGear(Embarcadero)から3rdRail 2.0とTurboRubyが発表されています。
Press Release: Embarcadero Ships Latest Edition of 3rdRail™ and Introduces TurboRuby IDEs

気になる3rdRail SKUとTurboRuby SKUの違いですが、FAQ FAQによればRailsフレームワークのサポートの有無(TurboRubyはRailsフレームワークをサポートしない)のようです。
ということは。
あくまで個人的な意見ですが、噂のDelphi/C++BuilderのTurbo SKUも、IDEは同じだけれどもVCLというフレームワームをサポートしない、という路線なのでは?と考えています。

2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。

2008年11月19日

マニフェストのrequestExecutionLevelに指定できる値

Windows Vista上で管理者権限を要求するアプリケーションを作成するで説明したアプリケーションマニフェスト上のrequestExecutionLevelのlevel属性に指定できる値とその意味は以下のようになっています。
requireAdministrator
アプリケーションはAdministrator権限で開始されなければならず、それ以外の権限では実行されない。

highestAvailable
アプリケーションはログオンアカウントで要求できる最も高い権限で開始されなければならない。ログオンユーザがAdministratorアカウントならば権限昇格のプロンプトが表示されたうえでAdministrator権限で開始され、標準ユーザアカウントならば(権限昇格のプロンプトの表示なしに)標準の権限で開始される。

asInvoker
アプリケーションは呼び出し元のアプリケーションと同じ権限で開始される。

元ねたはAdvanced Windows 第5版 上 p.142

2008/11/20追記: ついでにGetProcessElevation関数(p.146)を移植してみようと思ったけど、Windows 2000ではGetTokenInformationにTokenElevationTypeを渡すとパラメータエラーになることが判明して断念。難しい…。

2008年11月13日

アプリケーションの多重起動を禁止する

プログラムの性質によっては多重起動を禁止したいことがあります。このようなときには同期オブジェクトの一つであるmutexを使用します。

Delphiのプロジェクトソースを開くとこのようになっています。
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
ここで一意な名前のmutexをプログラム実行中だけ作成(CreateMutex)し、もしその名前のmutexが存在していたらプログラムを終了、存在していなければ実行を継続し、プログラム終了時にはmutexを破棄(CloseHandle)するコードを追加します。
program Project1;

uses
  Windows,
  SysUtils,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

const
  { Mutex name }
  CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';

var
  hMutex: THandle;
begin

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  { Create mutex }
  SetLastError(0);
  hMutex := CreateMutex(nil,False,PChar(CMutexName));
  if hMutex = 0 then
  begin
    RaiseLastOSError;
  end;

  try
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      Exit;
    end;

    Application.CreateForm(TForm1, Form1);
    Application.Run;

  finally
    { Close mutex }
    CloseHandle(hMutex);
  end;

end.
これでプログラムの多重起動を禁止することができます。
作成するmutexの名前は任意(上記の例では適当にGUIDを生成して使用しています)ですが、'Global\'と'Local\'で始まるmutex名には特別な意味があるので注意が必要です(詳細はCreateMutex参照)。また同名のmutexが存在するかどうかを調べるのにOpenMutexを使用するとOpenMutexの呼び出しからCreateMutexの呼び出しまでの間が無防備になってしまうため、CreateMutexの第2パラメータbInitialOwnerにFalseを指定して呼び出し後、GetLastErrorの値がERROR_ALREADY_EXISTSかどうかで判定するようにします。

さらにアプリケーションのメインウィンドウを前面に移動し、最小化も解除するようにしてみます。
program Project1;

uses
  Windows,
  SysUtils,
  Messages,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

const
  { Mutex name }
  CMutexName: String = '{9D0E11F8-ED24-4D3E-91B1-5E9A9BF8673A}';

var
  hMutex: THandle;
  Wnd: HWnd;
  AppWnd: HWnd;
begin

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  { Create mutex }
  SetLastError(0);
  hMutex := CreateMutex(nil,False,PChar(CMutexName));
  if hMutex = 0 then
  begin
    RaiseLastOSError;
  end;

  try
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      { Search main form }
      Wnd := FindWindow(PChar('TForm1'),nil);  // Class name of the main form
      if Wnd = 0 then
      begin
        Exit;
      end;

      { Bring foreground and activate }
      SetForegroundWindow(Wnd);

      { Get window handle of TApplication }
      AppWnd := GetWindowLong(Wnd,GWL_HWNDPARENT);
      if AppWnd <> 0 then
      begin
        Wnd := AppWnd;
      end;

      { Restore if iconized }
      if IsIconic(Wnd) then
      begin
        SendMessage(Wnd,WM_SYSCOMMAND,SC_RESTORE,-1);
      end;

      Exit;
    end;

    Application.CreateForm(TForm1, Form1);
    Application.Run;

  finally
    { Close mutex }
    CloseHandle(hMutex);
  end;

end.
Delphiのウィンドウコントロールはクラス名がそのままウィンドウクラス名になるため、FindWindowにはアプリケーションのメインフォームのクラス名を渡します。

2008年11月12日

Microsoft Monthly Update 2008/11

今日はMicrosoftのセキュリティアップデートの日です。
MS08-068
MS08-069

2008年11月11日

Delphi/C++Builder 2009 Japanese Hotfix 1

IDEの環境オプションのタイプライブラリの設定がエラーになる件(QC68044)のHotfixがリリースされています。事前にUpdate 1を適用しておく必要があるとのことです。
Team Japan » Delphi/C++Builder 2009 Japanese Hotfix 1

2008/11/12追記: C++Builder 2009ではdelphicompro120.jpは必要ないとのことです。

2008年10月28日

Delphi Prism

PDCにあわせてDelphi.NETの次期版であるDelphi PrismがCodeGearからアナウンスされています(まとめのwikiページもあり (ja))。現時点でわかっていることを羅列してみます。
  • Microsoft Visual Studio Shell上で動作する。

  • コンパイラはRemObjectのOxygeneを使用する。

  • C#には実装されていないいくつかの機能(Parallel Loops,Inline Property Accessors,Class Contracts,Extended Constructor Calls,Boolean Double Comparisonなど)をサポートする。

  • Monoを使用することでLinuxやMac OS X上でも動作する。

さぁどうなることやら。

2008/10/28追記: 手回しのよいことで、Delphi Prism FAQページもできています。

2008/11/04再追記: あれ?ネタ元はどこだっけな…。1週間で忘れてしまった…。

2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。

第11回エンバカデロ・デベロッパーキャンプ

第11回エンバカデロ・デベロッパーキャンプは2008年12月03日開催です。

2008年10月24日

Microsoft OOB Update 2008/10

Microsoftの定例外のセキュリティアップデートがリリースされています。
MS08-067

2008年10月15日

Delphi 2009 Handbook

Marco CantuさんによればDelphi 2009 Handbook作業が進行中だそうです。
Lulu.comから2008/11出版予定、44.50USD(約4500円)とのこと。
ちなみにDelphi 2007 Handbookもお勧めです。

Microsoft Monthly Update 2008/10

今日はMicrosoftのセキュリティアップデートの日です。
MS08-056
MS08-057
MS08-058
MS08-059
MS08-060
MS08-061
MS08-062
MS08-063
MS08-064
MS08-065
MS08-066
KB956391 (Cumulative Security Update of ActiveX Kill Bits)

2008年10月13日

[書籍]Advanced Windows 第5版

Advanced Windowsの第5版が出るらしい(2008/10/23 2008/10/27予定)。

Advanced Windows 第5版 上/Jeffrey Richter, Christophe Nasarre著/(株)クイープ訳/日経BPソフトプレス/ISBN 978-4-89100-592-4/5,775円
Advanced Windows 第5版 下/Jeffrey Richter, Christophe Nasarre著/(株)クイープ訳/日経BPソフトプレス/ISBN 978-4-89100-593-9/5,985円

問題は、値段はともかく、第4版が積まれたままになっているということか…。

2008/10/22追記: 日経BPソフトプレスによると発行日は2008/10/27とのことなので修正。

2008/11/04再追記: 2008/10/24に買って積んだ。読む時間がほしい。

2008年10月11日

NTFSファイル圧縮機能を利用する(3)

NTFSで使用することができるファイル圧縮機能をプログラムから利用する方法の第三弾です。
フォルダの圧縮属性をセット/リセットしても、そのフォルダに新規に作成するファイルのデフォルトの属性として適用されるだけで、既存のファイルには影響が及びません。そこで指定されたフォルダとそのサブフォルダ、含まれる全てのファイルをトラバースして圧縮属性をセット/リセットするようにします。
フォルダ/ファイルに圧縮属性を適用するたびにコールバック関数を呼び出して進行状況が呼び出し元に通知されるようになっています。コールバックが不要な場合はnilを指定してください。またDelphi 2009ではコールバックに新機能の無名メソッドを使用するようにしてみました。
uses
  Windows, SysUtils;

{$IFDEF VER200}
{$DEFINE ANONYMOUSMETHOD}  // Anonymous method is available on Delphi 2009 or later
{$ENDIF}

type
  { Callback function declaration }
  TNotifyCompressFunc = {$IFDEF ANONYMOUSMETHOD} reference to {$ENDIF}
    procedure (const Filename: String;
               Operation: TCompressOperation
               {$IFNDEF ANONYMOUSMETHOD}; Param: DWORD {$ENDIF});

procedure CompressDirectory(const Dirname: String;
                            Operation: TCompressOperation;
                            IgnoreError: Boolean;
                            CallbackFunc: TNotifyCompressFunc
                            {$IFNDEF ANONYMOUSMETHOD}; Param: DWORD{$ENDIF});

{ Forward declarations }
procedure InternalCompressDirectory(const Dirname: String;
                                    Operation: TCompressOperation;
                                    IgnoreError: Boolean;
                                    CallbackFunc: TNotifyCompressFunc
                                    {$IFNDEF ANONYMOUSMETHOD}; Param: DWORD{$ENDIF}); forward;

{$WARN SYMBOL_PLATFORM OFF}

procedure CompressDirectory(const Dirname: String;
                            Operation: TCompressOperation;
                            IgnoreError: Boolean;
                            CallbackFunc: TNotifyCompressFunc
                            {$IFNDEF ANONYMOUSMETHOD}; Param: DWORD{$ENDIF});
var
  Attr: DWORD;
  Path: String;
begin

  if VolumeCanCompress(Dirname) = False then
  begin
    { This volume is not support compression }
    Exit;
  end;

  Path := ExcludeTrailingPathDelimiter(Dirname);

  { Get directory attributes }
  Attr := GetFileAttributes(PChar(Path));
  if Attr = $FFFFFFFF then
  begin
    RaiseLastOSError;
  end;

  { Compress or decompress directory }
  InternalCompressDirectory(IncludeTrailingPathDelimiter(Dirname),Operation,
                            IgnoreError,CallbackFunc
                            {$IFNDEF ANONYMOUSMETHOD},Param{$ENDIF});

  { Compress or decompress }
  if NeedChangeCompression(Operation,Attr) = True then
  begin
    if Assigned(CallbackFunc) then
    begin
      CallbackFunc(Path,Operation{$IFNDEF ANONYMOUSMETHOD},Param{$ENDIF});
    end;

    try
      InternalCompressFile(Path,Operation,Attr);

    except
      if IgnoreError = False then
      begin
        raise;
      end;
    end;
  end;

end;

procedure InternalCompressDirectory(const Dirname: String;
                                    Operation: TCompressOperation;
                                    IgnoreError: Boolean;
                                    CallbackFunc: TNotifyCompressFunc
                                    {$IFNDEF ANONYMOUSMETHOD}; Param: DWORD{$ENDIF});
var
  SR: TSearchRec;
  Path: String;
begin

  if FindFirst(Dirname + '*.*',faAnyFile,SR) = 0 then
  begin
    try
      repeat
        { Skip current and parent directory }
        if (SR.Name = '.') or (SR.Name = '..') then
        begin
          Continue;
        end;

        Path := Dirname + SR.Name;

        { Compress or decompress directory (recursive call) }
        if (SR.Attr and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
        begin
          InternalCompressDirectory(IncludeTrailingPathDelimiter(Path),
                                    Operation,IgnoreError,CallbackFunc
                                    {$IFNDEF ANONYMOUSMETHOD},Param{$ENDIF});
        end;

        { Compress or decompress }
        if NeedChangeCompression(Operation,SR.Attr) = True then
        begin
          if Assigned(CallbackFunc) then
          begin
            CallbackFunc(Path,Operation{$IFNDEF ANONYMOUSMETHOD},Param{$ENDIF});
          end;

          try
            InternalCompressFile(Path,Operation,SR.Attr);

          except
            if IgnoreError = False then
            begin
              raise;
            end;
          end;
        end;

      until FindNext(SR) <> 0;

    finally
      FindClose(SR);
    end;
  end;

end;

{$WARN SYMBOL_PLATFORM ON}
パラメータIgnoreErrorは、Explorerで開いているフォルダを(圧縮属性を適用するために)CreateFileでオープンしたときにエラーになるため、これを無視するためのものです。
Delphi 2007およびそれ以前のバージョンでは以下のように呼び出します(フォーム上にButton1/Edit1/CheckBox1/Label1を配置)。
procedure CallbackFunc(const Filename: String; Operation: TCompressOperation; Param: DWORD);
begin
  TForm1(Param).Label1.Caption := 'Compressing: ' + Filename;
  TForm1(Param).Refresh;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CompressDirectory(Edit1.Text,coCompress,CheckBox1.Checked,
                    CallbackFunc,DWORD(Self));
 Label1.Caption := 'Finished.';
end;
これに対してDelphi 2009の無名メソッドを使用する場合は以下のように呼び出します。
procedure TForm1.Button1Click(Sender: TObject);
begin
  CompressDirectory(Edit1.Text,coCompress,CheckBox1.Checked,
    procedure(const Filename: String; Operation: TCompressOperation)
    begin
      Label1.Caption := 'Compressing: ' + Filename;
      Refresh;
    end);
  Label1.Caption := 'Finished.';
end;
同じ内容の無名メソッドの使いまわしを考えるのであれば、こんな風にします。
function MakeCallbackFunc(Form: TForm1): TNotifyCompressFunc;
begin
  Result := 
    procedure(const Filename: String; Operation: TCompressOperation)
    begin
      case Operation of
        coCompress:
        begin
          Form.Label1.Caption := 'Compressing: ' + Filename;
        end;

        coDecompress:
        begin
          Form.Label1.Caption := 'Decompressing: ' + Filename;
        end;
      end;

      Form.Refresh;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CompressDirectory(Edit1.Text,coCompress,CheckBox1.Checked,
                    MakeCallbackFunc(Self));
  Label1.Caption := 'Finished.';
end;
元ねたはNTFSの圧縮機能 - HEROPA's HomePageサンプルプログラム集 ファイルの圧縮属性の変更あたり。

2008年10月10日

NTFSファイル圧縮機能を利用する(2)

NTFSで使用することができるファイル圧縮機能をプログラムから利用する方法の第二弾です。
ファイル/フォルダの圧縮属性をセット/リセットするにはCreateFileでファイル/フォルダをオープンし、DeviceIoControlFSCTL_SET_COMPRESSIONを指定します。
uses
  Windows, SysUtils;

type
  { Compress operation }
  TCompressOperation = (coCompress, coDecompress);

const
  FSCTL_SET_COMPRESSION      = $0009C040;
  COMPRESSION_FORMAT_NONE    = $00000000;
  COMPRESSION_FORMAT_DEFAULT = $00000001;

procedure InternalCompressFile(const Filename: String;
                               Operation: TCompressOperation;
                               Attr: DWORD); forward;
function  NeedChangeCompression(Operation: TCompressOperation;
                                Attr: DWORD): Boolean; forward;

{$WARN SYMBOL_PLATFORM OFF}

procedure CompressFile(const Filename: String; Operation: TCompressOperation);
var
  Attr: DWORD;
begin

  if VolumeCanCompress(Filename) = False then
  begin
    { This volume is not support compression }
    Exit;
  end;

  { Get file attributes }
  Attr := GetFileAttributes(PChar(Filename));
  if Attr = $FFFFFFFF then
  begin
    RaiseLastOSError;
  end;

  if NeedChangeCompression(Operation,Attr) = True then
  begin
    { Compress or decompress }
    InternalCompressFile(Filename,Operation,Attr);
  end;

end;

procedure InternalCompressFile(const Filename: String;
                               Operation: TCompressOperation;
                               Attr: DWORD);
const
  CompressionFormat: array [TCompressOperation] of DWORD =
                       (COMPRESSION_FORMAT_DEFAULT,  // Compress by default format
                        COMPRESSION_FORMAT_NONE);    // Decompress
var
  Handle: THandle;
  InBuffer: DWORD;
  BytesReturned: DWORD;
  Access: DWORD;
  Flags: DWORD;
begin

  { Flags for CreateFile }
  Access := GENERIC_READ or GENERIC_WRITE;
  if (Attr and FILE_ATTRIBUTE_DIRECTORY) = 0 then
  begin
    Flags  := FILE_ATTRIBUTE_NORMAL;
  end
  else
  begin
    Flags  := FILE_FLAG_BACKUP_SEMANTICS;
  end;

  { Reset read-only attribute }
  if (Attr and FILE_ATTRIBUTE_READONLY) <> 0 then
  begin
    SetFileAttributes(PChar(Filename),Attr and not FILE_ATTRIBUTE_READONLY);
  end;

  try
    { Open file or directory }
    Handle := CreateFile(PChar(Filename),Access,0,nil,OPEN_EXISTING,Flags,0);
    if Handle = INVALID_HANDLE_VALUE then
    begin
      RaiseLastOSError;
    end;

    try
      { Compress or decompress }
      InBuffer := CompressionFormat[Operation];
      Win32Check(DeviceIoControl(Handle,FSCTL_SET_COMPRESSION,
                                 @InBuffer,SizeOf(InBuffer),
                                 nil,0,BytesReturned,nil));

    finally
      { Close }
      CloseHandle(Handle);
    end;

  finally
    { Restore read-only attribute }
    if (Attr and FILE_ATTRIBUTE_READONLY) <> 0 then
    begin
      SetFileAttributes(PChar(Filename),
                        GetFileAttributes(PChar(Filename)) or
                        FILE_ATTRIBUTE_READONLY);
    end;
  end;

end;

function NeedChangeCompression(Operation: TCompressOperation;
                               Attr: DWORD): Boolean;
begin

  Result := ((Ord(Operation) xor
              Ord((Attr and FILE_ATTRIBUTE_COMPRESSED) <> 0)) = 0);

end;

{$WARN SYMBOL_PLATFORM ON}
ファイル/フォルダをオープンするときはCreateFileでdwDesiredAccessにGENERIC_READ or GENERIC_WRITEを、dwCreationDispositionにOPEN_EXISTINGを、それぞれ指定する必要があります。また対象がフォルダのときはdwFlagsAndAttributesにFILE_FLAG_BACKUP_SEMANTICSを指定します。さらにファイル/フォルダの属性に書込禁止(FILE_ATTRIBUTE_READONLY)が含まれている場合はSetFileAttributesで一時的に解除する必要もあります。
元ねたはNTFSの圧縮機能 - HEROPA's HomePageサンプルプログラム集 ファイルの圧縮属性の変更あたり。

2008年10月9日

NTFSファイル圧縮機能を利用する(1)

NTFSで使用することができるファイル圧縮機能をプログラムから利用する方法の第一弾です。
そのボリュームでNTFSファイル圧縮機能を使用できるかどうかはGetVolumeInformationでFileSystemFlagsを取得し、FS_FILE_COMPRESSIONが含まれているかどうかで判定します。
uses
  Windows, SysUtils;

{$WARN SYMBOL_PLATFORM OFF}

function VolumeCanCompress(const Filename: String): Boolean;
var
  MaximumComponentLength: DWORD;
  FileSystemFlags: DWORD;
  RootPath: String;
begin

  { Get root path }
  RootPath := IncludeTrailingPathDelimiter(ExtractFileDrive(Filename));

  { Get volume information }
  Win32Check(GetVolumeInformation(PChar(RootPath),nil,0,nil,
                                  MaximumComponentLength,FileSystemFlags,
                                  nil,0));

  { Check FS_FILE_COMPRESSION flag }
  Result := ((FileSystemFlags and FS_FILE_COMPRESSION) <> 0);

end;

{$WARN SYMBOL_PLATFORM ON}

元ねたはNTFSの圧縮機能 - HEROPA's HomePageなど。

2008年10月3日

レジストリのデータをエクスポートする

Windowsのレジストリに書き込んだ設定をファイルにエクスポートするには

REGEDIT.EXE /e "<exportfile>" "<keyname>"
<exportfile> ... 出力ファイル名(拡張子.REG)
<keyname> ... 出力する最上位のキー名(HKEY_CURRENT_USER\...)

を実行します。Windows Vistaではレジストリエディタ(REGEDIT.EXE)がUACで管理者権限を要求するため、管理者として実行する必要があります。

2008年9月28日

Delphi/C++Builder 2009に同梱のInstallAwareについて

Delphi/C++Builder 2009に同梱のInstallAwareがInstallAware Express 6 CodeGear Special Editionのままでした。これはちょっと…。IAの現行バージョンは8なんですけど。

2008/12/05追記: DEKOさんのご指摘 DEKOさんのご指摘のとおりで、DVDの \InstallAware\ia-codegear-express-special-edition.exe がInstallAware 7 CodeGear Special Edition (InstallAware Express CodeGear Special Edition. Based on InstallAware 7 Release 2 (Build babiali_r2.070408)、Version 7.9.7201.2008、英語版)になっています。なおインストーラをローカライズしたいときなどもDEKOさんのちっぷす DEKOさんのちっぷすが非常に役に立ちます。それにしてもどこかの会社で日本語にローカライズして販売してくれませんかね?

2008年9月16日

2008年9月12日

2008年9月10日

Microsoft Monthly Update 2008/09

今日はMicrosoftのセキュリティアップデートの日です。
MS08-052
MS08-053
MS08-054
MS08-055

2008年9月9日

第10回エンバカデロ・デベロッパーキャンプ(東京)終了

参加者の皆さんおつかれさまでした。関係者の皆さんはまだ明後日(大阪)があるので頑張ってくださいね。
さて、公開されてNDAから外れた重要情報を。
1.Turbo Explorer SKUについては考慮中。ただし機能は削って『言語の習得に絞った』ものにする(言語というのはこの場合C++/Object Pascalを指すと思われる)。つまり現状のTurbo Explorerとはかなり異なったものになるのでは?
2.Delphi.NETは次のRAD Studio(年内リリース?)には含まれる。その後はMicrosoft Visual Studioのプラグインとして.NET Framework 3.5の対応も含め.NETの全機能に対応していきたい。ただしRAD Studioのパーソナリティではなくなる。
それからロードマップ上Tiburonの次になるCommodoreは2009年3Q-4Qになりそうです(今までの情報よりは若干後退)。64bit対応以外にもマルチタスク/マルチスレッドサポートなどを盛り込むかどうかを検討中とのこと。

2008/09/18追記: セッション資料がダウンロードできるようになっています。

2008/09/25再追記: Nick Hodgesさんのテクニカルセッションのビデオも公開されています。
ビデオ - Delphi 2009 / C++Builder 2009最新情報

2008/10/01再々追記: Nick Hodgesさんのジェネラルセッションのビデオも公開されました。
ビデオ - CodeGearプロダクトアップデート

2011/05/04追記: dn.codegear.comのリンクをedn.embarcadero.comのものに差し替え。

2008年9月8日

2008年9月4日

標準条件シンボル

標準条件シンボル Delphiで予め定義済のシンボルを標準条件シンボル(standard conditional symbols)と呼び、以下のようなものがあります。

VER<nnn>
コンパイラバージョン
RTLVersion<nnnn>
ランタイムマイナーバージョン(仮)(Delphi 10.4.2以降)
DCC
(全ての環境で定義)
CONSOLE
コンソールアプリケーション
NATIVECODE
ネイティブコード(Delphi.net以降の.NET環境以外で定義)
MSWINDOWS
Windows(Kylix/macOS/iOS/Android/Linux以外で定義)
WIN32
Windows x86環境で定義(Delphi 6以降)
WIN64
Windows x64環境で定義(Delphi XE2以降)
ARM64EC
Windows on ARMのARM64EC環境で定義(Delphi 13.1以降)
MACOS
MacOS環境で定義(Delphi XE2以降)
MACOS32
MacOS 32bit環境で定義(Delphi XE2以降)
MACOS64
MacOS 64bit環境で定義(Delphi XE8以降)
OSX
OSX(MacOS)環境で定義(Delphi 11以降)
OSX64
OSX(MacOS)環境で定義(Delphi 11以降)
POSIX
MacOSを含むPOSIX環境で定義(Kykix/Delphi XE2以降)
POSIX32
MacOSを含むPOSIX 32bit環境で定義(Kykix/Delphi XE2以降)
POSIX64
MacOSを含むPOSIX 64bit環境で定義(Delphi XE2以降)
IOS
iOS(デバイス/シミュレータ)環境で定義(Delphi XE4以降)
IOS32
iOS 32bit環境で定義(Delphi XE8以降)
IOS64
iOS 64bit環境で定義(Delphi XE8以降)
LINUX
Linux環境で定義(Kylix/Delphi 10.2以降)
LINUX32
Linux 32bit環境で定義(Kylix/Delphi 10.2以降)
LINUX64
Linux 64bit環境で定義(Delphi 10.2以降)
ANDROID
Android環境で定義(Delphi XE5以降)
ANDROID32
Android 32bit環境で定義(Delphi XE8以降)
ANDROID64
Android 64bit環境で定義(Delphi 10.3.3以降)
CLR
.NET環境で定義
CPU386
i386以降のCPU
CPUX86
x86のCPU(Delphi XE2以降)
CPUX64
x64のCPU(Delphi XE2以降)
CPUXARM
ARMのCPU(Delphi XE4以降)
CPUARM32
32bit版ARMのCPU(Delphi XE8以降)
CPUARM64
64bit版ARMのCPU(Delphi XE8以降)
CPU32BITS
32bitのCPU(Delphi XE8以降)
CPU64BITS
64bitのCPU(Delphi XE8以降)
ASSEMBLER
アセンブラ構文(asm)を使用できるかどうか
UNICODE
Unicode環境で定義(Delphi 2009以降)
CONDITIONALEXPRESSIONS
条件評価($IF指令)を使用できるかどうか
ALIGN_STACK
OS Xコンパイラやその他の(Linux)コンパイラなどの厳密なスタックアライメント要求がない環境で定義(Delphi XE2以降)
PC_MAPPED_EXCEPTIONS
例外の巻き戻しにアドレスマップを使用するプラットフォーム用コンパイラで定義(Delphi XE2以降)
PIC
OS XのようにPIC(位置独立コード)が要求されるプラットフォームで定義(Delphi XE2以降)
AUTOREFCOUNT
ARC(Automatic Reference Counting)をサポートする環境で定義(Delphi XE4以降、Delphi 10.4 Sydneyですべてのコンパイラが未定義に)
EXTERNALLINKER
外部リンカを使用する環境で定義(Delphi XE4以降)(obsoleted)
NEXTGEN
(LLVMベースの)"NEXTGEN"コンパイラで定義(Delphi XE4以降、Delphi 10.4 Sydneyですべてのコンパイラが未定義に)
ELF
実行/オブジェクトファイルがELF形式の環境で定義(Delphi 10.2以降)
UNDERSCOREIMPORTNAME
インポートされた名前が"_"(アンダースコア)付きになる環境で定義(Delphi XE4以降)
WEAKREF
弱い参照(weak reference)が有効な環境で定義(Delphi XE4以降)
WEAKINSTREF
弱い参照がインスタンスに定義される環境で定義(Delphi XE4以降、Delphi 10.4 Sydneyですべてのコンパイラが未定義に)
WEAKINTREF
弱い参照がインタフェースに定義される環境で定義(Delphi XE4以降)
FRAMEWORK_VCL
プロジェクトがVCLフレームワークを使用(Delphi 11.1以降)
FRAMEWORK_FMX
プロジェクトがFMXフレームワークを使用(Delphi 11.1以降)
WEAK_NATIVEINT
NativeInt/NativeUIntが型エイリアスの環境で定義(Delphi 12)
BCB
C++Builderで定義
WINDOWS
Win16環境で定義
LLVM
LLVMベースコンパイラで定義(Delphi 13.1以降)
ヘルプにはCPU32BITS/CPU64BITSはDelphi XE2以降との記述がありますが、実際にはDelphi XE8以降で有効です。

またVER<nnn>はそれぞれ以下のプロダクトで定義されています(VER180はDelphi/C++Builder 2006と2007の両方で定義済、VER185はDelphi/C++Builder 2007のみで定義済)。

VER40
Turbo Pascal 4.0
VER50
Turbo Pascal 5.0
VER55
Turbo Pascal 5.5
VER60
Turbo Pascal 6.0
VER10
Turbo Pascal for Windows 1.0
VER15
Turbo Pascal for Windows 1.5
VER70
Borland Pascal 7.0
VER80
Delphi 1
VER90
Delphi 2
VER93
C++Builder 1
VER100
Delphi 3
VER110
C++Builder 3
VER120
Delphi 4
VER125
C++Builder 4
VER130
Delphi 5, C++Builder 5
VER140
Delphi 6, C++Builder 6, Kylix 1, Kylix 2, Kylix 3
VER150
Delphi 7, 7.1
VER160
Delphi 8 for .NET, C#Builder
VER170
Delphi 2005, C++Builder 2005 (Ver9)
VER180
Delphi 2006, C++Builder 2006 (Ver10), Delphi 2007, C++Builder 2007 (Ver11)
VER185
Delphi 2007, C++Builder 2007 (Ver11)
VER190
Delphi 2007 for .NET (Ver11)
VER200
Delphi 2009, C++Builder 2009 (Ver12)
VER210
Delphi 2010, C++Builder 2010 (Ver14)
VER220
Delphi XE, C++Builder XE (Ver15)
VER230
Delphi XE2, C++Builder XE2 (Ver16)
VER240
Delphi XE3, C++Builder XE3 (Ver17)
VER250
Delphi XE4, C++Builder XE4 (Ver18)
VER260
Delphi XE5, C++Builder XE5, Appmethod 1.13 (Ver19)
VER265
Appmethod 1.13 (Ver19.5)
VER270
Delphi XE6, C++Builder XE6, Appmethod 1.14 (Ver20)
VER280
Delphi XE7, C++Builder XE7, Appmethod 1.15 (Ver21)
VER290
Delphi XE8, C++Builder XE8, Appmethod 1.16 (Ver22)
VER300
Delphi 10 Seattle, C++Builder 10 Seattle (Ver23)
VER310
Delphi 10.1 Berlin, C++Builder 10.1 Berlin (Ver24)
VER320
Delphi 10.2 Tokyo, C++Builder 10.2 Tokyo (Ver25)
VER330
Delphi 10.3 Rio, C++Builder 10.3 Rio (Ver26)
VER340
Delphi 10.4 Sydney, C++Builder 10.4 Sydney (Ver27)
VER350
Delphi 11 Alexandria, C++Builder 11 Alexandria (Ver28)
VER360
Delphi 12 Athens, C++Builder 12 Athens (Ver29)
VER370
Delphi 13 Florence, C++Builder 13 Florence (Ver37)

定数値RTLVersion<nnn(n)>はDelphi 10.4.2で導入されました。型はすべてBooleanで値はTrue、{$IF RTLVersion<nnn(n)>}のようにすることで定義済みかどうかを調べることができます。

RTLVersion1041
Delphi 10.4.2
RTLVersion1042
Delphi 10.4.2
RTLVersion111
Delphi 11.1/11.2/11.3
RTLVersion112
Delphi 11.2/11.3
RTLVersion113
Delphi 11.3
RTLVersion121
Delphi 12.1/12.2/12.3
RTLVersion122
Delphi 12.2/12.3
RTLVersion123
Delphi 12.3

ねた元はDelphi Tips - 0086とかDelphi Compiler Version Directives: {$IFDEF VER180}とか多数。もうちょっとヘルプが親切ならなぁ。オンラインヘルプの条件付きコンパイル(Delphi) (en)およびコンパイラ バージョン (en)に完全な定義が掲載されました。素晴らしい。

2008/12/23追記: Borland Compiler Conditional Defines - Delphiを参考にちょこちょこっと修正。
2009/09/02追記: Delphi/C++Builder 2010のVER210を追加。
2010/10/12追記: Delphi/C++Builder XEのVER220を追加。
2011/09/02追記: Delphi/C++Builder XE2関係を追加。
2012/09/02追記: Delphi/C++Builder XE3のVER240を追加。
2013/04/20追記: Delphi/C++Builder XE4のVER250/iOS/CPUARM/AUTOREFCOUNT/EXTERNAL_LINKER/NEXTGEN/UNDERSCOREIMPORTNAME/WEAKREF/WEAKINSTREF/WEAKINTREFを追加。
2013/09/12追記: Delphi/C++Builder XE5のVER260/Androidを追加。
2014/04/15追記: Appmethod 1のVER265とDelphi/C++Builder XE6のVER270を追加。
2014/09/02追記: Delphi/C++Builder XE7のVER280を追加。
2015/04/07追記: Delphi/C++Builder XE8のVER290を追加。
2015/09/01追記: Delphi/C++Builder 10 SeattleのVER300を追加。
2015/11/16追記: Delphi/C++Builder XE8以降のCPU32BITS/CPU64BITSを追加。
2016/04/20追記: Delphi/C++Builder 10.1 BerlinのVER310を追加。
2016/08/19追記: Compiler Versionsを参考に微妙に修正。
2017/03/23追記: Delphi/C++Builder 10.2 TokyoのVER320を追加。
2018/11/22追記: いくつかの標準条件シンボルが欠けていたのを修正。
2018/11/26追記: Delphi/C++Builder 10.3 RioのVER330を追加。
2020/06/01追記: Delphi/C++Builder 10.3.3 RioのANDROID64とDelphi/C++Builder 10.4 SydneyのVER340を追加。
2021/05/05追記: Delphi/C++Builder 10.4.2以降のRTLVersion<nnnn>(RTLVersion1041、RTLVersion1042)を追加。
2021/09/10追記: Delphi/C++Builder 11 AlexandriaのVER350とOSX/OSX64を追加。
2022/03/16追記: Delphi/C++Builder 11.1 AlexandriaのRTLVersion111とFRAMEWORK_VCL、FRAMEWORK_FMXを追加。
2022/09/13追記: Delphi/C++Builder 11.2 AlexandriaのRTLVersion112を追加。
2023/03/07追記: Delphi/C++Builder 11.3 AlexandriaのRTLVersion113を追加。
2023/11/09追記: Delphi/C++Builder 12 AthensのVER360を追加。
2023/11/24追記: Delphi/C++Builder 12 AthensのWEAK_NATIVEINTを追加。
2024/04/05追記: Delphi/C++Builder 12.1 AthensのRTLVersion121を追加。
2025/04/23追記: Delphi/C++Builder 12.2 AthensのRTLVersion122、12.3 AthensのRTLVersion123を追加。
2026/03/22追記: Delphi/C++Builder 13のVER370、Delphi/C++Builder 13.1のARM64EC、LLVMを追加。

2008年8月27日

2008年8月26日

Delphi 2009/C++Builder 2009公式発表

日本語のプレスリリースがでています。
エンバカデロ・テクノロジーズ、Windows®向け開発ツールの次世代バージョン「Delphi® 2009」「C++Builder® 2009」を発表
出荷開始は2008/09/18とのこと。まぁこれなら大丈夫でしょう。

2008/09/16追記:
Team Japan » Delphi 2009 / C++Builder 2009 予定通り9月18日出荷開始
ということで出荷開始が確定したようです。まだ注文していないけど…。

2008年8月25日

[書籍]UnicodeによるJIS X 0213実装入門

Unicode/UCS/UTF関係をプログラム側から解説している本はあまり多くないけど、たまたま紀伊國屋新宿本店で見かけたので購入。

マイクロソフト公式解説書 UnicodeによるJIS X 0213実装入門/田丸健三郎著/日経BPソフトプレス/ISBN 978-4-89100-608-2/2,415円

2008年8月22日

Delphi 2009のUnicodeサポート

公式のUnicodeサポート関連の記事。
Delphi in a Unicode World Part I: What is Unicode, Why do you need it, and How do you work with it in Delphi?
Delphi in a Unicode World Part II: New RTL Features and Classes to Support Unicode

2008/09/11追記: Part III追加
Delphi in a Unicode World Part III: Unicodifying Your Code

2008/09/16追記:
日本語訳が公開されています。

Delphi/C++Builder 2009は08/25にリリース?

記事(CodeGear買収後:EmbarcaderoからDelphi、C++Builderの新リリースが登場 - ITmedia エンタープライズ/eWeek.comの元記事)にもなっててそれもNick Hodgesさんのblogからもリンクされて(しかも"Nice article"って)いるので半ば決まりなんだと思いますが、Delphi/C++Builder 2009が2008/08/25に発売されるようです。FTerとしては"本当?"って感じですけど。
でも藤井さんのblogでは今週末勝負!みたいですね。まぁ25日とはいってもPDTでしょうから、時差9+7=16時間で、日本では26日なのかな?

2008/08/26追記: とりあえず予約可能("Delphi 2009 and C++Builder 2009 are immediately available worldwide for pre-orders.")になったようです(press release)。

2008/08/26再追記: 公式発表されてます。

2011/05/04追記: codegear.comのリンクをembarcadero.comのものに差し替え。

2008年8月13日

2008年8月10日

newsgroups.borland.com終了

newsgroups.borland.comがお亡くなりになったらしい。代替のディスカッションフォーラムではnntp(s)http(s)の両方でインタフェースできる。でもnntpはquoted-printableだし、httpだと<pre>タグとか書きたいし、微妙ですね。

2008/08/23追記: ん?nntpがUTF-8でくるなぁ。まぁそのほうが望ましいからいいけど。

Tiburon Unicode Video #5

Marco Cantuさんとこの5本目。
Tiburon Unicode Video #5

2008年8月8日

Tiburon Unicode Video #4

Marco Cantuさんとこの4本目。
Tiburon Unicode Video #4

2008年8月6日

Tiburon Unicode Video #3

Marco Cantuさんとこの続き。
Tiburon Unicode Video #3
まだ全然見てない…今週末かな。

2008年8月5日

Tiburonのスニークピークビデオ & Tiburon Unicode Video #1,#2

公式にスニークピークのビデオがあがってますね。とりあえずメモ。
スニークピークビデオ - Delphi 2009 / C++Builder 2009のVCL新機能
スニークピークビデオ - C++Builderでの新しい C++0x 標準のサポート
今晩早く帰って見ることにしよう。ああ、でも新しいビル(以下NDAにより自粛

Marco Cantuさんとこにも。
Tiburon Unicode Video #1
Tiburon Unicode Video #2

2008年8月4日

プラットフォーム依存の解消

従来のDelphiの関数/ユニット/シンボルのうち、プラットフォームに依存するものは警告されないように以下のような置き換えが推奨されています。
  • IncludeTrailingBackSlash() → IncludeTrailingPathDelimiter()

  • ExcludeTrailingBackSlash() → ExcludeTrailingPathDelimiter()

  • RaiseLastWin32Error() → RaiseLastOSError()

  • FormsネームスペースのMakeObjectInstance()およびFreeObjectInstance() → ClassesネームスペースのMakeObjectInstance()およびFreeObjectInstance()

  • uses FileCtrl → uses SysUtils

  • MinimizeName() → 普通はラベル表示用なのでTLabel.EllipsisPositionプロパティをepPathEllipsisにするとか…

また以下のものは警告を抑止($WARN SYMBOL_PLATFORM OFF)するか無視するしかないと思われます。
  • Win32Check

  • SysUtilsネームスペースのfaReadOnly, faHidden, faSysFile, faArchive, faSymLink定数

2008年8月3日

警告の抑止

Kylix(懐かしい)以前のDelphiからコードを移行すると、プラットフォーム/ライブラリに依存している、あるいは使用を推奨されていない、と警告(W1000/W1001/W1002)されることがあります。
これらはplatform/library/deprecatedヒント指令を付加されたシンボルの使用によるもので、基本的には警告されないように書き換えることが望ましいわけですが、すべての局面で書き換え可能とは限りません。
そこでこれらの警告を抑止するときは以下のコンパイラディレクティブを使用します。
{$WARN SYMBOL_PLATFORM OFF}    // プラットフォーム依存コードの警告を抑止
{$WARN SYMBOL_LIBRARY OFF}     // ライブラリ依存コードの警告を抑止
{$WARN SYMBOL_DEPRECATED OFF}  // 下位互換性コードの警告を抑止
なるべく抑止区間が短くなるよう、必要なブロックの直後でON(Delphi 2009ではDEFAULT)しておきましょう。

2008年8月2日

ディレクトリツリーを削除する

指定されたディレクトリをその中身ごと削除するには、再帰しながらそのディレクトリに含まれる全てのファイルとサブディレクトリを削除していきます。
uses
  Windows, SysUtils, Classes;

procedure DeleteDirTree(const Path: String);
var
  Index: Integer;
  DirNames: TStringList;
  FileNames: TStringList;
  SearchRec: TSearchRec;
  Pathname: String;
begin

  if Path = '' then
  begin
    Exit;
  end;

  DirNames := nil;
  FileNames := nil;
  try
    DirNames := TStringList.Create;
    FileNames := TStringList.Create;

    { Search }
    if FindFirst(IncludeTrailingPathDelimiter(Path) + '*.*',faAnyFile,SearchRec) = 0 then
    begin
      try
        repeat
          if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
          begin
            Continue;
          end;

          Pathname := IncludeTrailingPathDelimiter(Path) + SearchRec.Name;

          if (SearchRec.Attr and faDirectory) <> 0 then
          begin
            DirNames.Add(Pathname);
          end
          else
          begin
            FileNames.Add(Pathname);
          end;

        until (FindNext(SearchRec) <> 0);

      finally
        FindClose(SearchRec);
      end;
    end;

    { Delete sub directories }
    for Index := 0 to DirNames.Count - 1 do
    begin
      DeleteDirTree(DirNames.Strings[Index]);  // recursive call
    end;

    { Delete files }
    for Index := 0 to FileNames.Count - 1 do
    begin
      if DeleteFile(FileNames.Strings[Index]) = False then
      begin
        RaiseLastOSError;
      end;
    end;

    { Delete current directory }
    if RemoveDir(Path) = False then
    begin
      RaiseLastOSError;
    end;

  finally
    DirNames.Free;
    FileNames.Free;
  end;

end;
よくあるミスはFincCloseせずにディレクトリを削除しようとしてアクセス拒否を食らう、というやつです(普通にトラバースするだけならFindCloseしなくてもエラーにならないので気付きにくい)。

2008年8月1日

Tiburon Book

Delphi関係の本を何冊も出しているMarco Cantuさんですが、現在Tiburonの本を執筆中とのこと。どこかの出版社で翻訳してくれないかなぁ。

エクスプローラからのファイルのドラッグアンドドロップを特定のコントロールで受け入れる

fエクスプローラからファイルをドラッグアンドドロップで受け入れるにはDragAcceptFilesで受け入れを許可し、WM_DROPFILESメッセージで通知を受け付け、DragQueryFileでドロップされた各ファイルを受け取ります。特定のコントロールでこれを行うには、ウィンドウプロシージャを置き換える必要があります。この例ではListBoxでドラッグアンドドロップを受け入れています。
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FPrevListBoxWindowProc: TWndMethod;
    procedure ListBoxWindowProc(var Message: TMessage);
    procedure ListBoxWMDropFiles(var Msg: TWMDropFiles);
  public
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  { Replace window procedure }
  FPrevListBoxWindowProc := ListBox1.WindowProc;
  ListBox1.WindowProc := ListBoxWindowProc;

  { Enable to accept drop files }
  DragAcceptFiles(ListBox1.Handle,True);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

  { Disable to accept drop files }
  DragAcceptFiles(ListBox1.Handle,False);

  { Restore window procedure }
  ListBox1.WindowProc := FPrevListBoxWindowProc;

end;

procedure TForm1.ListBoxWindowProc(var Message: TMessage);
begin

  if Message.Msg <> WM_DROPFILES then
  begin
    { Call previous window procedure }
    FPrevListBoxWindowProc(Message);
    Exit;
  end;

  { Call WM_DROPFILES handler }
  ListBoxWMDropFiles(TWMDropFiles(Message));
  Message.Result := 1;

end;

procedure TForm1.ListBoxWMDropFiles(var Msg: TWMDropFiles);
var
  Index: Integer;
  Count: Integer;
  Size: Integer;
  Filename: String;
begin

  try
    { Get dropped filename }
    Count := DragQueryFile(Msg.Drop,DWORD(-1),nil,0);

    for Index := 0 to Count - 1 do
    begin
      { Get filename length }
      Size := DragQueryFile(Msg.Drop,Index,nil,0) + 1;

      { Get filename }
      SetLength(Filename,Size);
      Size := DragQueryFile(Msg.Drop,Index,PChar(Filename),Size);
      SetLength(Filename,Size);

      ListBox1.Items.Add(Filename)
    end;

  finally
    { Finish }
    DragFinish(Msg.Drop);
  end;

end;

2010/08/04追記: こちらに詳細に説明していますが、Windows Vista/7ではUIPIにより下位ILのプロセスから上位ILのプロセスに対して通信、この場合はファイルのドラッグアンドドロップを行うことができなくなっています。