2011年6月20日

Delphi XE Handbook発売

Marco CantuさんDelphi XE Handbookが発売されました。今までのハンドブックとの内容の重複はなく、全132ページとなっています。書籍版はAmazon(US)から34.50USD(=2,768JPY)で、eBook版はFastSpringから20.00USD(=1,650JPY)で、購入することができます(eBook版については先週金曜日(2011/06/17)にMarcoさんのTwitterおよびFacebookのアカウントにpostされたディスカウントコードで5.00USD割引の15.00USD(=1,238JPY)になるとのことです)。

元ねたはDelphi XE Handbook Available

2011/06/22追記: Delphi Handbookシリーズの2007からXEまでを一つのeBookにまとめた"Delphi Handbooks Collection, Second Edition"も近日中にリリースされる予定とのことです。

Delphi Handbooks Collection, Second Edition (2007 to XE)

全1113ページで74.50USD(=5,974JPY)、同じくFastSpringで購入可能です(書籍版はページ数が多すぎて無理だそうです)。過去のeBook版の購入者にはディスカウントがあるそうです。

2011年6月14日

第20回エンバカデロ・デベロッパーキャンプ開催予告

第20回エンバカデロ・デベロッパーキャンプが2011/09/06開催で調整中とのことです。

エンバカデロ・デベロッパーキャンプ
次回のデベロッパーキャンプは、2011年9月6日に開催を予定しています。プログラムの詳細ならびに参加受付は、7月上旬より公開・開始させていただく予定です。ご期待ください。

またセッションスピーカ、ライトニングトークスピーカの募集も始まっています。

第20回 エンバカデロ・デベロッパーキャンプ セッションスピーカー募集中!
第20回 エンバカデロ・デベロッパーキャンプ ライトニングトーク スピーカー募集のお知らせ

2011/06/17追記: LTのネタについては熟慮中ということで…。なるべく早めの提出を心掛けたいと思います…。

2011年6月13日

[書籍]ユニコード戦記

MARUZEN&ジュンク堂書店 渋谷店

ユニコード戦記 文字符号の国際標準化バトル (amazon)/小林龍生著/東京電機大学出版局/ISBN978-4-501-54970-1/2,835円

を購入。基本的には技術書ではなく読み物(戦記物?)です。ただUnicodeなどの規格の決まり方や海の向こう側の人々の考え方など、なかなか興味深い話です。

2011年6月9日

Windows 7のピン止め機能を無効にする

Windows 7の新機能の一つにタスクバーへのピン止め(pinning、日本マイクロソフトの表現では"固定表示")があります。この機能はタスクバーと従来のクイックリンクを統合したようなもので、ユーザの明示的な操作によりタスクバー上のプログラムをピン止めし、非起動状態と起動状態の区別を考慮することなく扱うことができる、というものです(プログラム側からピン止めを設定することはできない)。しかしプログラムによってはこの機能を使ってほしくないこともあります。そこでプログラム側でピン止め機能を無効化してみます。

MSDNのApplication User Model IDs (AppUserModelIDs) (Windows)Exclusion Lists for Taskbar Pinning and Recent/Frequent ListsによればAppUserModelIDを設定する前にSystem.AppUserModel.PreventPinningプロパティを設定することでピン止めが無効化されます。Windowsプロパティの設定はSHGetPropertyStoreForWindowで行います。ところがこのWindowsプロパティに関係する定義はDelphi 2010で追加されたPropSysユニット、PropKeyユニットには存在するものの、Delphi 2009およびそれ以前のバージョンでは独自に定義する必要があります。またプロパティキーPKEY_AppUserModel_PreventPinningはDelphi 2010でも定義が存在しないため、これも独自に定義します。

uses
  Windows, SysUtils, ShellAPI, ActiveX
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF RTLVersion >= 21.00}
  , PropSys, PropKey
{$IFEND}
{$ENDIF}
;

{$IFDEF CONDITIONALEXPRESSIONS}
{$IF RTLVersion < 21.00}
const
  SID_IPropertyStore = '{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}';

  IID_IPropertyStore: TGUID = SID_IPropertyStore;
  {$EXTERNALSYM IID_IPropertyStore}

type
  { interface IPropertyStore }
  IPropertyStore = interface(IUnknown)
  [SID_IPropertyStore]
    function GetCount(out cProps: DWORD): HRESULT; stdcall;
    function GetAt(iProp: DWORD; out pkey: TPropertyKey): HRESULT; stdcall;
    function GetValue(const key: TPropertyKey; out pv: TPropVariant): HRESULT; stdcall;
    function SetValue(const key: TPropertyKey; const propvar: TPropVariant): HRESULT; stdcall;
    function Commit: HRESULT; stdcall;
  end;
  {$EXTERNALSYM IPropertyStore}

type
  TSHGetPropertyStoreForWindow = function (hwnd: HWND; const riid: TGUID;
                                           var ppv: Pointer): HResult; stdcall;
{$IFEND}
{$ENDIF}

const
  PKEY_AppUserModel_PreventPinning : TPropertyKey = (
    fmtid : '{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}'; pid : 9);
  {$EXTERNALSYM PKEY_AppUserModel_PreventPinning}


function MarkWindowAsUnpinnable(handle: HWND): HRESULT;
var
  pps: IPropertyStore;
  v: TPropVariant;
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF RTLVersion < 21.00}
  hModule: THandle;
  SHGetPropertyStoreForWindow: TSHGetPropertyStoreForWindow;
{$IFEND}
{$ENDIF}
begin

  Result := 0;

  if CheckWin32Version(6,1) = False then
  begin
    Exit;
  end;

{$IFDEF CONDITIONALEXPRESSIONS}
{$IF RTLVersion < 21.00}
  hModule := LoadLibrary(shell32);
  if hModule = 0 then
  begin
    Exit;
  end;

  try
    @SHGetPropertyStoreForWindow := GetProcAddress(hModule,'SHGetPropertyStoreForWindow');
    if Assigned(SHGetPropertyStoreForWindow) = False then
    begin
      Exit;
    end;
{$IFEND}
{$ENDIF}

    Result := SHGetPropertyStoreForWindow(handle,IID_IPropertyStore,Pointer(pps));
    if Succeeded(Result) = True then
    begin
      v.vt := VT_BOOL;
      v.boolVal := True;
      Result := pps.SetValue(PKEY_AppUserModel_PreventPinning,v);
    end;
    pps := nil;

{$IFDEF CONDITIONALEXPRESSIONS}
{$IF RTLVersion < 21.00}
  finally
    FreeLibrary(hModule);
  end;
{$IFEND}
{$ENDIF}

end;
MarkWindowAsUnpinnableはメインフォームのOnCreateイベントハンドラで
procedure TForm1.FormCreate(Sender: TObject);
begin

  MarkWindowAsUnpinnable(Handle);

end;
のように呼び出します。 元ねたはRaymond ChenさんHow do I prevent users from pinning my program to the taskbar? - The Old New Thing - Site Home - MSDN Blogs

2011年6月7日

Delphi Certification Program正式アナウンス

先日お伝えしたDelphi Certification Programが正式にアナウンスされています。

Embarcadero Certification Center

Delphi Certification ProgramはDelphiプログラマの認定試験で、Delphi DeveloperDelphi Master Developerの2つのレベルが用意されています。どちらも60分間で60問出題され、80%(48問)が合格ラインになります。試験は中立の第三者機関が管理します。また認定は合格後2年間有効です。

Delphi Developer Certificationは基本的な知識を問うもので、以下の11の分野から出題されます。
  • Delphiの基礎
  • データ型、変数、定数
  • プロシージャと関数
  • クラスとオブジェクト
  • 標準手続きとI/O
  • ライブラリとパッケージ
  • オブジェクトインタフェース
  • メモリ管理
  • ジェネリクス、属性、無名メソッド
  • 例外とアサーション
  • データベースの概念
受験料は49USDで、オンラインでどこからでも受験することができます。RAD Studio/Delphi XEの登録ユーザは2011/07/31までにコードを取得して90日以内に受験することで無料で試験を受けることができます。

Delphi Master Developer Certificationは高度な知識を問うもので、以下の12の分野から出題されます。
  • Windowsの概念
  • Delphi XEのインタフェースと設定
  • DelphiのVCLとRTL
  • コンポーネントの扱い
  • Delphi言語とオブジェクト指向プログラミング
  • データベースの共通テクニック
  • dbExpress
  • DataSnap
  • DLLとパッケージの記述
  • コンポーネント設計の基本
  • インターネットプログラミング
  • XMLの扱い
受験料は149USDで、エンバカデロのパートナの認定センターが運営します。

FAQも用意されています。

Delphi Certification FAQs

と、ここまで書いておいてなんですが、残念なことに現時点では日本での扱いは決まっていないようです。

元ねたはAndreano LanusseさんDelphi Certification Program – Official Announcement | Andreano Lanusse Blog | Technology and Software Development