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のプロセスに対して通信、この場合はファイルのドラッグアンドドロップを行うことができなくなっています。