ざつだ ん。 (11/09/01~)

11/09/01

・ RAD Studio XE2
 Delphi / C++Builder / RAD Studio XE2 トライアル が DL 可能となっています。

 詳細な内容は以下のようになっています。

 特記事項的には、  このような感じとなります。"Delphi の製品情報" にも情報がまとめてありますので、そちらもご覧下さい。

 購入先を再掲しておきます。

特別バージョンアップ (2007~XEユーザー向け) 2011/09/30 まで

ジャンプアップキャンペーン (1~2006ユーザー向け) 2011/12/27 まで

 ※価格にポイント等は反映されていません。また、価格は変動する事がありますのでリンク先を必ず確かめるようにして下さい。

 折角の XE2 リリース時期ですが...雑談の更新が滞りがちな事でお解りかもしれませんが、仕事の方が忙しくあまりまとまった記事を書くことができません。64bit コンパイラ関連の記事を一つくらいは書きたいのですが...。

・ Delphi の Tips
 トライアル版やDocWiki から知り得る情報なので、以下の Tips を公開します。

 32bit デバッグプロセスは 32bit アプリケーションに、64bit デバッグプロセスは 64bit アプリケーションにしか対応できません。Delphi XE2 は 32bit OS でも動作するため、当然 32bit アプリケーションです。つまり、(32bit)IDE から 64bit アプリを生成できても、それを直接デバッグする事はできない訳です。

 新しいリモートデバッガは IDE とシームレスに連動するようになっており、ネイティブデバッグ/リモートデバッグを意識しないで済むようになっています。「64bit アプリをデバッグしようとしたらブレークポイントで止まらない!バグだ!」と騒ぐ前に、慌てず騒がず、まずはリモートデバッガの使い方をマスターしましょう。

 ハイ、嘘書いてました。私の環境がおかしくなっていただけのようです。リモートデバッグ関連の記事は修正しておきました m(_ _)m


11/09/02

・ TEncoding (Delphi XE2)
 従来ですと、

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TStringList.Create;
  Enc := TEncoding.GetEncoding(20932); // EUC-JP(CP20932)
  try
    SL.Add('あいうえお');
    // ファイル保存
    SL.SaveToFile('C:\Ansi.txt', Enc);
  finally
    Enc.Free;
    SL.Free;
  end;
end;

 このようにエンコーディングの指定には数値 (コードページ) または "CP_" で始まるコードページ定数を利用する必要がありましたが、XE2 では

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
  Enc: TEncoding;
begin
  SL := TStringList.Create;
  Enc := TEncoding.GetEncoding('euc-jp'); // EUC-JP(CP20932)
  try
    SL.Add('あいうえお');
    // ファイル保存
    SL.SaveToFile('C:\Ansi.txt', Enc);
  finally
    Enc.Free;
    SL.Free;
  end;

 XE2 では TEncoding.GetEncoding に文字列での指定を行う事が可能になりました。totonica さんが出していた QC#62729 と同じだったりします。指定できるコードページ文字列は Code Page Identifiers (MSDN) で確認する事ができます。

 また、TEncoding.Default というプロパティがありますが、これは OS デフォルトの ANSI コードページの TEncoding を返します (2010 で追加されたプロパティのようです。2009 だと TEncoding.GetEncoding(0) に相当します)。ターゲットプラットフォームが Mac OSX の場合、TEncoding.Default は TUTF8Encoding を返します。

 (注) 当初「TEncoding.Default は XE2 で新設された」 という記述になっていましたが、誤りなので訂正しておきます。

・ ターゲットプラットフォーム (Delphi XE2)
 ターゲットプラットフォームには

 が指定できます。iOS 用のプロジェクトにはターゲットプラットフォームを指定できません。

 VCL フォーム アプリケーションは Mac OSX 用にターゲットプラットフォームを追加できませんが、コンソールアプリケーションには Mac OSX を指定する事が可能です。

・ *.rsm ファイルについて (Delphi XE2)
 ターゲットプラットフォームに "64ビット Windows" を指定してコンパイルすると <プロジェクト名>.rsm というのができると思います。これは PAServer のデバッグシンボルファイルです。

 昨日の雑談で書いた、"32bit デバッグプロセスは 32bit アプリケーションに、64bit デバッグプロセスは 64bit アプリケーションにしか対応できません。" というのは間違いという訳ではありません (記事に書いた "振る舞い" は完全に間違っていますが)。IDE が 32bit である以上、64bit アプリに対してデバッグプロセスを開始する事はできないのは事実です。

 では、実際にはどうなっているのかと言えば、ローカルで IDE と 64bit デバッガ (dbkw64_16_0.exe) で通信しながらデバッグプロセスを確立しているようです。つまり、

"IDE (32bit アプリケーション) <- [ローカル通信] -> 64bit デバッガ <- [64bit デバッグプロセス] -> 64bit アプリケーション"

 ...のようになっています。リモートデバッガを使う場合には、

"IDE (32bit アプリケーション) <- [リモート通信 (PAServer)] -> 64bit デバッガ <- [64bit デバッグプロセス] -> 64bit アプリケーション"

 このようになります。プロジェクトオプションを確認してみると、64bit アプリケーションの "Debug 構成" にはデフォルトで "リモートデバッグシンボルを含める" にチェックが入っていますが、試しにこれを外してビルドするとブレークポイントで止まらなくると思います (以前に生成された *.rsm が残っていない限り)。

 つまりは、"64bit アプリのデバッグにはローカルであってもリモートデバッガを使う" というのは半分正解で半分間違いという事です。この辺りを意識しないで済むようになっているのは地味に有り難いですね。


11/09/03

・ IBX (Delphi XE2)
 XE2 の IBX では Firebird に接続できません。 動作します。それどころか 64bit でも動作します。詳細は 09/09 の雑談にあります。

 このようにすれば IBX で Firebird に接続できない事もありません...が、どのみち 64bit では動作しません。IBHeader の DLL 名がどうとかそういう問題ではありません。

 IBDatabase.TIBDatabase.ServerType 絡みの変更により、ターゲットプラットフォームが 32bit であっても正常動作しないようです...正直、ちょっと勿体無い気がします。コアロジックは殆ど修正がないんですよねぇ...なのに。あぁ、それなのに。IBX 自体は MacOSX (FireMonkey) でも動作するというのに...。

 XE2 で Firebird に接続したいのであれば、"素直に Ent 以上の SKU を選択して DBX4 接続をする" か、"サードパーティ製のネイティブ接続コンポーネントを利用する" 方がいいと思います。とはいえ、現時点では 64bit に対応したサードパーティ製ネイティブ接続コンポーネントはリリースされていないようですので、64bit アプリケーション開発を行うのなら DBX4 一択かもしれません。

 なお、今回の変更で古い Interbase にも接続できなくなっている気がしないでもないですが、残念ながら未確認です。IBX で Firebird に接続できなくなってしまった今、"BDE (Paradox / dBASE) 代替 としてのローカル DB" をいい加減にどうにかして欲しいのですが...>エンバカさん。

・ Delphi の Tips
 XE2 に合わせて内容を修正中です。

 ほぼ更新は終わっています。

・ Feature Matrix (Delphi XE2)
 DocWiki と併せて読めば新機能や変更点が理解できると思います...それにしても、Feature Matrix にある Ultimate SKU の情報は出ないのだろうか?つーか、例によって日本では発売されないのだろうか?それと、XE2 の Starter SKU は 64bit とクラスプラットフォームの機能がオミットされているようです。FireMonkey は有効ですが。

 XE2 の大まかな情報はあちこちで出ていますので、当方としては実際に触ってみて判明した情報を地道に発信したいと思います。盆と正月が一緒に来ちゃった状態なので、"1 日 1 Tips" では絶対に紹介しきれない気がしますケドね。

・ XE2 関連のニュースソース
 イロイロ出ています。

 そういや、次のデブキャンは Web で参加できないのでしょうかね?

・ Delphi Launcher ver 2.70
 リリースしました。Delphi XE2 対応版です。


11/09/04

・ 過去のバージョンの製品 (Delphi XE2)
 「XE の IBX ソースを...って言うけど、XE なんて持ってねぇよ!!」 と仰る方、もう一度インストールノートをよく確認してみましょう。そこにはこう書かれているハズです。

ライセンスには次に示す以前の製品バージョンが含まれ、それらをダウンロードして使用できます。
  • Delphi XE2 は、Delphi XE、2010、2009、2007 および 7 の各ライセンスを含みます。
  • C++Builder XE2 は C++Builder XE、2010、2009、2007 および 6 の各ライセンスを含みます。
  • RAD Studio XE2 は、Delphi および C++Builder の全バージョンのライセンスを含みます。

 XE と同様、XE2 でも過去のバージョンが入手できます。XE2 ユーザは自動的に XE / 2010 / 2009 / 2007 / 7 ユーザでもあるのです。え?古いバージョン要らない?パッケージを削りまくって "ワーク用高性能エディタ" として使うというテもありますよ..."Embarcadero BRIEF" なんてね (^^;A

・ System.Zip (Delphi XE2)
 XE2 で追加された System.Zip.TZipFile の使い方を Delphi の Tips に追加しておきました。

 過去の ZIP 関連の Tips と合わせて ZIP 三兄弟です (w

・ クラシックスタイル IDE (Delphi XE2)
 未だに勘違い...というか誤解してらっしゃる方がいますが、現行の Delphi の IDE は Delphi 7 までの旧 IDE 相当の見た目にする事が可能です。

 具体的な設定方法は "119.ガリレオ IDE を旧 IDE 相当のレイアウトにするには (Delphi 2010 以降)" を参照して下さい。

 XE2 での注意点としては、FireMonkey アプリケーションの場合には "埋め込みデザイナ" でないとフォームを操作できないという事です。この制限については リリースノート にも記載があります。

・ IDE のブラウザを IE9 にする (Delphi XE2)
 過去にやったネタですが、

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"bds.exe"=dword:00002328

 これをやっておくと、IDE のブラウザが IE9 になります。

 IE コンポのバージョンを確認するには http://www.useragentstring.com/ へアクセスします。

・ ウィルス対策ソフト対策 (Delphi XE2)
 以前、XE でフォームに何も貼り付けないでコンパイルしたものを各種ウィルス対策ソフトに食わせてみた事があります。結果はこうでした。
 さらに上記 EXE にバージョン情報だけ付けて再コンパイルしたものを、各種ウィルス対策ソフトに食わせてみました。結果はこうでした。

 明らかに誤検知なのですが、バージョン情報を付加するだけで誤検知の確率が下がる事も判明しています。XE2 ではデフォルトでバージョン情報が付くようになりました。

 複数のウィルス対策ソフトに食わせてみて誤検知かどうかを判断する方法については過去の雑談を参考にして下さい。

・ 32bit アプリケーションを 64bit アプリケーションへマイグレーション (Delphi XE2)
 とりあえず、変数の型の置換からでしょう。詳細は "64 ビット データ型と 32 ビット データ型の比較" を参照して下さい。基本的に、ポインタを Integer でキャストしている箇所を NativeInt / NativeUInt に変更すれば大抵の 32bit アプリケーションは 64bit アプリケーションにマイグレーションできます...そりゃもう、拍子抜けする程に。

 むしろ厄介なのはインラインアセンブラで記述されている箇所です。海外製コンポーネントにはインラインアセンブラを多用しているものが多くありますが、これをどうにかしないと本当にどうしようもありません。

 基本的には "32 ビット Delphi アプリケーションの 64 ビット Windows への変換" に書かれていることがすべてです...あ、それと過去の雑談でも書いていますが、64bit 環境では Microsoft.Jet.OLEDB.4.0 は使えません。Delphi の制限ではないので苦情は Microsoft さんにお願い致します。Jet を使って Access を読み込んでいたり、Excel / CSV を処理していたりする場合には注意が必要です。

 32bit DLL を 64bit アプリケーションから使う (またはその逆) 方法については "127.64 ビット Windows プログラミング ガイド for Delphi 64 ビット コンパイラ" を参照して下さい。

・ 浮動小数点用レコード (Delphi XE2)
 浮動小数点変数を操作するためのレコードが追加されています。以下のソースは DocWiki からの抜粋です。

 var
   F: TSingleRec;
   I: Integer;

 begin
   F := TSingleRec(-0.5);

   // display the hexadecimal representation of the single precision floating-point value
   // leftmost bytes are the most significant
   for I := High(F.Bytes) downto Low(F.Bytes) do
     Write(IntToHex(F.Bytes[I], 2) + ' ');
   Writeln;

   // display the value contained in the TSingleRec record
   Writeln(FloatToStr(Single(F)));

   // ...

 こういう事ができるようになりました...いや、もういっそ ToString() とかも実装してくれればいいのに (w

 注意点としては、OS (CPU) によって Extended の扱いに違いがあるという事です。

 なんでこういう事になっているのかと言うと、32bit と 64bit で Extended のサイズが違うからです。また、64bit 環境で Extended80 を使う事は可能ですが、あくまでデータサイズだけの話で演算精度が向上する訳ではありません。詳しくは DocWiki の "64 ビット Windows システムでは Extended データ型のサイズは 2 バイト小さい" を参照して下さい。

・ SkRegExp 1.2.6 (XE2 対応版)
 リリースされました。100% Delphi で記述された、日本語に対応した正規表現クラスライブラリです。詳細については "120.正規表現の活用 (主に Delphi 2009 以降)" をどうぞ。そういえば、Delphi 標準正規表現クラスにあった QC#87752 の件は XE2 で解決されたようです。


11/09/05

・ PascalScript (Delphi XE2)
 当サイトの PPA の話ではなくてですね...FastScript というタブが XE2 にはありまして。FastScript は FastReports の機能の一部なのですが、単体で使う事も可能です。

  1. VCL フォームアプリケーションを新規作成して、ボタンと fsScript と fsPascal を貼り付けます。
     
  2. 以下のようなコードを記述します。
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with fsScript1 do
        begin
          Lines.Clear;
          Lines.Add('begin                          ');
          Lines.Add('  ShowMessage(''Hello!World.'')');
          Lines.Add('end.                           ');
          Parent := fsGlobalUnit;
          SyntaxType := 'PascalScript';
          if Compile then
            Execute
          else
            ShowMessage(ErrorMsg);
        end;
    end;
  3. 実行し、ボタンを押下します。
 すると、このような実行結果と相成ります。

 FastScript のスクリプトエンジンは Pascal 以外にも切り替えることができます。

 お好きな言語でどうぞ (Delphi 使いなら Pascal 一択なのでしょうが、アプリケーションの機能をスクリプトを介してユーザに公開するのであれば話は変わってきますからねぇ)。FastScript のドキュメントはこちら (http://www.fast-report.com/pbc_download/fs_en.pdf) になります。

・ LiveBindings - VCL (Delphi XE2)
 デーダバインダ&O/R マッパ...のようなものです。正直、使い所が難しいと思いますので、詳細な紹介は保留する事にします。

・ "BDE (Paradox / dBASE) 代替 としてのローカル DB" をいい加減にどうにかして欲しい...の件
 だって、BDE (Paradox / dBASE) じゃ Unicode 通らないし、64bit アプリケーションには使えない。MyBase じゃ SQL 使えないので、Paradox / dBASE の完全な代替にはならないですもの。BDE にあった "ローカル SQL" が TClientDataset で使えると有り難いのですけれど、MyBase ではテーブル名に相当するものがないので SQL での問い合わせは無理かな...やっぱり。

 BlackFish SQL は Delphi XE で非サポートになったし、XE2 で DBX4 の ODBC ドライバがサポートされたけど Ent 以上だし。dbGo は 64bit でも Pro でもイケるけど、当然 Mac OSX には対応しないし...なんだか無性に IBX で Firebird 接続できるようにしたくなってきた。

・ Starter と Ultimate (Delphi XE2)
 既に購入できるようです。いずれもパッケージ版はない模様。

通常版 ESD

アップデート ESD

 ※価格にポイント等は反映されていません。また、価格は変動する事がありますのでリンク先を必ず確かめるようにして下さい。

 Starter Edition の制限については XE の Starter Edition の制限に準拠しているものと思われます。

 各 SKU の違いについては RAD Studio XE2 機能一覧 を参照して下さい。Starter と Professional の違いについては "「RAD Studio XE2 機能一覧」でProfessionalとStarterを比較してみる (山本隆の開発日誌)" にて詳しい解説がなされています。

 キャンペーンの価格表については、

 をご確認ください (上 2 つがとても紛らわしいです)。"Delphi XE2 Q&A" も併せて確認しておくとよいでしょう。

・ Delphi XE2 発売後の各地の反応 - togetter (Delphi XE2)
 twitter やってない方のために。

 なお、この togetter に "ハエトリグモの話" は含まれておりません。


11/09/06

・ カスタムマニフェスト (Delphi XE2)
 XE2 ではプロジェクトオプションでカスタムマニフェストを指定する事が可能です。

 マニフェストは XML 形式の UTF-8 テキストファイルです。拡張子は.manifest となります。マニフェストファイルは XP 対応の時に "21.WindowsXP 対応アプリを作る" でやりましたっけね。Vista 以降の UAC 対策でも *.manifest を使います。

・ スタイル - VCL (Delphi XE2)
 VCL フォームアプリケーションでは、以下のテーマを設定する事ができます。一応、断っておきますが、画像は FireMonkey のものではありません。

 最も簡単な使い方は、プロジェクトオプションでお好みのスタイルにチェックを入れてスタイルを選択するだけです。

 動的にスタイルを変更したいのなら、プロジェクトオプションで変更可能なスタイルにチェックを入れ、

uses
  ..., Vcl.Themes, VCL.Styles;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TStyleManager.TrySetStyle('Aqua Graphite');
end;

 このようなコードを記述するだけです。また、スタイルは独自に定義する事ができます。$(BDS)\VclStyleDesigner.exe (IDE の [ツール] から呼び出せます) を使えば...

 自分専用のスタイルをデザインする事ができます。詳細なデザイン方法は "Creating a Style using the VCL Style Designer" を参考にして下さい。個人的には TTouchKeyboard 用のエディタも欲しい所ですが...。

・ Embarcadero 第 20 回デベロッパーキャンプ
 本日開催 (10:00~18:00)。残念な事に今回は Web 参加ができませんが、一部セッションは Ustream にて配信されます。twitter のハッシュタグは #dcamp_jp です。

 Ustream の twitter は #dcamp_jp と連動してないのか。んじゃ、やっつけページでも作っておくか。

(そして終了後)

 Ustream で観れたのは 【G1】/【G2】/【B4】(途中から)/【A5】/【G6】でした...仕事しながらですが。

 【G6】セッションのライトニングトークは

  1. AppWave の何か
    エンバカデロ 高橋さん
  2. ngram方式を採用した全文検索コンポーネント
    株式会社ビズ 田付さん
  3. Delphi で GLScene を使って簡単な 3D プログラミング
    山本聡さん
  4. 今更ながらの小さな Tips と個人的な提言
    StudioQ 本田さん
  5. State パターンを Delphi で実装する
    東洋テクニカルシステム 福士さん
  6. 大量の PC の電源管理を Web で行う Delphi Prismアプリケーションの仕組み
    ドリームハイブ 山本さん
  7. Delphi と Android 端末を微妙につなぐ技術
    シリアルゲームズ 細川さん
  8. ゾンビランドのプログラミング 32 のルール
    Embarcadero David.I-san
 の 8 本でした (お名前/タイトルを間違っていたらゴメンナサイ)。どの LT ももう少し長く聴いていたかったなぁ...。

 全体的な感想としては、「XE2 の新機能が多すぎて詰め込み気味」というのが正直な感想でした。まぁ、このサイトの情報も未だ FireMonkey まで到達していない状況だし (RTL / VCL 部分だけでも結構お腹いっぱい)、仕方のないトコロでしょうね...ただ、新機能が多いとは言っても、「2005 とは違うのだよ、2005 とは!」 的な意味なので、会場は大いに盛り上がったのではないかと思います。

 ...やっつけページ が思いのほか役に立ったな (個人的には)。次の機会でも使いまわす事にしよう (w

・ 各製品の概要 (XE2)
 やっとこさ日本語情報をまとめて読めるようになりました (個別には RSS で情報が流れていたのですが...)。

 各ページの右側から、製品カタログ (pdf) / 機能一覧 (pdf) / Q&A を読むことができます。


11/09/07

・ ユニットスコープ (Delphi XE2)
 当サイトでは泥臭く地道にやります。まだ VCL / RTL はすべて終わっていません。

 さて、ユニットスコープですが、名前空間とは違い、文字通り "ユニットのスコープ" となっています。

 "ユニットスコープ.名前空間" のようになります。従来の SysUtils 名前空間は、プレフィクスとしてユニットスコープ名が付き、System.SysUtils となります。既存の Delphi のプロジェクトを XE2 に読み込ませても、ユニットスコープの問題はまず起きません (後述します)。

 ユニットスコープはユニット名の衝突を防ぐという意味より、マルチプラットフォーム / マルチフレームワークにおけるユニットの管理を正しく行う (混乱を防ぐ) という意味合いが強いと思います。ユニットのスコープを設定する事により、IDE / コンパイラ / リンカが現在のプラットフォーム / フレームワークに不要なユニットを検索せずに済むという利点があります。

 反面、独自に作成したライブラリユニットや VCL には適切なスコープを設定 (レジストリに追加します) してやらないと、コンパイル時間が長くなる事があります。まぁ..."事がある" というだけなので、大規模なコンポーネント群でもない限りはユニットスコープの登録は不要でしょうが。

 プロジェクトオプションには最初から適切なユニットスコープが登録されています。

 XE だとここには "デフォルト名前空間" と "名前空間プレフィックス" がありましたね...デフォルトでは空でしたが。

 例えば、従来の GIFImg.pas は Vcl.Imaging.GIFImg.pas というファイル名で、"Vcl.Imaging (ユニットスコープ名)"、"GIFImg (名前空間)" なのですが、

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, GIFImg;

 Vcl.Imaging というユニットスコープが効いているので、"GIFImg" だけ uses してもコンパイルは通ります (ユニットスコープ名を明示的に指定した方がいいのは言うまでもありませんが)。つまりは、もはや "uses = ユニットファイル名の指定" ではない という事になります。

 従来のユニット名 (名前空間) からユニットスコープ名付きの名前空間を調べるには、DocWiki 内を検索してもいいのですが、"Delphi / RAD Studio XE2 Unit Scope Helper (Drs.Bob's Delphi Notes)" を使うのが簡単でいいと思います。

 とりあえずは、あまりユニットスコープを意識しない方がいいでしょう。問題が出たら 「あぁ、そういえばユニットスコープなんてのがあったな」 と思い出せる程度でいいかと。欲を言えば、IDE の補完機能で Vcl. と入力したらユニットスコープ名またはユニット (名前空間) の候補が出てくれたらなぁ...とは思います。

・ 第20回エンバカデロ・デベロッパーキャンプ - togetter (XE2)
 昨日のデブキャンの togetter です。

 twitter やってない方のために。

・ 昨日のライトニングトークの感想
 記憶に残っているうちに書いておきます。ライトニングトークは 5 分間で、1 分前に小さなドラが鳴り、5 分のドラがなったら強制終了というルールで行われます。

  1. AppWave の何か - エンバカデロ 高橋さん
    またの名をクールガイ。
    ADO + PostgreSQL なアプリを InnoSetup で固めて AppWave にデプロイするという作業をたった 5 分でやろうという無謀とも思える挑戦。
    高橋さんの手と口が最初から止まらない、止まらない。サマーウォーズばりの緊迫感の中、AppWave にデプロイ完了!ここまではパーフェクト。仕上げとして実際に AppWave からアプリを直接実行してみる事に...何故か時間が掛かる。時間超過気味だが、ドラも空気を呼んで鳴らない。焦燥感が漂う中、ビジーカーソルがフッと消えた。
    そして感動のフィナーレ。「あ、ライセンス登録してませんでした。てへっ♡」 ライセンス登録画面が映しだされたスクリーンのままドラが鳴った。
  2. ngram 方式を採用した全文検索コンポーネント - 株式会社ビズ 田付さん
    またの名を 風の鳩サブレー さん。
    会場のスクリーンに映像が...出ない。ngram 方式で全文検索を行うデモ。ローカルに DL した Wikipedia 16万ページを数秒以内で検索するというもの。AND 検索も可能。インデックスを含めたデータ量は元データの 1.5 倍程度になるそうです。素直に「こりゃスゲー」と思いました。正規表現については Tips をどうぞ。
  3. Delphi で GLScene を使って簡単な 3D プログラミング - 山本聡さん
    またの名を delfusa さん。
    会場がどうだったかは知らないが、僕はお題が出た時点でちょっと固まった。GLScene は FireMonkey とちょっとゴニョゴニョなのに空気読まずに GLScene とな?でもまぁ、GLScene 自体はいいと思う。ちなみに、Vista 以降での OpenGL は DirectX がエミュレーションしていたハズなのだが、GLScene のパフォーマンスが Vista 以降の OS ではどうなのか?ってのも教えて欲しいな。
  4. 今更ながらの小さな Tips と個人的な提言 - StudioQ 本田さん
    またの名を Quest さん。
    予定していた 2 つの提言のうちの片方は "Only in my environment" だったようです。ドンマイ!むしろ "蓼沼ドラ子" さんの暴走に (目ではなく) 耳がいっちゃいました。おかげで LT の内容忘れちゃったじゃないか、どーしてくれるんだドラ子さん!!
  5. State パターンを Delphi で実装する - 東洋テクニカルシステム 福士さん
    またの名を ふー さん。
    FireMonkey アプリを含め、フォームを一つで状態遷移しなくてはならない場合には重要な情報だったハズ (今現在、仕事で僕も 1 フォームでの状態遷移やってます)。今度は是非 XE2 の LiveBindings も絡めて長尺でやって欲しいです。LT の尺で終わらせるには余りにもモッタイナイと思います。
  6. 大量の PC の電源管理を Web で行う Delphi Prismアプリケーションの仕組み - ドリームハイブ 山本さん
    会場のスクリーンに映像が...出ない出ない。LT の内容は Web からPC の電源管理を行うというもの。Prism の ASP.NET で作られており、3,000台管理の実績 (元々は学校向けらしい) があるという。お値段は 35万~。そして、「DB には Blackfish SQL を使っている」...という話でいきなり黒くなる DH山本さん (w お気持ちはよく解ります。
  7. Delphi と Android 端末を微妙につなぐ技術 - シリアルゲームズ 細川さん
    過去にはデブキャン資料にラブ○ラスの画像を貼った実績を持つお方。でも、Android の ADB ハック (TCP/IP over USB) とかやっちゃう、凄いお方でもあるのだ。Delphi ラブ。デモマシンのデスクトップを Android に画面転送するというデモを実演。デモマシンが非力で 1.5 FPS 程度しか出ないけれど、もう少し普通の PC なら現状でも 10数 FPS は出るとの事。この手のネタは個人的にとても好きです。
  8. ゾンビランドのプログラミング 32 のルール - Embarcadero David.I-san
    LT のオリジナルのお題は "The 32 Rules of [Programing In] Zombieland" で、映画 ゾンビランド で出てくる "ゾンビの世界で生き残るための 32 のルール" のパロディです。
    David.I は多分、真面目な顔のように見えてドヤ顔で 32 のルールを語っていたと思うのですが、進行するにつれ、「あれ?何でここで笑わないんだ?日本人とは笑いのツボが違うのかな?」 と考えたハズです。いや、だって David.I...誰も元ネタを知らねぇよーwwwwwwww
    「ウルトラ 10 の誓い」 だったら、無理なく進行できて会場はドッカンドッカン沸きまくりですよ。今度は是非それで...(ヲイ)
 とまぁ、簡単ながらライトニングトークを振り返ってみました。

・ Prism (XE2)
 デブキャンでは FireMonkey のクラスプラットフォームや RadPHP の話がメインでしたが、「Prism はどうなった?」 という疑問が頭をもたげるかと思います。あ、"Delphi" の冠が外れたのは Prism の言語を "Oxygene 言語" としたため、Delphi の "Delphi 言語" と区別するようになったからだとか (詳しくは Prism XE2 Q&A を参照)。

 話が逸れてしまいましたが、端的に言えば Prism XE2 は Delphi Prism XE からある意味デグレードとなっています。Prism XE2 Q&A には以下の記述があります。

XE2では、Visual Studio IDEのバージョン2008のサポートを終了しました。また、Prism XE2には、MonoDevelop IDEも含まれておらず、このサポートも終了しています。旧バージョンのDelphi Prism XEをお持ちの方は、そのバージョンに含まれるOxygeneコンパイラを使って、MonoDevelop IDEを利用できます。Delphi Prismでは、MonoDevelop IDEとノベル社のMonoTouchを使って、iOSアプリケーションの開発もサポートしていました。この機能も現在ではサポートされていません。iOSアプリケーションの開発を行うには、Delphi XE2またはRadPHP XE2のご利用をお勧めします。

 .NET フレームワーク (Mono を含む) によるクロスプラットフォーム開発は一歩後退といった所です...とはいえ XE2 を購入すれば、結局 XE も手に入るのですがね。

・ Starter Edition の制約 (XE2)
 昨日のデブキャン中に twitter で 「そういや、XE2 Starter の制限は XE 準拠?」 とつぶやいてしまったのですが、ソフトウェア使用許諾およびサポート契約書 にバッチリ書いてありました。

Starter エディションに適用される追加条項

お客様が Starter エディションのライセンスを取得された場合には、以下の条項が適用されます。第 2 条第 1 項の権利付与と矛盾する範囲においては、この条項が優先するものとします。

お客様は本製品を使用して、

(i)お客様が直接または間接に料金を請求せず、ライセンス料金、サービス料金、開発料金、コンサルティング料金、サブスクリプション料金、サポート料金、ホスト設定料金などの報酬を受け取らないソフトウェア。

および、

(ii)お客様が請求する料金(ライセンス料金、サービス料金、開発料金、コンサルティング料金、サブスクリプション料金、サポート料金、ホスト設定料金など)が年間の累積で 1000 US ドルを超えないソフトウェア。

を開発することができます。

企業(営利か非営利かを問いません)がソフトウェアの使用権を付与する場合には、

(i)企業全体の収益が 1000 US ドルを超えてはならず、

(ii)配置する Starter エディション ライセンスの総数が 5 ライセンスを超えてはなりません。

 結論から言うと XE 準拠でした...資料にはちゃんと目を通さないとダメですね (原文は若干読みにくいので、句読点と改行位置を変更してあります)。その他の制限や、アップグレード対象製品についても XE 準拠だと思われますが、購入を考えている方は念の為にエンバカさんへご確認下さい。


11/09/08

・ SkRegExp 1.3.0 (XE2 対応版)
 リリースされました。100% Delphi で記述された、日本語に対応した正規表現クラスライブラリです。詳細については "120.正規表現の活用 (主に Delphi 2009 以降)" をどうぞ。そういえば、Delphi 標準正規表現クラスにあった QC#93333 の件も XE2 で解決されたようです。

・ XE2 絡みの今日の雑談
 ...はお休みします。全然ネタ切れではないのです (むしろありすぎて困っているくらいです) が、明日が隣県へプチ出張なので、未だにバタバタしております...今日もこのまま徹夜だな。


11/09/09

・ XE2 で IBX + Firebird は本当に動作しないのか? (Delphi XE2)
 Delphi Q&A の igy さん情報によると、IBX + Firebird の接続に成功しているとの事。しかも 32bit はおろか、64bit にまで!

 さーて、俄然やる気が出てきました。動く環境とそうでない環境の違いがありそうなので、ちゃんと調べてみたいと思います。Mac までイケたら最高なんですがね (IBX は Mac OSX / POSIX 対応で、Starter にも付属しています)。

・ 続・XE2 で IBX + Firebird は本当に動作しないのか? (Delphi XE2)
 バッチリ動きます。64bit での動作も確認しました (32bit / 64bit 共に、Firebird 2.1 / 2.5 で確認)。

 原因は、91.IBX で Interbase / Firebird に接続するには? に記述のあった 「IBX を動的生成して使うコードが XE までの IBX でしか動作しなかった」、という事でした。ポトリペタリで適切にプロパティを設定していれば、普通に動作します。現在、件の動的生成コードは XE2 対応版に差し替えてあります。


11/09/10

・ DB 接続状況 (Delphi XE2)
 機能一覧を元にまとめてみました。

 誤解していましたが、XE2 の Starter には DBX4 があるのですね...ローカル Interbase 接続のみですが。ちなみに、XE の Starter に DBX4 はありません。

・ TDataModule (Delphi XE2)
 ran さんの twitter ネタです。元ネタは "TDataModule has changed in XE2 (jed-software.com)" となっています。

 要は、TDatamodule の ClassGroup プロパティ (厳密にはプロパティではないと思う) の初期値が System.Classes.TPersistent になっていて、例えば VCL フォームアプリケーションを作った場合、ここを "Vcl.Controls.TControl" に変更しないと ImageList とかが載せられないというものです。

 VCL フォームアプリケーションを新規作成した時点の ClassGroup の初期値はクロスプラットフォーム用なので、FireMonkey に存在しない ImageList とかが載せられないという事態に陥ります。

 では、既存のプロジェクトを読み込ませた場合にどうなるかというと、"ClassGroup プロパティは空になりますが、コンパイルはそのまま通ります"...なお、新規でプロジェクトを作成した場合にはここを空にする事はできません。トラブルを避けるため、既存のプロジェクトを読み込ませた場合には ClassGroup を "Vcl.Controls.TControl" に設定しておいた方がいいかもしれませんね。

 ClassGroup を変更してもツールパレットやコンポーネントツールバーが変わらない?そんな時には一旦他のフォームを選択してから DataModule を選択してみましょう。


11/09/11

・ 9.11
 あれから 10 年か...。

・ TOSVersion レコード (Delphi XE2)
 XE2 には OS の情報を得るための SysUtils.TOSVersion が用意されています。

procedure TForm1.Button1Click(Sender: TObject);
var
  Dmy: String;
begin
  Memo1.Lines.Clear;
  // Check
  if TOSVersion.Check(5, 1, 3) then
    Memo1.Lines.Add('XP SP3 以降')
  else
    Memo1.Lines.Add('XP SP3 以前');
  // ToString
  Dmy := TOSVersion.ToString;
  Memo1.Lines.Add(Dmy);
  // Name
  Dmy := TOSVersion.Name;
  Memo1.Lines.Add(Dmy);
  // Platform
  case TOSVersion.Platform of
    pfWindows:
      Memo1.Lines.Add('Windows Platform');
    pfMacOS:
      Memo1.Lines.Add('MacOS Platform');
  else
    Memo1.Lines.Add('Unknown Platform');
  end;
  // Architecture
  case TOSVersion.Architecture of
    arIntelX86:
      Memo1.Lines.Add('x86 Architecture');
    arIntelX64:
      Memo1.Lines.Add('x64 Architecture');
  else
    Memo1.Lines.Add('Unknown Architecture');
  end;
  // OS Version No
  Dmy := Format('%d.%d.%d',
                [
                  TOSVersion.Major,
                  TOSVersion.Minor,
                  TOSVersion.Build
                ]);
  Memo1.Lines.Add(Dmy);
  // ServicePack Version No
  Dmy := Format('%d.%d',
                [
                  TOSVersion.ServicePackMajor,
                  TOSVersion.ServicePackMinor
                ]);
  Memo1.Lines.Add(Dmy);
end;

 このコードを Windows 7 (64bit) で実行した結果はこうなります。

XP SP3 以降
Windows 7 Service Pack 1 (バージョン 6.1、ビルド 7601、64 ビット版)
Windows 7
Windows Platform
x64 Architecture
6.1.7601
1.0

 Check() クラスメソッドは指定した OS のバージョン以降かどうかを調べます。従来からあった SysUtils.CheckWin32Version() と同等のメソッドですが、サービスパックの指定が可能となっています (オーバーロードされた引数の数の違うクラスメソッドがあります)。

 その他のクラスメソッドは...みたまんまですね。レコードのクラスメソッドなので、TOSVersion を Create する必要はありません。

 Windows で実行した場合、"22.Windows のバージョンを本格的に判断する" のようなエディションの違い等は取得できませんが、マルチプラットフォーム用と考えるとこの程度の情報で充分だと思われます。

 TOSVersion.Platform を使った分岐コードは書くべきではないと思います。(プラットフォーム) OS が異なるのですから、{$IFDEF} を使って条件コンパイルをすべきでしょう。


11/09/12

・ x64 デバッガとブレークポイント (XE2)
 もう一度だけ要点を。09/02 の雑談に加えて書いてみると...

 という事になります。デバッガが不安定な場合には、とりあえずタスクマネージャで dbkw64_16_0.exe を調べてみて下さい。

・ Delphi の QC (XE2)
 現在の状況はこのようになっています > http://qc.embarcadero.com/wc/qcmain.aspx?search=1&proj=10&vers=16.0。なお、Pulsar-FT 期間内に入れられた FT-QC (青 QC) は FT 参加者にしか見えません。

 一昨日の雑談で書いた (ツールパレットがリアルタイムで更新されない) 件は QC#98743 です。先日来、twitter で話が上がってた Platform.GetTick() の件は QC#98747 です。XE2 関連のバグを見つけたら今のうちに QC に入れておきましょう。Update1 に間にあう (修正される) かもしれません。

・ QC#98747 - Platform.GetTick() について (XE2)
 問題を発見したのは "全力わはー" の中の人で、2011/09/12 のエントリー内で日本語による詳細を書いてらっしゃいます。

 要は 「長い間起動した PC で Platform.GetTick() を使うと精度が落ちる場合があるため、アニメーション処理等には使えない」 というものです。これは Windows 版の実装が timeGetTime() API を呼んでいるのに、戻り値の型が Single なために起こります。

 Mac の実装だと、精度は落ちますが Windows 版の実装程ではありません。time (現在時刻) を基準としているからです...が、Mac の実装は Mac の実装で問題があるような気がします。詳しくは QC のコメ欄を参照して下さい。

 追記: Windows 版の実装では timeGetTime() API を使っているので、49.71 日に 1 回は Mac の問題と同じ現象が起きます。休止状態とかを多用するノート PC では有り得るかも。


11/09/13

・ Delphi XE2 と C++Builder XE2 で修正された不具合一覧 (XE2)
 どこかで見たような QC も混じっています。

・ FireMonkey とスレート PC (XE2)
 数カ月前からスレート PC のプログラミングをやっていますが、FireMonkey の話を初めて聞いた時、「遅ェよ...orz」 と思ったのも事実です。

 スレート PC プログラミング で厄介なのは画面の解像度の問題です。"UI の最小サイズを試算する" で書いたように、高 DPI プログラミングはかなり面倒です。確かに従来の Delphi でも Scale (ChangeScale) によるコントロールサイズ変更は可能でした。しかしながら、やってみた方はご存知かと思いますがフォントサイズが適切なものにならない事が多く、Scale を使ったとしても追加のコードを書く必要がありました...キリのいい拡大/縮小ならいいんですけどね。実際にはディスプレイには様々な比率のものがあるのです (縦横比ではなく、A と B のディスプレイの縦なら縦の解像度の比率です)。

 FireMonkey でも VCL の Scale のようなものがあります。デモプログラムを見てみましょう (FireMonkey\ControlsDemo)。

 右下にスライダーがありますね?これを動かしてみると...

 このように破綻なく拡大できます。ちなみに、StringGrid のセルの高さや幅も追従します。VCL の StringGrid はScale を変えてもセルの高さや幅は追従しなかったですよね?

 画面の回転についてもそうです。ハードウェアによる画面の回転は 90°単位でしか行えず、切り替えるのに時間が掛かります。しかし、画面を回転せずにアプリケーションで描画方向を変えるのは相当な手間が掛かります。入力コントロールとかがある場合には特にです...ですが、

 FireMonkey では入力コントロールを任意の角度にする事すら可能です。画像のように回転した状態で入力する事も可能です。

 以前の雑談で、「FireMonkey は最小公倍数的なクロスプラットフォーム用フレームワークだけではない」 と書きましたが、上記のような理由からでした。Starter Edition では FireMonkey が Windows 専用にしか使えませんが、それはそれで価値があるのです。

 ...と、もう少し早い時期にこの雑談を書いていればよかったのですが、現時点ではやや新鮮味に欠けちゃいますね。

・ FireMonkey と GDI+ と Direct2D (XE2)
 FireMonkey アプリケーションはコントロールの描画に GDI+ / Direct2D / DirectX (3D 関係)、MacOSX / iOS なら Quartz / OpenGL (3D 関係) を使っています。

 以前作った "スレート PC 用画像ビューア" は、煮詰まる前の段階では "/UseD2D" とか "/UseGDI+" とかのオプションを持っていました。環境に合わせて最適なレンダリング方法を模索するためでした (アップされているものは GDI 強制です)。Windows での FireMonkey HD アプリケーションも同じような感じで、D2D に対応していなければ GDI+ で描画するようになっています。

 ...でもですね、Windows の場合にはちょっとしたジレンマがあるのです。描画速度は "GDI > D2D > GDI+" で、描画のキレイさは "D2D ≧ GDI+ > GDI" なんです。高性能な PC では D2D が使えます。でも、D2D は Vista 以降でしか使えません...となると、XP では GDI+ を使う事になる訳ですが、アニメーション系だと結構動きがもっさりします。ネットブックのような環境でこそ、高速に動作して欲しいトコロですが、XP では "VCL アプリケーション + Graphics32" の方がキレイで高速に動作すると思います (Scale とかの話は抜きにして)。

 XP で動作している FireMonkey アプリケーションをリモートデスクトップ経由で操作する事はできない (Vista 以降なら OK) という制限もありますし、FireMonkey アプリケーションを走らせるなら Vista 以降がいいと思います。あ、ちなみに TW317A5 では D2D が使えます...ただ、大きめの画像を D2D で扱うとコケてました (FireMonkey アプリケーションではありません)。

・ FireMonkey と Windows Animation Manager と DTween (XE2)
 FireMonkey の FMX.Ani 名前空間にはコントロールをアニメーションさせるためのクラスが用意されています。従来でも、Vista 以降なら Windows Animation Manager が Windows 標準の機能として使えました。これを Delphi から使えるようにしたのが "Windows Animation Library for Delphi" です。このライブラリを試してみた時点 (最近は試してません) では、結構エラーダイアログを拝んだ気がしますケドね...(^^;A

 らいなタン(毎回、""全力わはー" の中の人" と呼ぶのは面倒だ ^^;) 作の DTween は前記の 2 つと同じような機能を持つトゥイーンライブラリです。VCL をアニメーションさせる事ができます。このテの機能はグダグダ書くより、動画を見てもらったほうがいいでしょうね。

 

 

 "Flash のモーショントゥイーンみたいなもの" と書いた方が覚えがいいかもですね。VCL をウニウニできるのはとても魅力的です。前のトピックでも書きましたが、環境によっては FireMonkey アプリケーションを選択できない場合があるからです。どうでもいいけど、"さかなクンさん" と同じように、"らいなタンさん" と呼ぶべきなのかな?

 ...動画と言えば、エンバカさんの Youtube Channel があるのでしたね。こちらにも FireMonkey 関連の動画がありますので、是非御覧ください。


11/09/14

・ FireMonkey で 空文字列を ShowMessage() すると?(XE2)
 twitter からのネタです。ShowMessage() に空文字列を指定すると画面サイズの半分の幅のダイアログが表示されます (MacOSX では発生しないとの事)。これを暫定的に回避するには、らいなタンさん作の FMXCanvasFix を uses します。

・ FireMonkey で 日付文字列を ShowMessage() すると?(XE2)
 こちらも twitter からのネタです。コードはこんな感じです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  GlobalUseDirect2D := False;
  ShowMessage('2011/09/14');
end;

 描画に GDI+ が使われる場合、上記コードで指定した日付文字列は正しく描画されません。大抵は余分な空白を末尾に付けてやれば回避できると思います。

 TLabel にも似たような問題があります...というか、ShowMessage() では TLabel が使われています。

procedure TForm1.Button1Click(Sender: TObject);
var
  w: Single;
begin
  GlobalUseDirect2D := False;

  Label1.AutoSize := True;
  Label1.Text := '2011/09/14';
  w := Label1.Width;

  Label2.AutoSize := False;
  Label2.Text := '2011/09/14';
  Label2.Width := w;
end;

 Label1 の幅を Label2 に設定したので、どちらも表示は同じになるハズですが...?

 上記 2 件の問題は QC に入れる必要はないような気がします...私が QC 番号を明示しない場合、理由は推して知るべし、です。

・ FireMonkey には DB コントロールがないのか?(XE2)
 こちらはフォーラムネタです。DB コントロールの代替は LiveBinding で実装します。

 まずは、"LiveBinding を使用してコードを書かずにアプリケーションを作成する" を動くようにしてみて下さい。動くようにできれば DBEdit 等の代替方法は理解できたと思います。DBGrid の代替は、

  1. StringGrid を貼る (何もカラムを作らない) 。
  2. LiveBindings プロパティをドロップダウンして [DB フィールドへのリンク...] を選択。
  3. "BindScopeDB1" を選択して [OK] ボタンを押す。
 これで "DBGrid のようなもの" ができます。なお、この方法は VCL アプリケーションでは使えないと思われます。

・ バージョン情報とビルド番号 (XE2)
 もう一つフォーラムネタです。"(プロジェクトオプションの) ビルド番号が自動でインクリメントされない" というものです。この件は QC#98487 (の重複) で、既に Closed になっています。

 "ビルド番号の自動生成" の時のリリース番号 / ビルド番号は...

 [バージョン情報]のドキュメント は読み違えやすいと思います...ご注意を。  ああ、紛らわしいったら。


11/09/15

・ バージョン情報とロケール (XE2)
 フォーラムネタです。何故かバージョン情報リソースのロケールが英語になったままです。BDSSetLang.exe で切り替えても何も起こりません。コントロールパネルで "地域と言語のオプション" を変更しても変化しません。この件に関しては...推して知るべし。

・ バージョン情報と *.vrc (XE2)
 フォーラムネタ関連です。XE2 では *.vrc というファイルが生成される事があります。これはバージョン情報等のリソース用ファイルです。

 この *.vrc はテンポラリ的に生成される事があります。例えば、バージョン情報の "製品バージョン" に "1.0.0.b" のように入力すると、先程まで存在しなかった *.vrc がコンパイルエラーで止まると思います...鋭い方はお気付きかもしれませんが、従来の Delphi では "製品バージョン" に任意の文字列を入力できていました。*.vrc のコンパイルエラーで止まったら、まずはバージョン情報を確認してみて下さい。

 "製品バージョンフィールドの仕様 (MSDN)" 的には、

 となっています...なので、ベータを表す "1.0.0.b" 等は許容されてもいいハズなのですが、XE2 ではそれは通りません。この件に関しては...推して知るべし。

・ ハエトリグモの話
 twitter ネタ。この雑談でやるのを忘れてた。

  1. メッセンジャーで友人とチャットしておったのじゃ。
  2. 今、使っているディスプレイはマルチタッチ可能なディスプレイなのじゃが...
  3. ディスプレイにハエトリグモがやってきて...
  4. デスクトップにあったファイルを...
  5. メッセンジャーウィンドウにドラッグ&ドロップしやがったwwwwwwwwwwwwwwww
 この "事件" についての個人的な意見は以下の通り。  「つくり話も大概にしとけよwwwwwwww」...ほう、そこまで言うのなら、実際に光学式のマルチタッチディスプレイを購入し、ペイントブラシを最大化して表示したまま (キャンバスサイズは画面サイズで) 寝てみるがいい。貴様が朝目覚めたときには、引いた覚えのないヨタヨタとした線が何本も引かれているであろうよ。

・ 第20回 エンバカデロ・デベロッパーキャンプ - セッション資料ダウンロード
 Dear David.I > m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m m(_ _)m だから、LT の資料を下さい (w

 ※ Tips の方も更新しました。

・ FireMonkey HD アプリケーション - LiveBinding を使用して "DBGrid みたいなもの" を作ってみる (XE2)
 "FireMonkey には DB コントロールがないのか?" は、あまりにもぶっきらぼうだったので、ちょっとだけ丁寧に。手順は MyBase です。

  1. [新規作成 | FireMonkey HD アプリケーション]
  2. フォームにコントロールを貼り付ける。
  3. プロパティを設定する。
  4. StringGrid (StringGrid1) の LiveBindings プロパティをドロップダウンして、[DB フィールドへのリンク...] を選択。
  5. BindScopeDB1 を選択して、[OK] ボタンを押下。
  6. BindingsList (BindingsList1) が勝手に生成され、StringGrid が DBGrid のように使えるようになりました。
 DataSouce に繋げる事のできる DataSet ならなんでもいいので、MyBase に限らず DBX4 や IBX でも "DBGrid のようなもの" を利用可能です。


11/09/16

・ 各地の XE2 情報 (XE2)
 XE2 は良くも悪くも変更/追加された機能が多く、機能を調べるだけで一苦労です。特に FireMonkey は皆が同じスタートラインからのヨーイドンなので、昔からの Delphi ユーザにアドバンテージがある訳ではありません (多少の勘所はあるにせよ)。

 "言い訳じみてくると何かの前フリ" ってのはこの雑談の伝統なのですが、まとまってない情報を書くと後で訂正するハメになりますので、ここはとりあえず "他の XE2 ユーザの情報" を紹介する事にします...あ、逃げやがった (w

 順不同です。いい加減、ライトニングトークの資料を読みたいんだい!

・ 社内用 iOS アプリの配布に必要なもの (XE2)
 やまぎぅさんに教えて頂きました。多謝。

 社内配布するためには "iOS Developer Enterprise Program" に参加する必要がありますが、プログラム参加の前提条件として、

DUNS番号(世界標準の企業識別コード)を取得されている企業または組織団体がお申し込みいただけます。

 ...が、あるので、DUNS番号 を事前に取得しなくてはならず、その DUNS番号 の取得申請時に登記簿謄本が必要になる、と。面倒だなぁ。 自作アプリを自分で使う (検証する) だけなら、"iOS Developer Program" (年会費: \8,400) があればよく、それ以外の配布は App Store 経由となるようです。

 追記: らいなタンさんより。Apple による情報ソースはこちら。

検証とAd Hoc配布用にデバイスを100台まで指定できるようになります。メンバーシップの新年度が始まる時に、チームエージェント(Team Agents)やチーム管理者(Team Admins)がデバイスを解除して、自分たちの開発チームのために使用可能なデバイスカウントを100台まで再設定できます。

 "iOS Developer Program" でもアドホックビルドによるアドホック配布は最大 100 台可能との事です。


11/09/18

・ Import3DS Demo (XE2)
 XE2 にはデモフォルダに Import3DS というデモプロジェクトがあります。これは Nintendo 3DS のイメージファイルを...いや、もちろん嘘だけどね。

 このデモは Autodesk 3D Studio (3ds) Max の 3D モデリングデータ (*.3ds) をインポートするデモです。

 こういう事ができると言えば解りやすいでしょうか?モデルデータは キオさんの "初音ミク形状データVer.1.1 (キオ式アニキャラ3D act.2)" をお借りしています。モデリングが変に見えるのは、テクスチャが正しく読み込まれていないからです。モデリングデータの "テクスチャフォルダが日本語名" なのが原因なのか、"ファイル名に空白文字が含まれている" のが原因なのかまでは調べていません。テクスチャは *.3ds に含まれているようですが、それを正しく反映していないようです。

 拡張子 *.3ds のデータは "メタセコイア (シェアウェア)" でもインポート/エクスポートできるようです。初音ミク絡みで言えば、MMD のモデルもメタセコイアプラグイン経由で取り込んで *.3ds に変換できるような気がします。

 デモに関する注意点ですが、光源 (ライト) の位置やカメラの位置を調整しないと *.3ds を読み込ませても真っ白のままになります。[Load...] ボタンの横にラベルを幾つか貼って、カメラや光源の位置を表示するようにしてみると位置関係が判りやすいと思います。デモプログラムにモデルデータを読み込ませて画面が真っ白の場合には、マウスホイールをどちらかの向きに回し続けてみて下さい。"ゆっくりと"、"何回も" です。

・ Import3DS Demo 関連情報 (XE2)
 *.3ds を調べていた時に引っかかった情報です。

 正直、3D なんて X68K でちょっとやった程度だからなぁ...。


11/09/20

・ FireMonkey アプリケーションとアニメーション効果 (XE2)
 アニメーション関係は文章で説明するのが難しいのですよね。とりあえず簡単なデモを。

  1. [ファイル | 新規作成 | FireMonkey HD アプリケーション]
  2. Button をフォームの中央に一つ貼ります。
  3. Button1 の Width プロパティにはフィルムのようなアイコンが付いています。
  4. フィルムアイコンのある箇所にはアニメーション効果を付ける事ができます。

    コンボボックスをドロップダウンして [TFloatAnimation の新規作成] を選びます。
  5. FloatAnimation1 のプロパティを画像のように指定してみます。

  6. コンパイルして実行します。
 ボタンの幅がウニウニするアニメーションになったと思います。とても気色悪いですね (w 同様に、RotationAngle に TAnimation を指定すれば、回転するコントロールができるという訳です。ちなみに Duration を大きくすると、アニメーションのスピードが遅くなります。

 アニメーション効果の概要については、DocWiki の "FireMonkey のアニメーション効果" をご覧ください。

 一度設定したアニメーションを取り消すには [構造] ペインで 〔Delete〕 キーを押します。フォームデザイナやオブジェクトインスペクタから削除できないのが直感的ではないのですが、それは QC#98948 です。

・ VCL アプリケーションとアニメーション効果 (XE2)
 VCL フォームアプリケーションでオブジェクトインスペクタを見ても "フィルムのようなアイコン" がありませんよね?VCL フォームアプリケーションで同様の事を行いたい場合にはコードを書かなくてはなりません。詳しくは 09/13 の雑談にある DTween を確認して下さい。DTween は XE2 専用ではなく、Delphi 6 以降で使う事ができます。

・ Human68K と SX-Window (X68000)
 ボン太くんの OS が Human68K で

 電話レンジ (仮) の管理用には SX-Window が使われている...と。

 X68K ユーザは胸熱だな (w


11/09/21

・ TAnimation の派生クラスについて (XE2)
 ドキュメントが追いついていませんので、ちょっと補足...つーか解説を。

 上記アニメーションクラスは TAnimation から派生しており、オブジェクトのプロパティを変更してアニメーションさせるためには適切な派生クラスを選択する必要があります。

・ TAnimation のプロパティ (XE2)
 こちらも解説を。なお、TAnimation のプロパティの説明は英語版 DocWiki をベースにしています (日独仏版は未翻訳です)。

 AnimationType と Interpolation の関係は これ または これ が参考になります (Thanks! らいなタンさん)。

 AnimationType と Interpolation の動きに関しては "AttachTAnimation (DocWiki)" のデモを実際に実行してみる事をオススメします...ちょっと自信がないのですが、この手順に従ってもコンパイルできないかもしれません&スクショの通りに動かないかもしれません。やっぱりそのままでは動かないようです。

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Ani,
  FMX.ListBox, FMX.Objects;

type
  TForm1 = class(TForm)
    Rectangle1: TRectangle;
    MoveRect: TButton;
    ReturnRect: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    FloatAnimation1: TFloatAnimation;
    FloatAnimation2: TFloatAnimation;
    procedure FloatAnimation1Process(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
    procedure MoveRectClick(Sender: TObject);
    procedure ReturnRectClick(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  TypInfo; // Uses old style RTTI for simplicity

var
  saveX, saveY: Single;
  oldPos: TPointF;
  myPath: TPathData;
  posArray: array [0 .. 3000] of TPointF;
  next: Integer;

procedure TForm1.FloatAnimation1Process(Sender: TObject);
var
  newPos: TPointF;
begin
  newPos.X := Rectangle1.Position.X;
  newPos.Y := Rectangle1.Position.Y;
  if ((oldPos.X <> newPos.X) OR (oldPos.Y <> newPos.Y)) then
  begin
    myPath.LineTo(newPos);
    next := next + 1;
    posArray[next] := newPos;
    oldPos := newPos;
    Invalidate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  //  Populate the ComboBox items with possible values for Interpolation
  for i := Integer(Low(TInterpolationType)) to Integer(High(TInterpolationType)) do
  begin
    s := GetEnumName(TypeInfo(TInterpolationType), i);
    ComboBox1.ListBox.Items.AddObject(s, TObject(i));
  end;
  ComboBox1.ItemIndex := 0;

  // Populate the ComboBox items with possible values for AnimationType
  for i := Integer(Low(TAnimationType)) to Integer(High(TAnimationType)) do
  begin
    s := GetEnumName(TypeInfo(TAnimationType), i);
    ComboBox2.ListBox.Items.AddObject(s, TObject(i));
  end;
  ComboBox2.ItemIndex := 0;

  saveX := Rectangle1.Position.X;
  saveY := Rectangle1.Position.Y;
  oldPos.X := Rectangle1.Position.X;
  oldPos.Y := Rectangle1.Position.Y;
  Canvas.Stroke.Color := $FF0003F3;
  Canvas.Stroke.Kind := TBrushKind.bkSolid;

  myPath := TPathData.Create;
  myPath.MoveTo(oldPos);
  next := 0;
  posArray[next] := oldPos;

  Self.Fill.kind := TBrushKind.bkSolid;
  Self.Fill.Color := claSilver;

  // Attach the FloatAnimations to the Rectangle's position
  FloatAnimation1.Parent := Rectangle1;
  FloatAnimation1.PropertyName := 'Position.X';
  FloatAnimation1.StopValue := Rectangle1.Position.X + 200;
  FloatAnimation1.Duration := 5;
  FloatAnimation1.AnimationType := TAnimationType.atIn;
  FloatAnimation1.Interpolation := TInterpolationType.itLinear;
  FloatAnimation1.StartFromCurrent := True;

  FloatAnimation2.Parent := Rectangle1;
  FloatAnimation2.PropertyName := 'Position.Y';
  FloatAnimation2.StopValue := Rectangle1.Position.Y - 200;
  FloatAnimation2.Duration := 5;
  FloatAnimation2.AnimationType := TAnimationType.atIn;
  FloatAnimation2.Interpolation := TInterpolationType.itLinear;
  FloatAnimation2.StartFromCurrent := True;
end;

procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  i: Integer;
begin
  Canvas.Stroke.Color := $FF0003F3;
  Canvas.Stroke.Kind := TBrushKind.bkSolid;
  for i := 0 to Next - 1 do
    Canvas.DrawLine(posArray[i], posArray[i + 1], 1.0);
end;

procedure TForm1.MoveRectClick(Sender: TObject);
var
  AniType: TAnimationType;
  InterpType: TInterpolationType;
begin
  AniType := TAnimationType(Integer(ComboBox2.ListBox.Items.Objects[ComboBox2.ItemIndex]));
  FloatAnimation2.AnimationType := AniType;
  InterpType := TInterpolationType(Integer(ComboBox1.ListBox.Items.Objects[ComboBox1.ItemIndex]));
  FloatAnimation2.Interpolation := InterpType;
  FloatAnimation1.Start;
  FloatAnimation2.Start;
end;

procedure TForm1.ReturnRectClick(Sender: TObject);
begin
  FloatAnimation1.Stop;
  FloatAnimation2.Stop;
  next := 0;
  Invalidate;
  // Returns the rectangle to the starting position
  Rectangle1.Position.X := saveX;
  Rectangle1.Position.Y := saveY;
  oldPos.X := saveX;
  oldPos.Y := saveY;
  myPath.MoveTo(oldPos);
end;

end.

 赤字の箇所が修正または追加されているコードです。これだとコンパイルも通り、アニメーションの際の軌跡も描画され、[ReturnRect] ボタンが押された時に各種初期化が行われるようです。

 実行結果はこんな感じです。

 "AttachTAnimation (DocWiki)" のサンプルコードがおかしい件は QC#99122 です。列挙型に "vg~" で始まる "定義されていない値" が説明されていたり、これが原因でコンパイルできないサンプルコードのトピックがある件は QC#99133 です。


11/09/22

・ AnimationType と Interpolation の関係 (XE2)
 昨日の雑談の奴を TChart にプロットしたものを画像に吐き出してみました。

・ FireMonkey アプリケーションと画像効果 (XE2)
 FireMonkey アプリケーションでは画像に様々なエフェクト (TEffect の派生クラス) をかける事ができます。これまた文章で説明するのは大変なので、

 を確認してみて下さい。

・ バージョン情報の件 (XE2)
 ふーさんの考察 "Delphi XE2で生成される実行ファイルのバージョン情報についての問題とその解決策" は正しいようです。

 *.dproj をエディタでいじらずにバージョン情報を正しく反映させるには、

  1. [プロジェクト | オプション]
  2. ターゲットで "すべての構成 - <プラットフォーム>" を選ぶ
  3. バージョン情報を設定する。
  4. プラットフォームを追加しているのなら、同様に "すべての構成 - <プラットフォーム>" を繰り返す。
  5. プロジェクトを保存する。
 "すべての構成 - <プラットフォーム>" を設定していないと、"<ビルド構成> - <プラットフォーム>" をいくら設定してもバージョン情報は変化しないようです (当方では、Win32-Debug だけは変化します)。

 上の画像の構成だと、

 の設定行い、すべてのプラットフォームすべてのビルド構成でロケールを日本語にする事ができました。設定すべきは "すべての構成 - <プラットフォーム>" です (ふーさんの設定の場合は "すべての構成( - すべてのプラットフォーム)" を変更します)。

 なんでこうなってしまうかと言うと、バージョン情報の設定が正しくオーバーライトされていないからです。他のプロジェクトオプションのように、"継承する" というチェックボックスがあれば混乱せずに済んだと思うのですが...。

 正直、「ビルド構成毎にバージョン情報を変える事はないよね?」 と思います。プラットフォーム毎までで充分でしょう。事実、プラットフォーム毎のバージョン情報はちゃんと管理できます。だったら、[ターゲット] コンボボックスの下 6 つ (画像と同じ構成の場合) さえ削除してしまえば (表示しなければ)、殆どの問題は解決するように思えます。それでも、"継承する" チェックボックスがないため、一度間違って設定してしまうと、やはり *.dproj を直接編集しなくてはなりませんが。

 ふーさんの設定は、"プラットフォームに関係なく同一のバージョン情報を使う" 設定で、ここで紹介した設定は "プラットフォーム毎に異なるバージョン情報を使う" 設定です。いずれも、先に、"<ビルド構成> - <プラットフォーム>" を作ってしまったり、"<ビルド構成> - <プラットフォーム>" に対して設定してしまうと、やっぱりおかしな事になります。

・ 続・バージョン情報の件 (XE2)
 au2010 さんより、「それはいいけど、リソース自体は英語だよ?」 とのツッコミを頂きましたので、リソース自体を無理矢理日本語にする "CGRC Wrapper" を作ってみました。

  1. cgrc.exe にラッパー exe を被せ、
  2. ラッパーの中で *.vrc を書き換え、
  3. オリジナルの cgrc.exe (_cgrc.exe) を呼びます。
 ...故に、面倒な作業は不要です。リソースファイル (*.vrc) は au2010 さんの記事ベースで改変されます。

 <!> 説明書はちゃんと読んでください <!> 読まずに cgrc.exe を上書きするとヒドイ事になりますよ。


11/09/23

・ バージョン情報の問題 (XE2)
 話をややこしくしているのは、"バージョン情報の問題は大きく分けて 2 つある" という事です。

 前者はなんとかなりますが、後者はどうにもなりません。これは *.vrc の生成/コンパイルプロセスにあります。
  1. [ビルド] を実行する。
  2. Borland.Build.Tasks.Shared.dll が呼ばれ、*.vrc がテンポラリ的に生成される (ファイル形式は UTF-8)。
  3. *.vrc が cgrc.exe 経由で rc.exe によりコンパイルされる。
  4. *.res が生成される。
  5. *.vrc が削除される。
  6. (ビルドイベントのビルド前イベントはココ)
  7. 本体のビルドプロセスが実行される。
 つまり、都度 *.vrc が生成されるため、事前に *.vrc を用意しておく事が不可能な訳です...もちろん、事前にリソースファイルを自前で生成してリンクすればいいのですが、ビルド番号等はその都度手作業で書き換えなくてはなりません。

・ *.vrc にある問題 (XE2)
 いくつかあります。

 デフォルトで吐かれる *.vrc はこのようなものです。

/* ----- VS_VERSION.dwFileFlags ----- */
#define VS_FF_DEBUG             0x00000001L
#define VS_FF_PRERELEASE        0x00000002L
#define VS_FF_PATCHED           0x00000004L
#define VS_FF_PRIVATEBUILD      0x00000008L
#define VS_FF_INFOINFERRED      0x00000010L
#define VS_FF_SPECIALBUILD      0x00000020L

/* ----- VS_VERSION.dwFileOS ----- */
#define VOS_UNKNOWN             0x00000000L
#define VOS_DOS                 0x00010000L
#define VOS_OS216               0x00020000L
#define VOS_OS232               0x00030000L
#define VOS_NT                  0x00040000L
#define VOS_WINCE               0x00050000L

#define VOS__BASE               0x00000000L
#define VOS__WINDOWS16          0x00000001L
#define VOS__PM16               0x00000002L
#define VOS__PM32               0x00000003L
#define VOS__WINDOWS32          0x00000004L

#define VOS_DOS_WINDOWS16       0x00010001L
#define VOS_DOS_WINDOWS32       0x00010004L
#define VOS_OS216_PM16          0x00020002L
#define VOS_OS232_PM32          0x00030003L
#define VOS_NT_WINDOWS32        0x00040004L

/* ----- VS_VERSION.dwFileType ----- */
#define VFT_UNKNOWN             0x00000000L
#define VFT_APP                 0x00000001L
#define VFT_DLL                 0x00000002L
#define VFT_DRV                 0x00000003L
#define VFT_FONT                0x00000004L
#define VFT_VXD                 0x00000005L
#define VFT_STATIC_LIB          0x00000007L

1 VERSIONINFO LOADONCALL MOVEABLE DISCARDABLE IMPURE
FILEVERSION 1, 0, 0, 0
PRODUCTVERSION 1, 0, 0, 0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
{
 BLOCK "StringFileInfo"
 {
  BLOCK "040904E4"
  {
   VALUE "FileVersion",  "1.0.0.0\000\000"
   VALUE "ProductVersion",  "1.0.0.0\000\000"
  }
 }
 BLOCK "VarFileInfo"
 {
  VALUE "Translation", 411, 1252
 }
}

MAINICON ICON "c:\\program files (x86)\\embarcadero\\rad studio\\9.0\\bin\\delphi_PROJECTICON.ico"
1 24 "c:\\program files (x86)\\embarcadero\\rad studio\\9.0\\bin\\default_app.manifest"
PLATFORMTARGETS RCDATA {1}

 少なくとも赤字の部分は正しくありません。"CGRC ラッパー" は au2010 さんの記事をベースに *.vrc を以下のように改変します。

(前略)

/* ----- VS_VERSION.dwFileType ----- */
#define VFT_UNKNOWN             0x00000000L
#define VFT_APP                 0x00000001L
#define VFT_DLL                 0x00000002L
#define VFT_DRV                 0x00000003L
#define VFT_FONT                0x00000004L
#define VFT_VXD                 0x00000005L
#define VFT_STATIC_LIB          0x00000007L

#define LANG_JAPANESE           0x11
#define SUBLANG_DEFAULT         0x01    

LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

1 VERSIONINFO LOADONCALL MOVEABLE DISCARDABLE IMPURE
FILEVERSION 1, 0, 0, 0
PRODUCTVERSION 1, 0, 0, 0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
{
 BLOCK "StringFileInfo"
 {
  BLOCK "041104B0"
  {
   VALUE "FileVersion",  "1.0.0.0\000\000"
   VALUE "ProductVersion",  "1.0.0.0\000\000"
  }
 }
 BLOCK "VarFileInfo"
 {
  VALUE "Translation", 0x411, 1200
 }
}

(後略)

・ CGRC ラッパー
 cgrc.exe が実際に *.vrc をコンパイルしている (正確にはちょっと違います。"79.Unicode な文字列リソースを含んだリソースファイルを作るには? (2009 以降)" を参照して下さい) のなら、「cgrc.exe のラッパーで *.vrc を改変し、それをオリジナルの cgrc.exe に渡せばいい」 的な考え方なのが、この "CGRC ラッパー" です。

 小さなコンソールアプリケーションですので、以下に全ソースを公開します。

{******************************************************************************}
{* cgrc.exe ラッパー                                                          *}
{******************************************************************************}
program cgrc;

{$APPTYPE CONSOLE}

uses
  Classes,
  Windows,
  SysUtils;
var
  i, Idx: Integer;
  FileName, CmdLine, Dmy: string;
  SI: TStartupInfo;
  PI: TProcessInformation;
  dExitCode: DWORD;
  SL: TStringList;
begin
  try
    // *.vrc がパラメータに渡されているかをチェックする
    // (テンポラリの *.vrc は *.tmp というテンポラリファイル名で生成される)
    FileName := '';
    for i:=1 to ParamCount do
      if Pos('.tmp', ParamStr(i)) > 0 then
        begin
          FileName := ParamStr(i);
          Break;
        end;

    // *.vrc がパラメータに渡されていたら、*.vrc を読み込み、
    // 言語やロケールが英語/米国になっている部分を書き換える。
    if FileName <> '' then
      begin
        SL := TStringList.Create;
        try
          // *.vrc を UTF8 で読み込み
          SL.LoadFromFile(FileName, TEncoding.UTF8);
          Dmy := SL.Text;
          // 言語/ロケールを置換
          Dmy := StringReplace(Dmy, '"040904E4"', '"041104B0"', [rfReplaceAll]);
          Dmy := StringReplace(Dmy, '"Translation", 409, 1252', '"Translation", 0x411, 1200', [rfReplaceAll]);
          Dmy := StringReplace(Dmy, '"Translation", 411, 1252', '"Translation", 0x411, 1200', [rfReplaceAll]);
          SL.Text := Dmy;
          // 言語指定の追加
          Idx := -1;
          for i:=0 to SL.Count-1 do
            begin
              Dmy := SL[i];
              if Pos('1 VERSIONINFO ', Dmy) > 0 then
                begin
                  Idx := i;
                  Break;
                end;
            end;
          if Idx <> -1 then
            begin
              SL.Insert(Idx + 0, '#define LANG_JAPANESE           0x11'   );
              SL.Insert(Idx + 1, '#define SUBLANG_DEFAULT         0x01'   );
              SL.Insert(Idx + 2, ''                                       );
              SL.Insert(Idx + 3, 'LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT');
              SL.Insert(Idx + 4, ''                                       );
            end;
          // *.vrc を UTF-8 で保存
          SL.SaveToFile(FileName, TEncoding.UTF8);
        finally
          SL.Free;
        end;
      end;

  // オリジナルの cgrc.exe (_cgrc.exe) を用意する
  CmdLine := StrPas(GetCommandLine);
  CmdLine := StringReplace(CmdLine, 'cgrc.exe', '_cgrc.exe', [rfIgnoreCase, rfReplaceAll]);

  // CreateProcess() でオリジナルの cgrc.exe (_cgrc.exe) を呼び出す
  UniqueString(CmdLine);
  GetStartupInfo(SI);
  SI.dwFlags     := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(CmdLine), nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then
    begin
      WaitForSingleObject(PI.hProcess, INFINITE);
      GetExitCodeProcess(PI.hProcess, dExitCode);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread );
      System.ExitCode := dExitCode; // 終了コードを返す
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

 Delphi 2009 以降でコンパイルできると思います (TEncoding を利用しているため、ANSI 版 Delphi ではコンパイルできません)。動作の詳細はコメントを参考にして下さい。置換されないものがあったり、不具合があった場合には自由に改変してお使い下さい。

 追記: EXE のタイムスタンプが "2011年9月23日、3:51:53" 以前のものをお使いの方は、新しいアーカイブを再度 DL して下さい。

・ ビルドタスク (XE2)
 Delphi は $(BDS)\bin にある CodeGear.Common.Targets (XML です) の記述を元にビルドタスクを実行します。*.vrc を生成しているタスクは "CreateRcFile" で、本体のアセンブリ (.NET の DLL) は $(BDS)\bin\Borland.Build.Tasks.Shared.dll です。

 au2010 さんの "バージョン情報の問題 その2" という記事内では、「CodeGear.Common.Targets の *.vrc 生成タスクを自前のアセンブリ (RCCreateTask.dll) で置き換えてしまえ」 という考え方で、*.vrc の問題を解決しています。


11/09/26

・ ビルド構成別のプロジェクトオプション (XE2)
 バージョン情報の問題と同じように、アプリケーションアイコンもビルド別に管理されます...つまり、気を付けないと "リリースとデバッグで違うアイコンになる" 事があります。

 ターゲットプラットフォームが追加されたため仕方のない事なのかもしれませんが、一度設定してしまうと、*.dproj を手動で修正しない限り、アイコンの更新に気を遣う事になります。これまた、"継承する" のチェックボックスがあれば解決しそうですけどね。IDE の UI が変わっちゃうので XE2 では追加されないんだろうな...チェックボックス。

・ 実は使い道がない?TRectAnimation (XE2)
 TAnimation は、基本的にコントロールの子コントロールとして動作します。TRectAnimation も当然子コントロールとして動作するのですが、普通のコントロールには Published な TBounds 型のプロパティは Margins と Padding しかありません。これらをアニメーションさせる事は殆どないでしょう。

 ちなみに、コントロールに TRectAnimation を追加するには、ツールパレット / コンポーネントツールバーから TRectAnimation を選択し、目的のコントロールの上にポトリペタリします。アニメーションさせるプロパティは PropertyName で選択できます。

 TRectAnimation でやりたい事と言ったら、まず最初に考えるのがコントロールのサイズ変更です。コントロールの中心を拡大縮小点としてマウスオーバーしたら伸び縮みするアニメーションをやろうとすると、TRectAnimation は使えず、TFloatAnimation を 4 つ (Position.X / Position.Y / Width / Height) 使って実現する事になります。

 考え方を変えて、Scale プロパティで伸び縮みさせるとしましょう。この場合、TFloatAnimation が 2 つ (Scale.X / Scale.Y) 必要となります。4 つよりはいくらかマシですが、実は拡大縮小点が (0,0) にあるのでこの方法でもうまくいきません。

 BoundsRect プロパティは TBounds 型ではないし、Published でもないのですよねぇ...デモプログラムにも TRectAnimation はありませんし、一体何に使えるのでしょう?


11/09/28

・ Update 1 for Delphi XE2, C++Builder XE2 and RAD Studio XE2 (XE2)
 リリースされました。

 "C++Builder XE2 単体だと、Delphi ユニットがコンパイルできない件" とかが修正されています...が、"FireMonkey 3D の GLScene にまつわる問題" を修正 (回避) するのが主な目的のようですね > Update1。

・ Composer じゃなくて Nvu じゃなくて KompoZer じゃなくて BlueGriffon
 WYSIWYG な HTML エディタ。むしろ "ドキュメントライター" として使ったほうがいいかもしれません。日本語にも対応しています。環境によっては "Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)" が別途必要となります。

 "青いグリフォン" か。"黒いグリフォン" ならパトレイバーに...(以下略)


11/09/29

・ ブラウザ用検索エンジンプラグイン
 このサイトには "Delphi の製品情報" というページがあり、左下には

 という Google カスタム検索が用意されています。前者がエンバカさんの日本語情報を検索するカスタム検索で、後者が Delphi / C++Builder ユーザのサイトのみを登録した (ノイズの少ない) カスタム検索です。

 誰も気付いていないようなので自分でバラしますが、Firefox で "Delphi の製品情報" に行くと、検索バーにこれらのカスタム検索を追加できます。

 ...こんな感じで。 IE / Firefox でマニュアル登録するには以下のリンクをクリックして下さい。

 意外に便利ですよ。


11/09/30

・ Delphi XE2 特別バージョンアップ (2007~XEユーザー向け)
 本日までのキャンペーンです。購入先は 09/01 の雑談にまとめてあります。

 なお、このキャンペーン期間中に購入した方は、価格面以外に 2 つの特典があります。

 FastCube についての詳細はこちらで。

 キャンペーン期間中の購入者は、このキャンペーンが終了して 2 週間 (2011/10/14?) 迄の間であれば "FastCube Embarcadero Edition (CodeCentral)" から FastCube を DL する事ができます。

・ IRQ の競合をどうにかする (Linux)
 現在の Windows では "IRQ の競合" で悩む事はもうあまりないとは思いますが、Linux ではまだ悩まされる事があります。最近の PC はイロイロなものがオンボードで備わっているので、これらがカチ合ってしまう事があり、例えば "数時間するとネットワークが死ぬ" といった現象が起きます。今の Windows だとデフォルトで "IRQ 共有" が有効ですし、大抵の場合それがうまく動作します。

 BIOS で不要なペリフェラルを無効にしたり、PCI に何かのカードを挿しているのならスロットの位置を変更したりすれば解決する事もあるのですが、それでも解決しない事があります。そもそも、ペリフェラルを無効にできない事情があったりするかもしれません (競合しているのが USB で、これを無効にすると USB が使えなくなる、等)。

 そんな時は Linux 起動時のオプションに "irqpoll" を加えてみましょう。これでしばらく様子を見て問題が解決したのなら、/boot/grub/grub.conf を編集し、起動オプションに "irqpoll" を追加して再起動します。


 BACK   古いのを読む   新しいのを読む