2021年6月1日

2021/06開催のセミナー

2021年5月5日

マイナーリリースを区別する新しい標準条件シンボル

Delphi Master Release List · ideasawakened/DelphiKB Wiki · GitHubを見ていて気が付いたのですが、いままで標準条件シンボルの定義CONDITIONALEXPRESSIONSではできなかった、マイナーリリース間を区別する(たとえば10.4.1と10.4.2を見分ける)ための新しい標準条件シンボルがRAD Studio/Delphi/C++Builder 10.4.2 Sydneyで導入されたようです。

RAD Studio/Delphi/C++Builder 10.4.1 SydneyまではSystem.pasに
const
  RTLVersion = 34.00;
 {$HPPEMIT '#define RTLVersionC 3400'}
とRTLVersionが定義(34.0)されていたものが、10.4.2 Sydneyでは
const
  RTLVersion = 34.00; RTLVersion1041 = True; RTLVersion1042 = True;
 {$HPPEMIT '#define RTLVersionC 3400'}
と、RTLVersion1041/RTLVersion1042(いずれもTrue)の定義が追加されています。10.4/10.4.1ではこれらの定義が存在せず、10.5でもどうなるのかがいまのところわかっていないので使用方法も判然としないのですが、とりあえず
{$IF RTLVersion = 34.0}
{$IF RTLVersion1042}
  Label1.Caption := 'Delphi 10.4.2.';
{$ELSE}
  Label1.Caption := 'Delphi 10.4 or 10.4.1.';
{$ENDIF}

{$ELSE}
  Label1.Caption := 'Not Delphi 10.4.x.';
{$IFEND}
こんな感じになるでしょうか。

2021年5月4日

RAD Studio/Delphi 10.4.2 RTL Patch

RAD Studio/Delphi 10.4.2 SydneyのRTL Patch 1.0がリリースされています。General Patch 1.0で不足していたRSP-33117の修正が行われます。

Delphi 10.4.2 RTL Patch

Delphi 10.4.2 RTL Patchのリリース

2021年5月1日

RAD Studio/Delphi/C++Builder 10.4.2 General/Delphi Compiler Patch

RAD Studio/Delphi/C++Builder 10.4.2 SydneyのGeneral Patch 1.0およびDelphi Compiler Patch 1.0がリリースされています。General Patch 1.0はデバッグおよびC++コンパイラ/リンカの問題(RSP-33406RSP-33117RSP-32951RSP-32939RSP-32043)を、Delphi Compiler Patch 1.0はDelphiのコンパイラおよびLSPの問題(RSP-33425RSP-33232RSP-32768)を修正します。

RAD Studio 10.4.2 General Patch
Delphi 10.4.2 Compiler Patch

RAD Studio 10.4.2のPatchのリリース: General PatchおよびDelphi Compiler Patch (en)

2021/05/02追記: General Patch 1.0にはRSP-33117含まれておらず、この件に関しては別途パッチが再リリースされることになるとのことです。

2021/05/04追記: RSP-33117はRTL Patch 1.0で修正されました。

2021/05開催のセミナー

2021年4月29日

[書籍]Delphiで作るAndroidスマホアプリ

Amazon(JP)で注文した

Delphiで作るAndroidスマホアプリ (Amazon JP)/山菅昇一、山菅昇太郎著/インプレスR&D/ISBN 9784844379584/2,200円

が配送されてきました。

2021年4月1日

2021/04開催のセミナー

2021年3月16日

[書籍]Object Pascal Handbook Delphi 10.4 Sydney Edition

Amazon(JP)で注文した

Object Pascal Handbook Delphi 10.4 Sydney Edition (Amazon US, Amazon JP)/Marco Cantù著/ISBN 979-8554519963/5,606JPY(printed)

が配送されてきました。2021/03/14に注文して2日目の到着でした。

2021年3月6日

const修飾されたインタフェース型の引数としてその場で生成したインスタンスをインタフェース型にキャストしないでそのまま渡すとリークする

Dalija PrasnikarさんのDelphi Event-based and Asynchronous Programmingをパラ見していて引っかかったのですが、タイトルを見ても何をいっているのかわからないと思うので、まずコードを。
type
  IFoo = interface
    procedure FooBar;
  end;

  TFoo = class(TInterfacedObject,IFoo)
  public
    procedure FooBar;
  end;

  TBar = class(TObject)
  public
    procedure Baz(const AFoo: IFoo);
  end;

procedure TFoo.FooBar;
begin
// Do something.
end;

procedure TBar.Baz(const AFoo: IFoo);
begin
  AFoo.FooBar;
end;
インタフェースとしてIFooと、その実装としてクラスTFooを用意し、クラスTBarにはconst修飾されたIFooを渡すBazというメソッドがあります。ここで
var
  Bar: TBar;
begin
  Bar := TBar.Create;
  Bar.Baz(TFoo.Create);
  Bar.Free;
end;
とTBar.BazにTFoo.Createで生成したインスタンスを直接渡すと、TFooはIFooとしての参照カウントの制御を受けず、リークしてしまいます。一方で
var
  Bar: TBar;
begin
  Bar := TBar.Create;
  Bar.Baz(TFoo.Create as IFoo);
  Bar.Free;
end;
とIFooにキャストしたものを渡すとリークしなくなります。

これは、インタフェース型の引数がconst修飾されているとメソッド内部で仮引数が変更されないことが保証されているため、仮引数にコピーしたことによる参照カウントの管理を行わない最適化が行われるのに対して、前者のコードでは呼び出し元で生成したインスタンスが(インタフェース型ではなく)クラス型としてしか管理されていないため、やはり参照カウントの管理を受けずに、リークしてしまう、ということのようです。しかし後者ではas IFooとキャストしたことでIFoo型の暗黙のローカル変数が用意され、これによって参照カウントによって正常に解放されます。

メソッド内部で仮引数を別のインタフェース型の変数やフィールドにコピーすると参照カウントの管理が行われて適切に解放が行われますが、これは実装に依存しますし、また引数をconst修飾していなければ大丈夫ですが、既存の実装の変更が必要になる、ということが問題になります。
このためconst修飾されたインタフェース型の引数としてその場で生成したインスタンスを渡す場合はインタフェース型にキャストするか、あるいは
type
  TFoo = class(TInterfacedObject,IFoo)
  public
    class function CreateAsIntf: IFoo;
    procedure FooBar;
  end;

class function TFoo.CreateAsIntf: IFoo;
begin
  Result := TFoo.Create;
end;

var
  Bar: TBar;
begin
  Bar := TBar.Create;
  Bar.Baz(TFoo.CreateAsIntf);
  Bar.Free;
end;
このように生成したインスタンスをインタフェースとして返すようなメソッドを用意して、そちらを経由するか、ということになります。

元ねたはもちろんDalija PrasnikarさんのDelphi Event-based and Asynchronous Programmingの"13.4 In-place construction in a const parameter"。

2021年3月1日

2021年2月26日

[書籍]再発見の発想法

紀伊國屋書店新宿本店

再発見の発想法 (Amazon)/結城浩著/SBクリエイティブ/ISBN 978-4-7973-9531-0/1,760円

を購入。

2021年2月25日

RAD Studio/Delphi/C++Builder 10.4 Sydney Release 2 (10.4.2)

RAD Studio/Delphi/C++Builder 10.4 SydneyのRelease 2 (10.4.2)がリリースされています。インストールには有効なUpdate Subscriptionが必要です。Registered Products Portalからダウンロードできます。

ISO for RAD Studio, Delphi, C++Builder 10.4.2
Web Installer for RAD Studio, Delphi, C++Builder 10.4.2

10.4 Sydney - Release 2 (en)
RAD Studio 10.4.2 における新機能と修正された顧客から報告された問題 (en)
List of publicly reported bugs fixed in 10.4.2

RAD Studio 10.4.2 Sydney Release 2の提供開始を発表 (en)
RAD Studio 10.4の新機能 (en)

RAD Studio 10.4.2で提供される2つの新しいVCLコントロール RAD Studio 10.4.2で提供される2つの新しいVCLコントロール (en)
RAD Studio 10.4.2で新しく導入されたインストールプロセスの自動化を容易にするサイレントインストーラ (docwiki(ja), en)
RAD Studio 10.4.2の新機能: Windowsストアのパッケージングをより簡単にするMSIXのサポート (docwiki(ja))
C++Builder 10.4.2の改良点: Split DWARFによるリンカのメモリ使用量の削減 (docwiki(ja))
Delphi 10.4.2 コンパイラ速度の改善 (en)
RAD Studio 10.4.2: IDEの機能改善
C++Builder 10.4.2のオープンソースC++ライブラリ (en)
C++Builder 10.4.2での堅牢な例外処理 (en)
リンカの支援:C++Builder 10.4.2でのDWARFとリンカのメモリ使用量の分割 (docwiki(ja), en)
RAD Studio 10.4/10.4.1からGetItを利用して10.4.2をダウンロードし、インストールする方法 (en)
Delphi 10.4.2におけるCode Insightの改善 (en)

2021年2月23日

[書籍]Delphi Event-based and Asynchronous Programming

Amazon(JP)で注文した

Delphi Event-based and Asynchronous Programming (Amazon US, Amazon JP)/Dalija Prasnikar、Neven Prasnikar Jr.著/FastSpring/ISBN 979-8705971688/4,869JPY(printed)

が配送されてきました。2021/02/21に注文して2日目の到着でした(おそらく日本国内でのprint on demandだと思われます)。

2021年2月8日

DDevExtensions 2.87

Andreas HausladenさんDDevExtensionsですが、GitHubでホストされています。オリジナルのリポジトリは

ahausladen/DDevExtensions: Delphi IDE Plugin

ですが、Delphi/C++Builder 10.4 Sydneyの対応は

DelphiPraxis/DDevExtensions: Delphi IDE Plugin

こちらのフォークからリリースされています。

Release DDevExtensions v2.87 Delphi 10.4 · DelphiPraxis/DDevExtensions

2021年2月1日

2021/02開催のセミナー

  • Web Seminar
  • Live Seminar
  • Community Event