2012年4月5日

FireMonkeyクイックスタートガイド

FireMonkeyのクイックスタートガイドの日本語版が公開されています。後で読む。とりあえずメモ。

FireMonkey クイック スタート ガイド - はじめに - RAD Studio XE2
FireMonkey Quick Start Guide - Introduction - RAD Studio XE2

元ねたはエンバカデロの新井さんtweet

2012年4月3日

RAD Studio/Delphi/C++Builder XE2付属のAQtimeのアップデート

RAD Studio/Delphi/C++Builder XE2(Pro/Ent/Arc SKUのみ)にバンドルされているAQtime 7(AQtime Standard update for Delphi, C++Builder and RAD Studio XE2)が7.30.535.861から7.40.800.861にアップデートされています。

28463 AQtime Standard for Delphi, C++Builder and RAD Studio XE2
Delphi XE2/C++Builder XE2/RAD Studio XE2 向けに AQtime Standard のアップデート版が公開されました。
AQtime Standard update for Delphi, C++Builder and RAD Studio XE2

New AQtime Pro Features

2012年3月30日

[書籍]Windows Sysinternals徹底解説

MARUZEN&ジュンク堂書店 渋谷店Windows Sysinternals Administrator's Reference (amazon)の翻訳である

Windows Sysinternals徹底解説 (amazon)/Mark RussinovichAaron Margosis著/山内和朗訳/日経BP/ISBN 978-4822294649 (ISBN 4822294641)/4,935円

を購入。この本はWindows SysInternalsの各ツールについて、SysInternals生みの親であるMark Russinovichさん自身が徹底解説しています。またMark RussinovichさんのBlogは

Windows の内部を解き明かす | Mark's ブログ

として日本語に翻訳されています(全てのアーティクルではないようですが)。

この本(日本語版)については

Virtualization × Sysinternals (+ちょっとだけPR)|仮想化|ブログ|Computerworld

にも情報があります。

さらにWindows Sysinternalsについては国井傑さんによる"Windows Sysinternalsを使い倒せ(COMPUTERWORLD)"という連載も非常に参考になります。
2012/06/04追記: ITpro(要登録)にWindows Sysinternals徹底解説の一部抜粋が掲載されています。

2012年3月27日

FastReport VCL 4 RAD Edition 4.12.2リリース

CodeCentralにアップロードされているFastReport VCL 4 RAD Edition for Delphi and C++Builder XE2が更新されているようです。

28514 FastReport VCL 4 RAD Edition for Delphi and C++Builder XE2

アップデート前はインストーラのタイムスタンプが2011/09/29でバージョンが4.11.17、アップデート後のインストーラはタイムスタンプが2012/03/26で、インストール後のバージョンは4.12.2となっています。

エンバカデロの高橋さんからの情報によると4.12.2はエージーテックから出ている製品版の日本語版の最新版と同じバージョンとのことです。

2012年3月16日

第21回エンバカデロ・デベロッパーキャンプ 関連リンク

セッション資料ダウンロード
セッションリプレイ (YouTube エンバカデロチャンネル)
  • 【G1】オープニングセッション 「2012年 - エンバカデロの製品戦略」
  • 【T2】テクニカルセッション「実践!Delphiデバッグテクニック」 1/2 2/2
  • 【T3】テクニカルセッション「Delphi/C++Builder + FastReportで作る実用レポート出力」 1/2 2/2
  • 【T4】テクニカルセッション「FireMonkeyファーストインプレッション」 1/2 2/2
  • 【W5】ワークショップ「FireMonkeyアプリケーション構築実習」
  • 【W6】ワークショップ「挑戦!Delphiクイズで実力チェック」 1/2 2/2
  • 【T7】テクニカルセッション「RadPHPでスマホアプリを作ろう!」 1/2 2/2
  • 【T8】テクニカルセッション「Delphi言語再入門」 1/2 2/2
  • 【T9】テクニカルセッション「Delphi/C++BuilderでiOS/Macアプリを作ろう!」 1/2 2/2


(随時更新予定)

2012年3月15日

RAD Studio XE2 Update 4対応TeeChart Standardリリース

RAD Studio/Delphi/C++Builder XE2 Update 4に対応した"TeeChart Standard for RAD XE2 Update 4"がリリースされています。

28780 TeeChart Standard for Delphi, C++Builder, and RAD Studio XE2

2012年3月14日

Microsoft Monthly Update 2012/03

今日はMicrosoftのセキュリティアップデートの日です。
MS12-017
MS12-018
MS12-019
MS12-020
MS12-021
MS12-022

2012年3月10日

第21回エンバカデロ・デベロッパーキャンプ 2日目

本日09:00からデベロッパーキャンプ (edn)の第2日目が行われます。場所は同じく船橋のセミナーハウス クロス ・ウェーブ船橋です。GotoWebinar(要登録)とUSTREAMでオンラインでも参加できます。

今日も午前中はお天気が悪いようです(さすがに船橋は雪ではありません)。終わるころまでに雨がやむといいのですが。

先ほど09:00からセッションが始まっています。あのクイズの問題を英語で出されるのはちとつらいかもしれませんね。

全日程終了しました。セッションスピーカの皆さん、参加者の皆さん、関係者の皆さん、おつかれさまでした。

ところで昨日のW6セッションについていけなかった、という感想をお持ちの方がいらっしゃるようですが、講師の高橋さんによると「無理ですよ、6時間分を圧縮してやるんですから」ということなので気にする必要はないようです。

2012/03/13追記: Team Japanにフォローアップ記事があがっています。

Team Japan » 第21回エンバカデロ・デベロッパーキャンプ あれこれ

Firebird 2.0.7 Release Candidate 1リリース

Firebird 2.0.7 Release Candidate 1がリリースされています。

Firebird: Firebird 2.0.7 Release Candidate 1 Kits
Firebird 2.0.7 Release Notes

元ねたはFirebird News » Firebird 2.07 RC

2012年3月9日

第21回エンバカデロ・デベロッパーキャンプ 1日目

本日14:00から第21回エンバカデロ・デベロッパーキャンプ (edn)の第1日目が行われます。場所は船橋のセミナーハウス クロス ・ウェーブ船橋です。

Team Japan » 第21回 エンバカデロ・デベロッパーキャンプ - 会場へのアクセス

今回もGotoWebinar(要登録)とUSTREAMでオンラインでも参加できます。

東京はあいにくのお天気ですね。明日まで雨の予報で気温も低めのようです。それでは移動開始です。

会場に到着。駅からはやはり10分程度はかかりますね。セッション会場は微妙に狭いような。50~60人で満員になりそう。まもなく開始です。

最初の3セッション(G1/T2/T3)が終了。神様に愛されているのは細川さんだった模様。

1日目は終了。セッションスピーカの皆さん、参加者の皆さん、関係者の皆さん、お疲れさまでした。え?延長戦?どうなんでしょう?

明日のクイズの回答者のみなさん、がんばってくださいね。

2012/03/10追記: 富永さんがT4「FireMonkeyファーストインプレッション」のフォローアップを書いています。

2012年3月1日

2012/03開催のウェブセミナー


2012/03/12追記: 2012/03/16のデベロッパーキャンプ・リキャップのリンクを追加しました。

2012年2月21日

TVirtualMethodInterceptorを使う

Delphi XEの新機能の一つであるTVirtualMethodInterceptorを使用すると、クラスインスタンスの仮想メソッドの呼び出しに外部から介入することができます(メソッドの呼出前呼出後例外の発生に対してそれぞれイベントとして無名メソッドを割り当てることができる)。しかしTVirtualMethodInterceptorの実際の使い方については

TVirtualMethodInterceptorを試す。 - 全力わはー
Entropy Overload: Virtual method interception

ぐらいしか参考になる情報がありません。ということで実際に試してみましょう。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ActionList1: TActionList;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Action1Execute(Sender: TObject);
begin
  MessageDlg('Action1Execute',mtInformation,[mbOk],0)
end;

procedure TForm1.Action2Execute(Sender: TObject);
begin
  MessageDlg('Action2Execute',mtInformation,[mbOk],0)
end;

procedure TForm1.Action3Execute(Sender: TObject);
begin
  MessageDlg('Action3Execute',mtInformation,[mbOk],0)
end;

end.
画面上にボタンがあり、これらのボタンにはActionが割り当てられていてOnClickではこれらのActionが呼び出される、というサンプルプログラムです。ここでボタンをクリックしたときにフォーカスを残したくない、という新たな要求があり、それぞれのActionのOnExecuteの最後に"ActiveControl := nil;"という処理をを追加したいのですが、Actionが多数だと大変です。そこでTVirtualMethodInterceptorを使ってTAction.OnExecuteの呼出後に"ActiveControl := nil;"を実行するようにしてみましょう。まずusesにRTTIユニットを追加し、FormのOnCreateイベントでTVirtualMethodInterceptorを生成してprivate部に用意した変数に格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin
  FVMI := TVirtualMethodInterceptor.Create(TAction);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FVMI.Free;
end;
TVirtualMethodInterceptorのコンストラクタのパラメータは対象となるクラスです。次に生成したTVirtualMethodInterceptorのインスタンスのOnAfterイベントを設定します。
  FVMI.OnAfter :=
    procedure(Instance: TObject; Method: TRttiMethod;
              const Args: TArray<TValue>; var Result: TValue)
    begin
      if Method.Name = 'Execute' then
      begin
        ActiveControl := nil;
      end;
    end;
メソッドを実行したあとで、そのメソッドの名前が"Execute"であれば"ActiveControl := nil;"を実行する、という処理になります(OnAfterに割り当てているのは無名メソッドなので、Form1のActiveControlをキャプチャして使用することができます)。さらにそれぞれのアクション(TActionのインスタンス)をProxifyします。
  for I := 0 to ComponentCount - 1 do
  begin
    if Components[I] is TAction then
    begin
      FVMI.Proxify(TAction(Components[I]));
    end;
  end;
では実行してみましょう…うまくいきませんね。Method.Nameが'Execute'になった状態でOnAfterに入ってこないようです(おまけに終了時にエラーになります)。TAction.OnExecuteTBasicAction.Executeから呼び出されているはずです。ClassesユニットにあるTBasicAction.Executeの定義を見てみましょう。
    function Execute: Boolean; dynamic;
ん?dynamicですと?ヘルプには特定のクラス型の指定されたインスタンスに対する仮想メソッド呼び出しを ユーザーが動的にインターセプトできるようにします。とあります。そもそもTVirtualMethodInterceptorなので、動的(dynamic)メソッドはインターセプトできないのはあたりまえですね。どうしましょう…TAction.OnExecuteの呼出経路を探ってみると、TControlにはprotectedなActionLinkというプロパティがあり、割り当てられたActionはこのActionLinkのExecuteメソッド経由で呼び出されるようになっています。そしてこのTBasicActionLink.Executeはvirtualです。ということでここに介入することにします。とはいってもTControl.ActionLinkはprotectedですので、強引にclass helperでアクセスできるようにします。
type
  TButtonHelper = class helper for TButton
  public
    function GetActionLink: TActionLink;
  end;

function TButtonHelper.GetActionLink: TActionLink;
begin
  Result := Self.ActionLink;
end;
これでActionLink.Executeに介入できるようになります。
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  FVMI := TVirtualMethodInterceptor.Create(TActionLink);
  FVMI.OnAfter :=
    procedure(Instance: TObject; Method: TRttiMethod;
              const Args: TArray<TValue>; var Result: TValue)
  begin
    if Method.Name = 'Execute' then
    begin
      ActiveControl := nil;
    end;
  end;

  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TButton then
    begin
      FVMI.Proxify(TButton(Controls[I]).GetActionLink);
    end;
  end;
end;
実行してみましょう。…実行時にエラーになりますね。Proxifyで型が一致していないようです。調べてみるとTButtonのActionLinkのインスタンスの型はTActionLinkではなく派生したTPushButtonActionLinkになっています。
  FVMI := TVirtualMethodInterceptor.Create(TPushButtonActionLink);
こんどはうまく動作したようです。ところで終了時は?やはりEPrivilege例外が発生してエラーになります。Talesさんが指摘していますが、インターセプト対象のインスタンスが解放されるときには仮想メソッドであるdestructor Destroyが呼び出されるわけで、この時点までTVirtualMethodInterceptorのインスタンスを解放してはいけないということになります。ここではこの問題をclass destructorで解決します。
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ActionList1: TActionList;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    class var
      FVMI: TVirtualMethodInterceptor;
  public
    class constructor Create;
    class destructor Destroy;
  end;
TVirtualMethodInterceptorをclass varとして、class constructorで初期化し、class destructorで解放するようにします(TForm1のOnDestroyイベントの"FVMI.Free;"を削除するのを忘れないように)。
class constructor TForm1.Create;
begin
  FVMI := nil;
end;

class destructor TForm1.Destroy;
begin
  FVMI.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  if FVMI = nil then
  begin
    FVMI := TVirtualMethodInterceptor.Create(TPushButtonActionLink);
    FVMI.OnAfter :=
      procedure(Instance: TObject; Method: TRttiMethod;
                const Args: TArray<TValue>; var Result: TValue)
      begin
        if Method.Name = 'Execute' then
        begin
          ActiveControl := nil;
        end;
      end;
    end;

  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TButton then
    begin
      FVMI.Proxify(TButton(Controls[I]).GetActionLink);
    end;
  end;
end;
これですべてうまく動作しました。終了時もエラーになりません。

TVirtualMethodInterceptorがやっていることは基本的にはtalesさんが指摘しているとおりVMTの差し替えです。従って処理に介入できるのはインスタンスの仮想(virtual)メソッドのみで、動的(dynamic)メソッドや静的メソッド、クラスメソッドは対象になりません。またProxifyしたインスタンスが全て解放されるまではTVirtualMethodInterceptorのインスタンスを解放してはいけません(デストラクタはvirtualなのでVMTを参照する)。もうひとつ気をつけなければならないのはTVirtualMethodInterceptorのコンストラクタで指定しているクラス型が実際にProxifyするクラス型と完全に一致していなければならない(代入互換性があるというのではだめ)という点です。

2012/02/29追記: TVirtualMethodInterceptor.OriginalClassプロパティを使ってVMTを書き戻すか、同じことをしてくれるUnproxify(XE2で追加)で終了時の問題をクリアすることができる、という指摘がLynaさんからありました。ということでこちらも試してみます。まずOriginalClassプロパティに格納されているもともとのVMTを書き戻す方法から。
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ActionList1: TActionList;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FVMI: TVirtualMethodInterceptor;
  end;
フォームのクラスコンストラクタ/クラスデストラクタを削除し、TVirtualMethodInterceptorを通常のprivateなフィールドに戻します。またフォームのOnDestroyイベントを用意します。
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  FVMI := TVirtualMethodInterceptor.Create(TPushButtonActionLink);
  FVMI.OnAfter :=
    procedure(Instance: TObject; Method: TRttiMethod;
              const Args: TArray<TValue>; var Result: TValue)
    begin
    if Method.Name = 'Execute' then
    begin
      ActiveControl := nil;
    end;
  end;

  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TButton then
    begin
      FVMI.Proxify(TButton(Controls[I]).GetActionLink);
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TButton then
    begin
      PPointer(TButton(Controls[I]).GetActionLink)^ := FVMI.OriginalClass;
    end;
  end;
  FVMI.Free;
end;
フォームのOnDestroyイベントでProxifyしたVMT(OriginalClass)を元に戻しています。うまくいきましたね。

それではDelphi XE2で追加されたUnproxifyを使う方法を。
procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TButton then
    begin
      FVMI.Unproxify(TButton(Controls[I]).GetActionLink);
    end;
  end;
  FVMI.Free;
end;
フォームのOnDestroyイベントでUnproxifyするだけで基本的に同じです。こちらも問題なく動作しました。

2012年2月17日

Visualizing using FireMonkeyシリーズ

エンバカデロ・テクノロジーズのAnders OhlssonさんによるFireMonkeyで数式をビジュアル化する"Visualizing using FireMonkey"シリーズ(勝手に命名)が翻訳されています。
そういえばJim TierneyさんのLiveBindingチュートリアルの3本目(http://blogs.embarcadero.com/jimtierney/2011/10/14/31608)が翻訳されてないのは元記事がednにあがっていない(blogにのみある)から、とのこと。

2012/03/27追記: C++(C++Builder XE2)を使った記事2本のリンクを追加しました。

2012年2月15日

Microsoft Monthly Update 2012/02

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

2012年2月9日

例外チェーン

Delphi 2009の新機能の一つに例外チェーン、あるいはネストした例外オブジェクトというものがあります。従来の(Delphi 2007およびそれ以前の)例外処理では、発生した例外をtry...except文で捕捉した場合に、そのままendに到達することで例外処理を終了させるか、別の例外オブジェクトを生成して送出することで例外処理をさらに上位に向かって継続するか、例外を再生成("raise;")することで例外処理を継続するか、のいずれかになります。しかし、別の例外を送出する場合は元の例外オブジェクトの持つ情報は消滅してしまいますし、例外を再生成する場合は新たな情報を付け加えることができません。そこでこの例外チェーンという機能を使うことで、元の例外オブジェクトの持つ情報に新たな情報を加えて上位の処理に送出することができます。

例として、あるテキストファイルの1行目に書かれている文字列を10進数とみなして取り込む、という関数を考えてみます。
type
  EFileIsEmpty = class(Exception);

function ReadIntegerValueFromFile(const Path: String): Integer;
var
  Filename: String;
  SL: TStringList;
begin

  Filename := IncludeTrailingPathDelimiter(Path) + 'FOO.TXT';
  SL := TStringList.Create;
  try
    SL.LoadFromFile(Filename);
    if SL.Count = 0 then
    begin
      raise EFileIsEmpty.Create('File is empty.');
    end;

  Result := StrToInt(SL.Strings[0]);

  finally
    SL.Free;
  end;

end;
ここで例外が送出される状況には、1.何らかの理由でファイルを開けない(EFOpenError)、2.ファイルが空(0行)だった(EFileIsEmpty)、3.1行目に10進数に変換できない文字があった(EConvertError)の3つがあります(正確にはリソース不足でTStringList.Createが失敗する状況を含め4つですが、今回は考えないことにします)。それぞれの原因に対応した例外クラスがあるため、呼び出し元ではエラーの理由を例外オブジェクトのクラスの違いで知ることができます。
procedure TForm1.Button1Click(Sender: TObject);
begin

  try
    ReadIntegerValueFromFile('C:\BAR');

  except
    on E: EFOpenError do
    begin
      MessageDlg('ファイルを開けませんでした。' + sLineBreak + E.Message,
                 mtInformation,[mbOk],0);
      Exit;
    end;

    on E: EFileIsEmpty do
    begin
      MessageDlg('ファイルが空でした。' + sLineBreak + E.Message,
                 mtInformation,[mbOk],0);
      Exit;
    end;

    on E: EConvertError do
    begin
      MessageDlg('不正な文字列が入っていました。' + sLineBreak + E.Message,
                 mtInformation,[mbOk],0);
      Exit;
    end;
  end;

end;
ここでエラーメッセージにファイル名を表示したい、ということになったとします。ところが呼出元のレベルではファイルの存在するパスはわかっていますがフルパス名はReadIntegerValueFromFileの内部に隠蔽されてしまっています。そこで
type
  EFileIsEmpty = class(Exception);
  EFileReadError = class(Exception)
  private
    FFilename: String;
  public
    constructor Create(const Msg: string; const AFilename: String);
    property Filename: String read FFilename;
  end;

function ReadIntegerValueFromFile(const Path: String): Integer;
var
  Filename: String;
  SL: TStringList;
begin

  Filename := IncludeTrailingPathDelimiter(Path) + 'FOO.TXT';
  SL := TStringList.Create;
  try
    try
      SL.LoadFromFile(Filename);
      if SL.Count = 0 then
      begin
        raise EFileIsEmpty.Create('File is empty.');
      end;
      Result := StrToInt(SL.Strings[0]);

    except
      raise EFileReadError.Create('Error!',Filename);
    end;

  finally
    SL.Free;
  end;

end;

constructor EFileReadError.Create(const Msg, AFilename: String);
begin

  inherited Create(Msg);

  FFilename := AFilename;

end;
とすることで
procedure TForm1.Button1Click(Sender: TObject);
begin

  try
    ReadIntegerValueFromFile('C:\BAR');

  except
    on E: EFileReadError do
    begin
      MessageDlg(Format('ファイル ''%s'' の読み込みでエラーが発生しました。' + 
                        sLineBreak  + '%s',
                        [E.Filename,E.Message]),
                 mtInformation,[mbOk],0);
      Exit;
    end;
  end;

end;
のようにエラーがあったときにそのファイルのフルパス名を知ることができます。が、エラーの原因はわからなくなってしまいました。そこで例外チェーンの登場です。クラスプロシージャException.RaiseOuterExceptionを使用することで、その例外ハンドラで受け取った例外オブジェクトを消滅させることなく新たな例外を送出することができます。
type
  EFileIsEmpty = class(Exception);
  EFileReadError = class(Exception)
  private
    FFilename: String;
  public
    constructor Create(const Msg: string; const AFilename: String);
    property Filename: String read FFilename;
  end;

function ReadIntegerValueFromFile(const Path: String): Integer;
var
  Filename: String;
  SL: TStringList;
begin

  Filename := IncludeTrailingPathDelimiter(Path) + 'FOO.TXT';
  SL := TStringList.Create;
  try
    try
      SL.LoadFromFile(Filename);
      if SL.Count = 0 then
      begin
        raise EFileIsEmpty.Create('File is empty.');
      end;
      Result := StrToInt(SL.Strings[0]);

    except
      Exception.RaiseOuterException(EFileReadError.Create('Error!',Filename));
    end;

  finally
    SL.Free;
  end;

end;

constructor EFileReadError.Create(const Msg, AFilename: String);
begin

  inherited Create(Msg);

  FFilename := AFilename;

end;
ここで送出される例外オブジェクトはEFileReadErrorのままです。しかし
procedure TForm1.Button1Click(Sender: TObject);
begin

  try
    ReadIntegerValueFromFile('C:\BAR');

  except
    on E: EFileReadError do
    begin
      if E.InnerException is EFOpenError then
      begin
        MessageDlg(Format('ファイル ''%s'' を開けませんでした。' + 
                          sLineBreak + '%s',
                          [E.Filename,E.InnerException.Message]),
                   mtInformation,[mbOk],0);
      end
      else if E.InnerException is EFileIsEmpty then
      begin
        MessageDlg(Format('ファイル ''%s'' が空でした。' + 
                          sLineBreak + '%s',
                          [E.Filename,E.InnerException.Message]),
                   mtInformation,[mbOk],0);
      end
      else if E.InnerException is EConvertError then
      begin
        MessageDlg(Format('ファイル ''%s'' の1行目に不正な文字列が入っていました。' + 
                          sLineBreak + '%s',
                          [E.Filename,E.InnerException.Message]),
                   mtInformation,[mbOk],0);
        Exit;
      end;

      Exit;
    end;
  end;

end;
と例外オブジェクトのInnerExceptionプロパティでException.RaiseOuterExceptionを呼び出した時点での例外オブジェクトを参照することができます。

この例外チェーンに関係するメソッド、プロパティには
  • RaiseOuterException: 例外ブロック内で使用し、新しく生成した例外オブジェクトをパラメータとして呼び出すことでその時点での例外オブジェクトをチェーンした例外を送出するExceptionクラスのクラスプロシージャ。
  • ThrowOuterException: RaiseOuterExceptionと同じ。C++では例外はraiseするものではなくthrowするものなのでこの名前のクラスプロシージャも用意されている。
  • InnerException: 最も近いRaiseOuterExceptionを送出した時点での例外オブジェクトを格納しているプロパティ。通常の例外の送出(raise EXXXX.Create)ではnilとなる。またRaiseOuterExceptionがネストして呼び出されている場合はE.InnerException.InnerException...のようにさかのぼって例外オブジェクトを参照することができる。
  • BaseException: ネストしてRaiseOuterExceptionが呼び出された場合に最初に送出された例外オブジェクトを格納しているプロパティ。通常の例外の送出(raise EXXXX.Create)ではnilとなる。また1段階しかRaiseOuterExceptionが呼び出されていない場合はInnerException=BaseExceptionとなる。
  • ToString例外チェーン上の全ての例外オブジェクトのMessageプロパティをCR+LFで連結したプロパティ。
があります。

元ねたはDELPHI 2009 HANDBOOK

2012年2月2日

[書籍]世界一わかりやすいSQLの授業

同じくMARUZEN&ジュンク堂書店 渋谷店

世界一わかりやすいSQLの授業 (amazon)/Lepton著/ソシム/ISBN 978-4-88337-801-2/2,079円

を購入。

[書籍]Clean Coder

MARUZEN&ジュンク堂書店 渋谷店The Clean Coderの翻訳である

Clean Coder (amazon)/Robert C. Martin著/角征典訳/アスキー・メディアワークス/ISBN 978-4-04-886069-7/2,100円

を購入。プロフェッショナルなプログラマ(またはそれを目指す人)は読んでおくべきです。

2012年2月1日

第21回エンバカデロ・デベロッパーキャンプ開催決定

第21回エンバカデロ・デベロッパーキャンプは2012年03月09日~2012年03月10日の2日間で開催されます。

エンバカデロ・デベロッパーキャンプ
【3/9~10】第21回 エンバカデロ・デベロッパーキャンプ

今回は全セッションオンラインで中継あり、懇親会あり、そして宿泊ありと盛り沢山で行われます。

2012/02開催のウェブセミナー



2012/02/23追記: リプレイビデオのリンクを追加しました。

2012年1月27日

Firebirdロードマップ(2012/01)

ちょっと前のことになりますが、Firebirdのロードマップが更新されています。

Firebird: Roadmap

てきとうな要約:
  • 1.5 - 1.5.6が最終版で、今後公式にリリースされることはない。ただし新しいバージョンからバックポートされたバグフィックスを含む修正版が必要と判断した場合はIBPhoenixから商用製品としてリリースされるかもしれない。
  • 2.0 - 2.0.6(2010/06)が最新版で、年1回のメンテナンスサイクルでのリリースが宣言されている。次のリリース(2.0.7)は2012年のQ1を予定。
  • 2.1 - 2.1.4(2011/03)が最新版で、こちらも年1回のメンテナンスサイクルでのリリースが宣言されている。次のリリース(2.1.5)は2012年のQ3を予定。
  • 2.5 - 2.5.1(2011/10)が最新版で、年2回のメンテナンスサイクルでのリリースが宣言されている。次のリリース(2.5.2)は2012年のQ2を予定。
  • 3.0 - 現在開発中の最新版で、Alpha 1は2012年のQ1にリリースを予定。キーポイントは以下のとおり。
    • 新しい認証サブシステム、構成サブシステムを含む、改訂されたアーキテクチャ
    • 共有ページキャッシュを備えたスケーラブルなマルチスレッドエンジン
    • 新しいシステムテーブル、モニタテーブルを備えた新しいODS(Version 12)
    • JavaやC++などによる外部ストアドプロシージャ、トリガ、関数
    • 作り直されたオプティマイザと新しいデータアクセスメソッド
    • セキュリティの強化
    • さまざまなSQL拡張

元ねたはFirebird News » Firebird Roadmap updated for January 2012

2012/03/18追記: Firebird News » Firebird roadmap has been updatedからの情報で、ロードマップが一部変更されています。具体的には、
  • 2.0は現在2.0.7がRC1(これは変更なし)
  • 2.1は若干早まって2.1.5を2012年のQ2に予定
  • 2.5も若干早まって2.5.2を2012年のQ2に予定
  • 3.0は逆にAlpha 1を2012年のQ2に遅らせる
ということで、3.0の開発を遅らせてその分のリソースを2.1/2.5に振り分けることにした、という話のようです。

2012年1月26日

TMS Aurelius

Delphiで使用できるORMとしてちょっと前にDORM (Delphi ORM)を取り上げましたが、TMS Softwareから

TMS Aurelius

という製品がリリースされています。Delphi 2010/XE/XE2で動作し、
  • 対応プラットフォーム: Windows x86/x64、Mac OS X
  • 対応RDBMS: Firebird、Interbase、Microsoft SQL Server、MySQL、NexusDB、Oracle、SQLite、PostgreSQL、DB2
  • 対応データアクセスコンポーネント: dbExpress、dbGo(ADO)、Interbase Express(IBX)、SQLite、AnyDac、NexusDB、SQL-Direct
となっています。ライセンスはシングルデベロッパライセンス(1ユーザ)が195EUR(=19,800JPY)、スモールチームライセンス(2ユーザ)が295EUR(=30,000JPY)、サイトライセンス(ユーザ数無制限)が695EUR(=70,600JPY)となっています(2012/02/29までの限定で20%のディスカウント中)。

2012年1月17日

IBSurgeon Log Viewer

InterBase/Firebird用の各種ツールで有名なIBSurgeonからIBSurgeon Log ViewerというツールがFREEWAREとして公開されています。

IBSurgeon Log Viewer

InterBase(interbase.log)やFirebird(firebird.log)のログファイルには(いつもではないにしても)ときどき有用な情報が記録されています。しかしログそのものが場当たり的に拡張されてきたため、メモ帳やエディタなどで開いてもなかなか必要な情報にたどりつくことができません(また必要な情報が記録されていないことも多々あります)。このIBSurgeon Log Viewerはこれらのログを見やすく表示するだけでなく、可能であればそのログの原因となるような状況についても解説を表示してくれる("Message Description"ペイン)というツールです。現時点(2012/01/17)の最新バージョンは2.0.0.5となっています。

元ねたはFirebird News » IBSurgeon Log Viewer 2.0 – free tool for viewing and analyzing firebird.log

2012年1月11日

Microsoft Monthly Update 2012/01

今日はMicrosoftのセキュリティアップデートの日です。
MS12-001
MS12-002
MS12-003
MS12-004
MS12-005
MS12-006
MS12-007

2012年1月5日

2012/01開催のウェブセミナー


2012/02/08追記: リプレイビデオのリンクを追加しました。

2012年1月4日

IDE Fix Pack 4.6.5/4.6.6リリース

Andreas HausladenさんIDE Fix Pack 2009/2010/XE/XE2がアップデートされてVersion 4.6.5になっています。

IDE Fix Pack 4.6.5 released | Andy’s Blog and Tools

追記: IDE Fix Pack 2009/2010/XE/XE2 Version 4.6.5にはデバッガが相対パス指定のソースファイルを見つけられないという問題があり、これを修正したVersion 4.6.6がリリースされています。

IDE Fix Pack 4.6.6 – bug fix release | Andy’s Blog and Tools

2011年12月30日

Microsoft OOB Update 2011/12

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

2011年12月28日

IDE Fix Pack 4.6.1リリース

Andreas HausladenさんIDE Fix Pack 2009/2010/XE/XE2がアップデートされてVersion 4.6.1になっています。このバージョンではバグフィックス2件のみで機能的な追加変更は含まれていないとのことです。

IDE Fix Pack 4.6.1 – bugfix release | Andy’s Blog and Tools

2011年12月20日

RAD Studio/Delphi/C++Builder XE2 Update 3 Hotfix 2

RAD Studio/Delphi/C++Builder XE2 Update 3のHotfix 2(Ent/Arc/Ult SKUのみ)がリリースされています。
  • QC101807 Update 3適用後にAndroid用モバイルコネクタのDSRESTSSLFactory.javaが不足する
という問題を修正するものです。

28672 HotFix 2 for Delphi, C++Builder and RAD Studio XE2
C++Builder XE2/Delphi XE2/RAD Studio XE2 向け Hotfix 2
Hotfix 2 for C++Builder XE2, Delphi XE2 and RAD Studio XE2 is now available

2011年12月19日

FastReport 4 VCL日本語版

Delphi/C++Builder XE2ではFastReport 4 RAD Editionが標準でバンドルされるようになりましたが、先週のデベロッパーTVでもちょっと話が出ていた製品版の日本語版が2012/01/13に発売されるようです。

レポーティングソリューション FastReport VCL | 製品概要
リオスe-Shop/商品一覧ページ

エージーテックさんのページでは1月中旬以降正式リリースとなっていますが、リオスe-Shopさんでは2012/01/13発売と日付まで出ています。またリオスe-Shopさんでは2011/11/21から

キャンペーン期間中にご成約いただきますと、まずは英語版をお送りし、日本語版販売時に優先して、日本語版をお送りします。
(同じライセンス番号で動作しますので、日本語か英語のどちらかでご利用できます)
という「先行販売割引キャンペーン」(42,000円)をやっています。ちなみにこれはEnterprise Edition/Single license相当(Fast Reports Inc.から直接買えば349.00USD=27,000JPY)ですので、日本語に翻訳されていることに15,000円出せるかどうか、ということになるのかと。実際に仕事で使うなら許容範囲でしょうか。

2012/01/16追記: FastReport VCLの日本語版がリオスe-Shopで販売開始になっています。

レポーティングソリューション FastReport VCL | 製品概要
リオスe-Shop/商品一覧ページ

2012/01/18追記: 製品版のFastReportをインストールするためにバンドル版をアンインストールするとコンポーネントの登録が全て削除されるという不具合(QC102274)が報告されており、Team Japanに詳細と対応策が解説されています。

Team Japan » Delphi/C++Builder/RAD Studio XE2のUpdate3 で FastReportをアンインストールすると..

2011年12月16日

IDE Fix Pack 4.6リリース

Andreas HausladenさんIDE Fix Pack 2009/2010/XE/XE2がアップデートされてVersion 4.6になっています。

IDE Fix Pack 4.6 (supports XE2 Update 3) | Andy’s Blog and Tools

Delphi/C++Builder XE2 Update 3

かねてからの噂どおりDelphi/C++Builder XE2のUpdate 3がリリースされています。

28670 Update 3 for Delphi, C++Builder and RAD Studio XE2
Update 3 for Delphi XE2, C++Builder XE2 and RAD Studio XE2
XE2 Update 3 のリリース ノート - RAD Studio XE2 (en)
Delphi XE2/C++Builder XE2 Update 3 における不具合修正リスト (en)

Update 3ではTButtonのModalResultプロパティで使用するいくつかの値の定義が変更されています。またコンパイラ内の一部の構造体の変更に伴いAndreas HausladenさんIDE Fix Pack 2009/2010/XE/XE2 4.5が動作しなくなっています(既に4.6がリリースされています)。

TButtonのModalResultプロパティで使用する値の件はUpdate 3のリリースノートに明記されただけで、実際にはXE2 RTMにおける変更のようです(QC100283)。まずTButto.ModalResultの型はTModalResultですが、TModalResultは列挙型ではなく単に
  TModalResult = Low(Integer) .. High(Integer);
と実質的にIntegerであり、それぞれの値(mr...)は該当するボタンのID(ID_...)と同値で、XEおよびそれ以前ではControls.pasで、XE2ではSystem.UITypes.pasで定義されています。Update 3のリリースノートからリンクしているBob SwartさんのXE2 values of mrAll, mrNoToAll, mrYesToAll and mrCloseというアーティクルで詳しく考察されていますが、XEではmrCloseがmr...の最後(mrYesToAllの次)になるように定義されているのに対し、XE2ではmrHelp、mrTryAgain、mrContinueと共にmrNoの次になるように移動し、その後にmrAll、mrNoToAll、mrYesToAllとmrYesToAllが最後になるように定義が変更されています。さらにTModalResultは列挙型でないためdfm上は数値として記録されているため、XEまでのコード(フォームデータ)でModalResultにmrAll、mrNoToAll、mrYesToAll、mrClose(8~11)と設定していたものをXE2に取り込むとmrClose、mrHelp、mrTryAgain、mrContinueに変化してしまう、ということになります(あるいはソースを共用している場合は逆のことも起きます)。基本的にbreaking changeということであり、個別に対策するしかないのですが、上記のBob Swartさんのアーティクルにはこの問題を指摘してくれるScanDFMというツールがリンクされています。

2012/02/10追記: ModalResultの定義値の変更の件を補足しました。高橋さん、情報ありがとうございます。

2011年12月14日

2011年12月7日

Asphyre Sphinx 2

Delphi/C++Builder上で2D/3Dグラフィックスを扱うライブラリとして以前取り上げたAsphyre Sphinxですが、メジャーバージョンアップした2.0.0がリリースされています。

Asphyre Sphinx 2

Delphi XE2 Update 1に対応しており、Windows x86/x64およびMacOS X/iOS上のDirectX 7/DirectX 9/DirectX 10/DirectX 10.1/DirectX 11/OpenGLをサポートしています。ライセンスは以前と同じくMPL 1.1です。

またVer1も最新版は1.1.0となっており、Delphi 2006/Turbo Delphi/Delphi 2007に加えてDelphi XEにも対応しています。

Asphyre Sphinx

元ねたは2ちゃんねるのくだすれDelphi(超初心者用)その53の902

2011年12月1日

dbExpressのODBCドライバでPostgreSQLに接続

オープンソースのRDBとして日本では人気のPostgreSQL (日本PostgreSQLユーザ会)ですが、世界的に見るとあまり重要視されておらず、dbExpressでも以前からMySQLはサポートされています(Ent/Ult/Arc SKUのみ)がPostgreSQLは予定すらない、という状況でした。しかしDelphi XE2では(これもEnt/Ult/Arc SKUのみですが)dbExpressのODBCドライバが新しく追加されました。このdbExpressのODBCドライバを経由してPostgreSQLに接続する方法についてラテンアメリカ・カリブ地域担当プロダクトラインマネージャ・リードエバンジェリストのAndreano Lanusseさんが解説しています。興味深い。とりあえずメモ。

Connecting to PostgreSQL through dbExpress ODBC driver | Andreano Lanusse Blog | Technology and Software Development | C++Builder

ODBCデータソースアドミニストレータ(odbcad32.exe)でPostgreSQLのODBCドライバを指定したデータソースを作成しておいて、dbExpressのSQLConnectionのDriverNameに'ODBC'を、ParamsのDatabaseにそのデータソース名(DSN)を指定することで、Delphi/C++Builder-dbExpress-dbExpress ODBCドライバ-ODBC-PostgreSQL ODBCドライバ-PostgreSQLサーバという形で接続できる、ということのようです。なおx64環境ではODBCデータソースアドミニストレータ(odbcad32.exe)もx86、x64の両方が存在するので、クライアントのターゲットプラットフォームによって使い分ける必要があります。

日本語だと第20回 エンバカデロ・デベロッパーキャンプの【B4】 Delphi/C++Builderテクニカルセッション 「dbExpressとマルチプラットフォーム開発」プレゼンテーション資料あたりが参考になります。

2012/02/10追記: デベロッパーキャンプのプレゼンテーション資料のリンクを追記しました。高橋さん、情報ありがとうございます(遅くなりましたが)。

2011年11月30日

[書籍]プログラミングC# 第6版

MARUZEN&ジュンク堂書店 渋谷店Programming C# 4.0の翻訳である

プログラミングC# 第6版 (amazon)/Ian Griffiths、Matthew Adams、Jesse Liberty著/鈴木幸敏、首藤一幸、株式会社情報技研訳/オライリージャパン/ISBN 978-4-87311-517-7/5,040円

を購入。

2011年11月28日

JVCL 3.45リリース

JVCL(JEDI Visual Component Library)がアップデートされてVersion 3.45(JCL Version 2.3.1)になっています。

JEDI VCL for Delphi - Browse /JVCL 3/JVCL 3.45 at SourceForge.net

またAndreas HausladenさんがコマンドラインコンパイラDCC32/DCC64が付属していないDelphi/C++Builder XE2 Starter SKUのためのコンパイル済バイナリのインストーラをCodeCentralにアップロードしています(上記のリリースバージョンそのものではなく、JCLはsvn revision 3634、JVCLはsvn revision 13184から作成したものとのことです)。

28636 Jedi Code Library 2.4.0.4198r3634 BinaryInstaller for XE2
28637 Jedi Visual Component Library 3.45r13184 BinaryInstaller for XE2

元ねたはUpdated JCL and JVCL Binary Installers for XE2 | Andy’s Blog and Tools

2011年11月22日

DORM (Delphi ORM)

Delphi XEの新機能の新しい(拡張された)RTTIと属性の利用方法として考えられるもののひとつとしてORM(Object-relational mapping)があります。新しいRTTIでクラスの持つプロパティと型情報を参照してデータベースとのマッピングに利用し、属性で個別の細かい制御を行う、というアイデアはわりと一般的なものかもしれません。実験的な実装はいくつかあるようですが、一応実用に耐えるレベルのもの、となるといまのところDaniele TetiさんによるDORM (Delphi ORM)ぐらいでしょうか。

DORM, the Delphi ORM

Delphi XE/XE2で使用可能で、対応データベースはいまのところdbExpress経由のFirebird (2.1+)またはInterBase (2009+)です。ライセンスはApache License 2.0 (en)となっています。

先日のITDevCon 2011のDaniele Tetiさんのセッションのプレゼンテーション資料

DORM, the Delphi ORM

が参考になります。

元ねたはwhile true do; » Blog Archive » dorm, “The Delphi ORM”, officially published at ITDevCon

2011年11月15日

AppWave評価ガイドビデオ

YouTubeのEmbarcaderoTechJapanチャンネルにAppWave評価ガイドのビデオがアップロードされています。興味深い。とりあえずメモ。

AppWave評価ガイド #1 - AppWaveのインストール - YouTube
AppWave評価ガイド #2 - AppWaveブラウザを使う - YouTube
AppWave評価ガイド #3 - AppWaveを管理する - YouTube
AppWave評価ガイド #4 - AppWaveアプリを作成する - YouTube
AppWave評価ガイド #5 - 既存のDelphiアプリケーションをアプリ化する - YouTube

ただしAppWaveを使用するとDelphi 2007の登録情報が破損するという情報がありますので、注意が必要です。以下tweetを引用。

http://twitter.com/#!/Tokcyu3/status/101190890642608128
AppWaveを使うとなにかのタイミングでDelphi2007の登録情報が飛んじゃうみたい。今のところ2回再登録した。ぐむむぅ…

http://twitter.com/#!/ht_deko/status/134647986130137089
先日 Delphi 2007 の再登録が必要になってしまった件は これが原因か。そういや確かに触ったよ AppWave。 RT @Tokcyu3 AppWaveを使うとなにかのタイミングでDelphi2007の登録情報が飛んじゃうみたい。今のところ2回再登録した。ぐむむぅ…

2011/11/18追記: Delphi 2007との相性の問題がQC101120として登録されています。

2011年11月11日

Generic collections library (delphi-coll)

Delphi 2009の新機能の一つにジェネリクスがあります。このジェネリクス機能を簡単に利用するためのジェネリクスクラスとして、Delphiには標準でGenerics.Collectionsユニットにが用意されています。しかしC++のSTL(Standard Template Library)のコンテナや.NET Frameworkのジェネリックコレクションに比べると必ずしも十分とはいえません。これを補うものとしてCiobanu AlexandruさんによるGeneric collections library (delphi-coll)というライブラリがあります。

delphi-coll - Generic collections library for Delphi 2010 and XE - Google Project Hosting

ライセンスは修正BSD (en)となっています。

delphi-collにはList、Queue、Stack、Set、Dictionary、Bag、MultiMap、BidiDictionary、BidiMapの各基本ジェネリクスクラスと、これらに対するObject、Linked、Sortedやその組み合わせなどにより修飾された多数のバリエーションがあります。詳細は

CollectionDetails - delphi-coll

を参照してください。またDelphi標準のジェネリクスクラスとの違いについては

DifferencesFromGenericsCollections - delphi-coll

に記述されています。なおdelphi-collをDelphi XE2で使用する場合は最新版(1.2)をSVNでチェックアウトする必要があるようです。またDelphi XE2 Update 2のコンパイラの変更により、一部のコードがエラーになる、という情報もありますので注意が必要です。

2011年11月10日

Prism XE2 Update 2

Prism XE2 Update 2がリリースされています。

28623 Embarcadero Prism XE2 Update 2 (October 2011 Release)
Embarcadero Prism XE2 Update 2 is now available
Embarcadero Prism XE2 Update 2 が公開されました

クラスヘルパ

クラスヘルパはDelphi 2007で導入された新機能で、クラスを継承することなく拡張するためのものです(Delphi 2007 HandbookにはDelphi 2007でDelphi 2006とのバイナリレベルでの互換性を確保するために導入された、とあります)。当初はクラスにしか適用できませんでしたが、Delphi 2010以降ではレコード型に対しても(レコードヘルパとして)適用することができます。しかしヘルパで定義したメソッドではpublicメンバにしかアクセスできないため、ある種のシンタックスシュガーのように考えればよいと思っていました。DelphiデベロッパチームシニアソフトウェアデベロッパのMat DeLongさん Mat DeLongさんのこのアーティクルを読むまでは。

Mat DeLong : Gaining access to private fields of a class Gaining access to private fields of a class in Delphi | Mat DeLong

これによると、private/protectedメンバであっても"Self."で修飾することでアクセスできる、と書かれています。なんですと?ということでDelphi 2007以降の各バージョンで確認してみました。
  • Delphi 2007: "Self."の有無に関わらずpublicのみアクセス可能
  • Delphi 2009: "Self."とすることでprivateはアクセスできるがなぜかprotectedはアクセス不可
  • Delphi 2010/XE/XE2: "Self."とすることでprivate/protectedもアクセス可能
Delphi 2010以降であればこの方法でより突っ込んだことができそうです。

またクラス ヘルパとレコード ヘルパ(Delphi)には

ただし、ソース コードの任意の場所で適用されるヘルパの数は、0 または 1 つだけです。
とあり、ひとつのクラスに複数のヘルパを適用することはできないのですが、ヘルパの構文として
type
  identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
    memberList
  end;
とあり、継承したクラスヘルパを作成することで実質的に複数のヘルパを適用することができます。
type
  TFooHelper = class helper for TFoo
  public
    procedure Bar1;
  end;

  TFooHelperEx = class helper (TFooHelper) for TFoo
  public
    procedure Bar2;
  end;

var
  Foo: TFoo;
begin
  ...
  Foo.Bar1;  // TFooHelper.Bar1
  Foo.Bar2;  // TFooHelperEx.Bar2
  ...
こんな感じです。

2020/09/23追記: Mat DeLongさんの記事のリンクを更新しました。pmcgeeさん、情報ありがとうございます。

2011年11月9日

RAD Studio/Delphi/C++Builder XE2 Update 2 Hotfix 1

RAD Studio/Delphi/C++Builder XE2 Update 2のHotfix 1がリリースされています。
  • QC100661 Update 2適用後にOSX用C++Builder FireMonkeyアプリケーションがリンカエラーになる
  • QC100640 OSX用C++Builder FireMonkeyアプリケーションでSTLコンテナがコンパイルエラーになる
の2点を修正するものです。

28622 HotFix 1 for Delphi, C++Builder and RAD Studio XE2

Microsoft Monthly Update 2011/11

今日はMicrosoftのセキュリティアップデートの日です。
MS11-083
MS11-084
MS11-085
MS11-086

2011年11月8日

Delphi XE2でWindows x86/x64に対応するShell Extentionを作成

Shell Extention (Windows Shell)はWindowsのシェルであるexplorer.exeから呼び出されるため、Windowsがx86版であればx86で、x64版であればx64でビルドする必要があります。ということでラテンアメリカ・カリブ地域担当プロダクトラインマネージャ・リードエバンジェリストのAndreano Lanusseさんによる、Delphi XE2を使って同一のソースコードからx86とx64の両方のShell Extentionを作成するサンプルです。興味深い。とりあえずメモ。

Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 | Andreano Lanusse Blog | Technology and Software Development | Delphi

2011年11月7日

FastMM 4.99リリースとQC100726

Delphi/C++Builder用のメモリマネージャFastMMが4.99に更新されています。

これに関連し、FastMM 4.99で修正された不具合のうち、
- Fixed crashes in the 64-bit BASM codepath when more than 4GB of memory is allocated.
- Fixed bad record alignment under 64-bit that affected performance.
の2点がDelphi XE2 Update 2のx64用の標準メモリマネージャにも不具合として存在しており(QC100726)、FastMMのAdminであるPierre le Richeさんが非公式なfixをフォーラムに投稿しています。

Embarcadero Discussion Forums: ATTN: Piere le Riche / FastMM 4.99
Embarcadero Discussion Forums: Unofficial fix for QC#100726

なお上記の非公式fixを導入後に公式なアップデート(Update 3やHotfix for Update 2)を適用する場合は、修復セットアップやバックアップしたファイルのリストアによってこれらのファイルをインストール時のものに戻す必要があるものと思われますので注意が必要です。

ちなみにFastMMの次のバージョンは4.100になるそうです。

2011年11月3日

IDE Fix Pack 4.5リリース

Andreas HausladenさんIDE Fix Pack 2009/2010/XEがアップデートされてVersion 4.5になっています。なおIDE Fix Pack 2007については残念ながらdiscontinuedとのことです。

IDE Fix Pack 4.5 released for 2009/2010/XE/XE2+UP2 | Andy’s Blog and Tools

またDelphi XE2ではコンパイラの変更により一部のジェネリクスのコードがE2089でエラーになる、という報告がありますので注意が必要かもしれません。

2011/11/12追記: Delphi 2010にはリンカのバッファがリークしているという不具合があり、IDE Fix Packではそのバッファのサイズを拡張しているため、メモリリークの問題がより深刻になってしまいます。そこでこの問題を修正したIDE Fix Pack 4.51 for Delphi 2010がリリースされています。

IDE Fix Pack 4.51 for Delphi 2010 | Andy’s Blog and Tools

2011年11月2日

Delphi/C++Builder XE2 Update 2

Delphi/C++Builder XE2のUpdate 2がリリースされています。

28597 Update 2 for Delphi, C++Builder and RAD Studio XE2
28616 Delphi XE2 and C++Builder XE2 ISO (includes Update 2)
Delphi XE2/C++Builder XE2/RAD Studio XE2 Update 2 が公開されました
XE2 Update 2 のリリース ノート - RAD Studio XE2 (en)
Delphi XE2/C++Builder XE2 Update 2 における不具合修正リスト (en)
RAD Studio XE2 update 2 の PAServer、および FireMonkey-ios.dmg は何処にありますか?

ラテンアメリカ・カリブ地域担当プロダクトラインマネージャ・リードエバンジェリストのAndreano Lanusseさん

Update 2 for Delphi XE2, C++Builder XE2 and RadPHP XE2 available | Andreano Lanusse Blog | Technology and Software Development | C++Builder

によると、Windows XPでは"Check for Updtes"からではなくCodeCentralからUpdate 2をダウンロードしてインストールする必要があるようです。

インストール手順の補足:
  • delphicbuilder_xe2_upd2_win.exeを実行すると、展開する場所の指定などなしにいきなりファイルの展開が行われ、Update 2のsetup.exeが起動し、ファイルを展開した場所がエクスプローラで開きます。
  • Update 2の適用はかなり時間がかかります。
  • PAServerは展開されたファイルをインストール先("RAD Studio\9.0")のPAServerフォルダに上書きする必要があります(既にPAServerがインストールされている環境がある場合は、その環境上でアンインストール後に再インストールする必要もあります)。
  • FireMonkey-iOSも展開されたファイルをインストール先("RAD Studio\9.0")のFireMonkey-iOSフォルダに上書きする必要があります。またMac側にもコピーしてマウントし、FireMonkey-iOS-XE2を再インストールする必要があります。
  • Stylesはなぜか.Styleと.vsfが同一のフォルダに展開されてしまいますので、共有ドキュメント("C:\Users\Public\Documents"、Windows XP)またはパブリックドキュメント("C:\Users\Public\Documents"、Windows Vista/7)のRAD Studio\9.0\Stylesに、また再配布用にインストール先("%ProgramFiles%\Embarcadero\RAD Studio\9.0")のRedist\styles\Fmx(*.Style)およびRedist\styles\vcl(*.vsf)に、それぞれ上書きする必要があります。


2011/11/04追記: Stylesファイルに関する記述を修正しました。それから業務連絡の件、ありがとうございました>だれとなく。

RadPHP XE2 Update 2

RadPHP XE2 Update 2がリリースされています。

28614 RadPHP XE2 Update 2
RadPHP XE2 Update 2 が公開されました
RadPHP XE2 Update 2 is available now

2011年11月1日

RAD Studio/Delphi/C++Builder XE2 Help Update 1

RAD Studio/Delphi/C++Builder XE2のHelp Update 1がリリースされています。

28613 Help Update 1 for Delphi, C++Builder and RAD Studio XE2
リリース ノート: Delphi XE2 および C++Builder XE2 Help Update 1 - RAD Studio XE2 (en)
Masahiro Arai » Now RAD Studio XE2 help update 1 is available

新井さんはドキュメンテーション/ローカライゼーションマネージャになられたんですね。

Help Update 1にはFireMonkey関係のコンテンツがある程度含まれているようです。

FireMonkey アーキテクチャ図 - RAD Studio XE2
FMX Units List - XE2 API Documentation

2011/11開催のウェブセミナー


2011/11/14追記: 関連リンクを追加しました。

2011/11/16追記: 2011/11/30の"RadPHP XE2によるモバイルアプリ開発"のリンクを追加しました。

2011/11/22追記: 2011/11/16のリプレイビデオのリンクを追加しました。

2011/11/30追記: 2011/11/30のQ&Aに関するリンクを追加しました。

2011/12/05追記: 2011/11/30のフォローアップのリンクを追加しました。

2011/12/13追記: 2011/11/30の関連リンク、リプレイビデオのリンクを追加しました。

2011年10月19日

CodeRage 6 Day 2

CodeRage 6の2日目(2011/10/18)のセッションに関するリンクです。

リプレイビデオ(CodeCentral)

2011年10月18日

CodeRage 6 Day 1

日本時間の昨日(2011/10/17)の夜からCodeRage 6が始まっています。ということでCodeRage 6の1日目(2011/10/17)のセッションに関するリンクです。

リプレイビデオ(CodeCentral)

セッションタイトルのてきとうな訳とキーワードは勝手につけたものです。

2011年10月13日

デニス・リッチー死去

Unixの開発者の一人であり、C言語の開発者(K&RのR)でもあるデニス・リッチー先生(en)が死去したというニュースが入ってきました。どこかのヤマ師とは違って、この人がいなければ現在のコンピュータのOSもコンピュータ言語も全く異なるものになっていたに違いない、本当の"スーパースター"の一人でした。

Dennis Ritchie, 1941-2011: Computer scientist, Unix co-creator, C programming language co-inventor – Boing Boing

BBC News - Unix creator Dennis Ritchie dies aged 70

2011年10月12日

Microsoft Monthly Update 2011/10

今日はMicrosoftのセキュリティアップデートの日です。
MS11-075
MS11-076
MS11-077
MS11-078
MS11-079
MS11-080
MS11-081
MS11-082

2011年10月11日

QC Plus 1.2.1リリース

しばらく前に紹介した、QC(QualityCentral)の代替クライアントであるJED SoftwareQC PlusのVersion 1.2.1がリリースされています。

QC Plus download page

元ねたはJED Software BlogQC Plus 1.2 now availableQC Plus 1.2.1.x now available

2011年10月8日

Prism XE2 Update 1

Prism XE2 Update 1がリリースされています。

28526 Embarcadero Prism XE2 Update 1 (September 2011 Release)
Embarcadero Prism XE2 Update 1 (September 2011 Release) がリリースされました
Embarcadero Prism XE2 Update 1 (September 2011 Release) now available

2011/10/08追記: PrismはRemObjectsとの関係からか、ややこしいことになっています。

Embarcadero Prism XE2 へのアップグレードとアップデートの取得

2011/10/11追記: エンバカデロの米澤さんによると表現はややこしいものの、基本的には他の製品と同様にメンテナンス契約に入っていればメジャーバージョンアップを受けられ、入っていなければ通常のアップデートのみを受けられる、ということだそうです。以下tweetを引用。

http://twitter.com/#!/CYonezawa/status/123666153968115712
なんかややこしい言い方ですみませぬ。新機能アップデートというのは、メジャーバージョンとかのアップグレード(XE→XE2)を示し、メンテナンス契約を結んでいる方のみとなります。XEを持っていてメンテナンス契約しているのであればXE2が自動的に手に入ります

http://twitter.com/#!/CYonezawa/status/123666555342036992
で、バグ修正版アップデートは通常のUpdate1とかを示します。これは、その製品の登録(使用許諾)している方であれば入手できます。

http://twitter.com/#!/CYonezawa/status/123667147481288704
リンク先に行くとお分かりになるかと思いますが、ダウンロード可能なリストが一覧で表示されます。たとえばメンテナンス契約していないXEユーザーがリスト上に表示されているXE2を入手することはできません。

http://twitter.com/#!/CYonezawa/status/123668010346094592
そんなこんなでダウンロードのリンク先は1つだけになっているのでありました。<(_"_)>

http://twitter.com/#!/CYonezawa/status/123681204028448769
次のXE3(?)とかのメジャーバージョンアップまで見据えた文ということでww

2011年10月7日

Firebird Wiki復活

2011/06頃に消滅してしまったFirebird Wikiをtomokiwaさんが復活させてくださっています。

Firebird Wiki

現在旧wikiのコンテンツの復元中とのことです。

2011年10月6日

RadPHP XE2 Update 1

RadPHP XE2 Update 1がリリースされています。

28525 RadPHP XE2 Update 1
RadPHP XE2 Update 1 がリリースされました
RadPHP XE2 Update 1 is available now

またRPCL(RadPHP Component Library)のRevison 298もリリースされているのであわせてアップデートをお勧めします。

Team Japan » RadPHP XE2 Update 1 - RPCLの最新版 Revision 298 も
SourceForge.net Repository - [rpcl] Revision 298

2011年10月5日

[書籍]プログラミングの魔導書 ~Programmers’ Grimoire~ vol.2

プログラミングの魔導書 ~Programmers’ Grimoire~ vol.2が発売されてPDF版のダウンロードが可能になりました。

プログラミングの魔導書 ~Programmers’ Grimoire~ vol.2/ロングゲート/ISBN 978-4-9905296-2-8(書籍版)、ISBN 978-4-9905296-3-5(PDF版)/2,000円(書籍版)、1,500円(PDF版)

書籍版の予約は昨日(2011/10/04)で終了しており、現時点ではPDF版のみ購入可能です(書籍版の発送は2011/10/19以降順次とのこと)。

次号vol.3は"Parallel, Concurrent, and Distributed Programming"(並行、並列、分散プログラミング)とのことです。

2011/10/10追記: 書籍版が届きました。

2011年10月4日

InterBase 7.1のアンインストールで発生する問題とその解決方法

InterBase 7.1をアンインストールするときに発生する問題とその解決方法。2回連続現場ではめられたのでメモ。
  • 前提条件
    InterBase 7.1に関する Q & Aにあるように、Java VM 1.3.1または1.4がインストールされている必要がある。古いJREはOracle Java Archiveからダウンロードできる。

  • アンインストーラがフリーズする
    FlexeraのKBによると原因は

    1. ディスクの空きが足りない
    2. アンチウィルスソフトウェアかPCAnywhereが動作している
    3. Dell OpenManagerが動作している
    4. ビデオカード/ドライバとの相性
    5. ディスプレイのハードウェアアクセラレーションとの相性

    ということなので、

    1. システムドライブの空き容量を確認する
    2. アンチウィルスソフトウェアやPCAnywhereがインストールされていたら停止する
    3. DellのPCでOpenManagerが動作していたら停止する
    4. アンインストーラの実行ファイルと同じ場所(InterBaseのインストール先のUninstallerDataフォルダ)にある"Uninstall InterBase 7.1 .lax"に
      lax.nl.java.option.additional=-Dsun.java2d.d3d=false -Dsun.java2d.noddraw=true
      を追加する
    5. ディスプレイのハードウェアアクセラレーションを無効にする

    ことで回避することができる(らしい)。

  • アンインストーラが"Windows エラー 3"でエラーになる
    同じくFlexeraのKBによればアンインストーラが対応していないJVM (1.)6以降を使用してしまうのが原因のようで、コマンドプロンプトでアンインストーラのある場所(InterBaseのインストール先のUninstallerDataフォルダ)に移動しておいて、
    "Uninstall InterBase 7.1 .exe" LAX_VM "C:\Program Files\Java\j2re1.4.2_19\bin\java.exe"
    と、パラメータに"LAX_VM"(すべて大文字で)およびjava.exeの絶対パスを指定することで使用するJVMを明示的に指定できる。この場合"コントロールパネル"の"プログラムと機能"あるいは"プログラムの追加と削除"の一覧からInterBaseが削除されないので注意(改めてアンインストールしようとするとアンインストーラが見つからないので一覧から削除するかどうか確認されるので削除するを選択すればよい)。

ちなみにいずれもInterBaseそのものが悪いわけではなく、InstallAnywhereがJava(JRE)の環境を正しく認識して処理できないのが原因。

2011年9月30日

Firebird 2.5.1リリース

Firebird Ver2.5.1がリリースされています。

Firebird: Firebird 2.5.1
Firebird 2.5 Release Notes (PDF)

元ねたはFirebird News » Firebird 2.5.1 is released

2011/10/04追記: 正式にアナウンスされています。どうやらフライングだったようですね。

Firebird: Firebird 2.5.1 (sub-release) is available
Firebird News » Firebird 2.5.1 is released

2011年9月29日

デバッガビジュアライザ

Delphi 2010以降のIDEにはデバッガビジュアライザという機能が追加されています。これは従来デバッガ上の値の評価時に適切に表示できなかったいくつかのデータ型(TDateTime/TStringList/std::string/std::wstring)の値をわかりやすい形式で表示させるもので、詳細についてはプロダクトマーケティングマネージャのTim Del ChiaroさんJED SoftwareJeremy Northさん

Delphi 2010 Feature Highlight - Debugger Visualizers

で解説しています(オリジナルの記事はBlaise Pascal Magazine Special Issueに掲載されています)。この記事にあるようにデバッガビジュアライザはIDE Expert(.bpl)としてユーザが任意に作成することができます。

標準以外のデバッガビジュアライザの実装ですが、ITDevCon 2009でのMitov SoftwareのBoian MitovさんによるTBitmapのビジュアライザのデモンストレーションについて、エンバカデロのシニアソフトウェアコンサルタントでヨーロッパ地域担当Delphi/RAD StudioリードテクニカルエバンジェリストのPawel Glowackiさん

Paweł Głowacki : Boian’s TBitmap Visualizer and converting to grayscale

で紹介しています。

また標準のTStringListのビジュアライザにはデータが4096文字で切り捨てられたり処理が遅いなどの問題があり、これを置き換えるビジュアライザをUwe Schusterさんが作成しています。

TStringList Visualizer revised (2010, XE, XE2) | Uwe's Delphi blog

さらに各種形式のグラフィック(BMP/JPEG/GIF/PNG/ICO/WMF/EMF/TIFF/WMP)に対応するビジュアライザとしてCodeCentralにahmoy lawさん(CnPack関係の人でしょうか)によるImage Visualizerもアップロードされています。

27674 Image Visualizer 1.10 for Delphi

2011/09/30追記: benokさんからEDNのDelphi 2010 Feature Highlight - Debugger Visualizersの著者はJeremy Northさんだという指摘がありましたので訂正しました。ご指摘ありがとうございます。

2011年9月28日

Delphi/C++Builder XE2 Update 1

Delphi/C++Builder XE2のUpdate 1がリリースされています。

28508 RAD Studio XE2 Update 1
28509 Delphi XE2 Update 1
28510 C++Builder XE2 Update 1
28477 Delphi XE2 and C++Builder XE2 ISO (includes Update 1)
Delphi XE2 および C++Builder XE2 の重要な製品アップデート
Delphi XE2/C++Builder XE2 Update 1 における不具合修正リスト (en)

XE2 RTM版にはFireMonkey 3DにGLScene(MPL)のコードが含まれていることがライセンス上問題であるという指摘があり、Update 1ではGLScene由来のコードが排除されています。このため一旦XE2 RTMをアンインストールし、ダウンロードキャッシュ(通常は"%USERPROFILE%\Documents\Rad_Studio_XE2_Downloads"に保存されています)も完全に削除した上でUpdate 1をインストールする必要があるとのことです。詳細については

XE2 Update 1 をインストールしてください - XE2 のリリース ノート - RAD Studio XE2 (en)

に説明があります(日本語版はまだ準備中)

2011/10/04追記: 日本語版のリリースノートにUpdate 1に関する記述が追加されたのでリンクを追加しました。