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円