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

11/06/01

・ 続・RAD Studio XE ジャンプアップ・キャンペーン
 Rad Studio 限定のキャンペーンに縮小継続。今月末迄で、単体版はありません。

 アップグレード版ではありませんので、Delphi 1 ~2006 ユーザでも購入可能です。

 TMS Smooth Controls for Delphi and C++Builder XE は 4 月の時点で DL 可能だった気が?

・ Delphi で "AT フィールド" を発生させる。
 とても簡単。新規アプリケーションを作成して、クラスの Private とかに "AT: string;" とか書いて、マウスオーバーさせるだけ。

 ハイ、"AT フィールド" が発生しましたよ、と (w


11/06/02

・ 64bit 版 TEADLOAD
 "TEAD で開く" を Explorer のコンテキストメニューに登録するシェル拡張の TEADLOAD ですが、それの 64bit 版をM&Iさんに作って頂きました。

 ご覧の通りです。Win9x 版 / 32bit 版 / 64bit 版を再アーカイブして同名でアップしてあります。

 64bit 版 Windows 7 には 32bit 版 Explorer がないため、シェル拡張を使う事ができませんでした。シェル拡張を行う DLL を作ろうとすると 64bit DLL でなくてはなりません。Windows 7 には一般に使えるサンク機構がないため、64bit アプリから 32bit DLL を呼び出す方法、またはその逆を行う方法はありません (嘘くせぇ方法で 64bit アプリから 32bit DLL を使う事はできます)。

 で、この DLL は Pulsar...はまだなので、Lazarus (with Free Pascal) で作られています。日本語の扱いにとても苦労されたようですが (Lazarus を使ってみれば解ります)、ちゃんと日本語で表示されています。多謝!!

・ 続・"AT フィールド"
 一部の人には喜んで (?) 頂けたようで何よりですが、実はこの件を知った時にクラスの "メンバ" を表示できないものかと躍起になって探しておりました。何故って、

"稲垣 メンバ"

 を表示させるためですがな...徒労に終わりましたが。律儀に "プロパティ" とか "イベント" とか "メソッド" って表示しなくていいのに...orz

・ ONKYO TW シリーズ値下げ?
 ONKYO DIRECT での価格が下がっている。

 しかも送料込か。TW217A5 の後継機は出なかったので投げ売り価格なのかも。下位機種の方が高いってどういう事よ?


11/06/03

・ 古いコンポーネントに Touch プロパティと OnGesture イベントを追加するには?
 例えば、古いコンポーネントとかをジェスチャ対応にしたいとする。ジェスチャを使いたいのなら、下位クラスで...

  ...
  published
    ...
    property Touch;
    ...
    property OnGesture;
    ...
  end;

 このように Published にて再定義すればいい。

 上記をやったにも関わらず、"ズーム / 回転等は動作するが、Touch.GestureManager に割り当てられた機能が動作しない" 場合がある。この際には、親コントロールを辿っていって...

    procedure CMGestureManagerChanged(var Message: TMessage); message CM_GESTUREMANAGERCHANGED;

 このようなメッセージ処理が存在しないのなら、StdCtrls.pas の TCustomEdit.CMGestureManagerChanged() のコードを丸パクリして実装するとうまく動作するようだ。

・ Windows 8
 Windows 8 の UI は面白いが、JavaScript + HTML5 ベースなのか。

 そうなると Active Desktop -> Windows サイドバー (Vista 以降) -> Metro UI ってのが流れかな?従来は Explorer の中に Active Desktop なり Windows サイドバー があったのが、逆に Metro の中に Explorer が内包されるようなイメージだな...本当のトコはよくワカンナイけど。

 Windows 95 以来デスクトップ環境であり続けた Explorer がいよいよその主役の座を降りる...のか?てか、どうでもいいけど ARM って 32bit の CPU だよね?

・ World IPv6 Day
 X-Day は 2011/06/08。Yahoo! にも特設サイトがある。てか、場合によっては業務に支障をきたすヒトがいるんじゃないのか?


11/06/04

・ "ソースを改変する事にハマってしまうのがプログラミングに携わる者の悲しい性"
 折角なので、どういう風に改変したのか比較してみましょう。

 順を追って説明します。

  1. ブロックの色が SEGA TETRIS 準拠になっている
    日本人ならコレですよ、やっぱ。ブロックの色については Wikipedia を参照して下さい。

    const
      PIECE_I  = 1;
      PIECE_J  = 2;
      PIECE_L  = 3;
      PIECE_T  = 4;
      PIECE_Z  = 5;
      PIECE_S  = 6;
      PIECE_O  = 7;

    カラーテーブルのインデックスとブロック (テトリミノ) の種類の関係はこうなっています。
  2. 背景画像が追加されている。
    TImage を貼って、

    上記のように設定し、240×480 の背景画像を読み込ませてあります。
  3. ブロックが 3 つの色をベースにして描かれている
    まず、ブロックの色を設定し、GraphUtil.GetHighLightColor() と GraphUtil.GetShadowColor() でブロック色のハイライト色 / シャドウ色を取得してあります。
  4. ブロックがグラデーションで描かれている
    GraphUtil.GradientFillCanvas() でブロックをグラデーション (ブロックの色とハイライト色のグラデーションです) で描き、シャドウ色で影を付けてあります。
  5. ガイドブロックが描かれている
    いわゆる "枠" ですね。
  6. Next ブロックが描かれている
    Next ブロックが 3 個表示されます。
 Delphi 標準の機能しか使っていませんが、ちょっとした改変で随分印象が違うものです。

 ...おっと、このテトリスが何の事か解らないヒトは 2011/05/28 の雑談を参照して下さい。


11/06/06

・ UFO があっち行ってこっち行って落っこちる日
 このトピックは訳あって 06/09 に書いております。

 この日は大抵このネタです (w


11/06/08

・ ダイソーの表面保護フィルム
 スレート PC 絡みの案件はデモをやんなきゃいけなくて、先日やっとこさそのデモは終えたのですが (本当は先月のハズだった)、実際に触ってもらっていて感じたのは、"ダイソーのフィルムは滑りが悪い" という事です。

 開発中はガシガシ触るため、ダイソーの表面保護フィルムを使っておりましたが、ツルペタなので指が滑らずにつっかかってしまう事がありました。マルチタッチじゃなければ問題ないのですが、指を滑らせる操作がある場合には高くても専用のフィルムの方がいいみたいです。梅雨時期だと湿気も多いので余計に滑りにくいのかもしれません。"窓ガラスを指でなぞってつっかかるような感じ" と言えば理解して頂けるでしょうか?

 ダイソーの表面保護フィルムが悪いような書き方になってしまいましたが、表面保護フィルムを貼らなくてもツルペタなのでどのみち同じ事なのですよね。表面保護の観点から見れば、ダイソーの表面保護フィルムはコスパ最高です。ちょっと試していないのですが、ダイソーの表面保護フィルムにシリコンスプレーで表面コーティングするといいのかもしれません...が、そうなるとスレート PC を落っことすヒトが続出しそうで怖いです。

・ 社内レビューの結果を踏まえて
 社内レビューやって、最終的にデモを行った画像ビュアーがコレです。画像回転と、画像回転のジェスチャに対応していたり、その他にもちょっとした改変が行われています (縮小時の画質改善等)。

 えー...何故、画像回転があるのかについてですが、「できないと思われるのがシャクだった」 というだけです。案の定、3 軸は混乱するようでした ("画像回転 + 本体回転" か、"スクリーン回転 + 本体回転" のいずれかで、3 軸でマトモに操作した方は皆無)。 軸がどうとかという話については、スレート PC プログラミングの "UI と画面の向き" を参照して下さい。

 一応断っておきますと、この画像ビュアーはシステムの一部でしかありません。デモをしたのはコレを含めたシステムです...まぁ、当然ですけどね。

・ いつぞやの。
 Microsoft の "タッチ対応アプリケーション技術情報" には、いつぞやの "Windows 7 マルチタッチ対応アプリケーション開発者会議" 参加者の方が作成されたアプリケーションが紹介されています。


11/06/11

・ デモ。
 先日のデモが好評だったのかどうかは定かではありませんが、お客さんにやったデモをその得意先も交えて再度やる事になりました...私は別件でデスマなので不参加なのですが。

・ TurboPower プロジェクト
 現状を調べてみました。有名な製品だったとは言え、ANSI 版 Delphi 用でしたので敬遠していたのですが...?

 Delphi 6 よりも前の環境は省略しています。詳細はふーさんの過去の記事を参照してください。

 Unicode 対応しているものは、逆に古い Delphi でコンパイルしようとすると多少の修正が必要となるようです (古い Delphi に存在しないメソッドが使われていたり、{$IF CompilerVersion } でエラーになったりします)。Delphi 2007 辺りだとあまり修正が必要ないようですね。

・ メールアドレス
 ずーっと使ってるといい加減スパムがウザイ (そもそも Nifty が広告送ってくるし) ので、メアドを変更する事にしました。流石にあちこちに登録してるので、いきなり変更する訳には行かず、今月末を目処に順次変更しようかと思っています。

 このサイトも Nifty から移行して結構経つので、ついでに Nifty もやめようかと思ってます...微々たるもんですが、メアドのためだけに月額料金払うのもアレですしね。


11/06/12

・ どーんしてみたら?
 お題に深い意味はない。さて、Windows の標準コントロールというのは昔から実に垢抜けないのだが、業務系アプリとかでは別に問題ではなかった。むしろ変に色を付けたりすると目が疲れるし、パステルカラー使っちゃうと場合によっては「ウチの社員/職員には弱視のものがおりまして...」 と言われる事もある。ハイコントラストに一気に対応させようとすると OS 標準の機能を使った方がいいし、そうなると標準のコントロール以外は使いづらくなってしまう。

 ...ところがだ。スレート PC では標準のコントロールは使いにくくてしょうがない。マウスじゃないととても使えないようなものが多い。指で隠れたら何やってんのかワカンナイようなコントロールは必然的に使うのを避けるので、ぶっちゃけ Delphi の Standard ページにあるもの位しか使えない...コンボボックスもアヤシイなぁ。

 スレート PC ではマウスオーバーへの対応と、タブストップへの対応は意味がないので、ボタンは画像でいいと思う。あとは入力コントロールだが、せめてエディットボックスの角くらいは丸くできんものかと思う。13年前の雑談にあるコードを使って、

var
  Rgn: HRGN;
begin
  Rgn := CreateRoundRectRgn(0, 0, Edit1.Width, Edit1.Height, 10, 10);
  SetWindowRgn(Edit1.Handle, Rgn, True);
end;

  

 「うん、見事に角が削れたね」...いや、やりたいのはそうじゃないんだよね (w

 ハイライト/シャドウの枠が削られただけだし、ジャギってて御世辞にも綺麗とは言えない。やりたいのはさ、

 こんなのを、どーんすると、

 キレイに "アンチエイリアスの掛かった枠" が表示される、と。タブストップは要らないけど、選択されたフィールドはハイライトされた枠になるといいねぇ。フォームをリサイズしても、

 ちゃんと追従するとさらに Good (スレート PC ではフォームのリサイズとかはあまりないだろうけど)。画像を使うとリサイズがある時に困るのよね。Edit2 は akRight のアンカーが指定されてなくて、Edit3 はどーんされない比較用。

 ...なお、上記画像は "イメージ" でも "ハメコミ" でもない。以下全ソース。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  StdCtrls, ExtCtrls, Direct2D, D2D1;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    procedure FormPaint(Sender: TObject);
    procedure Edit_Enter(Sender: TObject);
    procedure Edit_Exit(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure DrawRadiusEdit(aCanvas: TDirect2DCanvas; aEdit: TEdit);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Anchors := Edit1.Anchors + [akRight];
  Edit1.BevelInner  := bvNone;
  Edit1.BevelOuter  := bvNone;
  Edit1.BorderStyle := bsNone;

  Edit2.BevelInner  := bvNone;
  Edit2.BevelOuter  := bvNone;
  Edit2.BorderStyle := bsNone;

  Edit3.Anchors := Edit3.Anchors + [akRight];

  Button1.Tag := 1;
  Edit1.SetFocus;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  D2DCanvas: TDirect2DCanvas;
begin
  if Button1.Tag = 0 then
    Exit;
  D2DCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
  try
    D2D1RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT);
    with D2DCanvas do
      begin
        RenderTarget.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
        RenderTarget.BeginDraw;
        DrawRadiusEdit(D2DCanvas, Edit1);
        DrawRadiusEdit(D2DCanvas, Edit2);
        RenderTarget.EndDraw;
      end;
  finally
    D2DCanvas.Free;
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.Edit_Exit(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.Edit_Enter(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.DrawRadiusEdit(aCanvas: TDirect2DCanvas; aEdit: TEdit);
const
  PEN_WIDTH = 6;
  CURVE_RADIUS = 10;
var
  RRect: TD2D1RoundedRect;
begin
  aCanvas.Brush.Style := bsSolid;
  aCanvas.Brush.Color := aEdit.Color;
  aCanvas.Pen.Width   := PEN_WIDTH;
  if aEdit.Focused then
    aCanvas.Pen.Color   := clWebOrange
  else
    aCanvas.Pen.Color   := clGray;
  RRect.rect.left   := aEdit.Left - CURVE_RADIUS;
  RRect.rect.top    := aEdit.Top  -  PEN_WIDTH;
  RRect.rect.right  := aEdit.Left + aEdit.Width + CURVE_RADIUS;
  RRect.rect.bottom := aEdit.Top  + aEdit.Height;
  RRect.radiusX     := CURVE_RADIUS;
  RRect.radiusY     := CURVE_RADIUS;
  aCanvas.DrawRoundedRectangle(RRect);
  aCanvas.FillRoundedRectangle(RRect);
end;

end.

 ビバ! Direct2D。以前、文字コード絡みの時も「XP なんて、とっとと使われなくなってしまえばいいのに」 と暴言を吐いたけれど、Direct2D の面からも同じ暴言を吐きたい気分。業務系アプリだと XP はおろか、未だに 2000 での動作をお願いされる事があるのよねぇ...GDI+ ですらアヤシイという...orz

 スレート PC でのプログラミングが楽しく感じるのは、"縛りがないから" なのだろうなと思っております。

・ TMS Smooth Controls Pack
 正直、見栄えの問題だけだったら、TMS Smooth Controls Pack を買った方が早い。同じようなものを作るには相当な時間が掛かるハズだからだ。無償で利用できる

 バンドル版でも結構使えるのが揃っている。描画に GDI+ を使っていたハズなのでキレイなのはキレイだが、若干動作がもっさりする。それでも Windows XP で動作するのは大きなメリットだ。

・ 縛りがなければ使えるようになるもの。
 思いつくものだけで...

 UI に関係するものは省略気味です。それでもまだあった気がしますが...。アニメーションウィンドウは、

procedure TForm1.FormCreate(Sender: TObject);
begin
  AnimateWindow(Handle, 400, AW_CENTER);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  AnimateWindow(Handle, 400, AW_CENTER or AW_HIDE);
end;

 こんな感じですね。やりすぎるとウザいです。古いパソコンを破棄してくれるとプログラミングも随分楽になるんだけどなぁ...。"見栄えをよくしつつ古い Windows でも動作する" ようにするには OS と独立した GUI のレイヤー が必要になるのよねー。それこそ .NET 3.0 の WPF みたいなのが。

 これを見てもなお 「Windows 7 のスレート PC?Windows XP だろ常考」 とか言っちゃうヴァカが居るんでしょうかねぇ?


11/06/13

・ Delphi の Tips
 最近、色関係をやったので Tips に軽くまとめてみました。

・ Windows API リスト
 つい最近の事だけれど、Windows API リストが Microsoft から公開されました。Delphi / C++Builder 使いには朗報です。目的別に整理されているので見やすいです...てか、10 年前に欲しかったよ Microsoft さん。


11/06/14

・ Delphi の Tips
 Microsoft さんに Windows API リストはできたけど、相変わらず WM_系のメッセージは英語のままなのよね。C++ のイベントハンドラの方を日本語訳するくらいなら、メッセージの方を日本語訳した方がいいと思うんだけど...本末転倒じゃね?

 てな訳で。

 を Tips に追加してみました。空欄多いですけど、気になったら各自調べてみて下さい。

 Window Message 関係は、

 で、大抵どうにかなってたんだけどなぁ...最近英語ばっかり読んでる気がする。WM_TABLET_FLICK でググル先生に訪ねて日本語のページだけにしてみると、引っかかるのがエンバカさんのサイトと、当サイトだけって時点で...orz。


11/06/15

・ Delphi の Tips
 先日、TurboPower の雑談を書いたので、TurboPower Abbrevia の Tips を書いてみました。

 最近、忙しくて雑談が小粒気味ですね...ゴメンナサイ (誰に?)。

 それと、先日書いた Tips、"124.Delphi で使える色" には、HLS でソートして分類した色リストが追記されています。


11/06/16

・ HLS 色空間
 "124.Delphi で使える色" で書いている RGB -> HLS 変換関数を使うと ペイントブラシ (Windows 7) の色選択ダイアログで使われているカラーピッカーのような UI を作ることができます。

 X 軸が Hue (色相) で 0~239 の範囲です。Y 軸が Saturation (彩度) で 0~239 の範囲です。スライダーは Luminance (輝度≒メイドさん明度) となります (これまた 0~239)。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GraphUtil, ExtCtrls, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Max := 239;
  TrackBar1.Position := 119;
  DoubleBuffered := True;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  H, S: Integer;
  RGB: TCOLORREF;
begin
  for H:=0 to 239 do
    for S:=0 to 239 do
      begin
        RGB := ColorHLSToRGB(H, TrackBar1.Position, S);
        SetPixel(PaintBox1.Canvas.Handle, H, 239 - S, RGB);
      end;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Invalidate;
end;

end.

 短いのでソースコードも載せておきますね。なお、Paint.NET のカラーピッカーは HLS 色空間ではなく HSV 色空間となっていますのでご注意。


11/06/21

・ 戦々恐々
 本日から IE9 が Windows Update 経由で公開されます。

・ Firefox 5
 本日は Firefox 5 公開日です (ただし深夜)。ベータではなく正式版です。以降、原則 6 週間のリリース頻度となるようです。

・ Kinect SDK beta
 公開されています。.NET 4.0 必須っすか...うーん。Delphi だと TKinect for Delphi ですかね。

・ TMS がアリなら...
 AlphaControls Lite Edition もアリですな。

  

 Lite Edition はソースコードこそ付属しないものの、Delphi 5~XE で使え、使用制限がありません。

・ スレート PC プログラミングの続き
 WM_TOUCH とかセンサー/ロケーションもやりたいのですが評価用としてお客さんに貸出中 (借られ中とも言う) でして、現在何も出来ない状態です。そもそも別件の仕事があるので "それどころではない" というのもありますが。


11/06/22

・ SuperDisk と元麻布春男氏
 氏はかつて SuperDisk マニアだった。僕も SuperDisk を所持していて、LSEject なんてツールを作った事もある (純正のドライバはこちら) ため、シンパシーを感じる所があった。

 氏については、記事が提灯だと言われたりもしたが、 

 Intel 関連以外については割と冷静な判断がなされているように思う。それにしても、逝くにはちょっと早すぎだ。

・ QC#78903
 高橋さんから指摘があった。この QC は Delphi XE Update 1 にて Fix されている模様。Tips を書き換えておいた。

・ Tips と言えば...
 "97.ラベルを縦書きにしたい" も追記してあります。


11/06/23

・ COM と Delphi
 正直、Delphi から COM は使いにくい。いあ、COM という技術は簡単に使えるのだが、巷のネイティブコードのサンプルだと C++ な訳で。

 IDL が公開されていれば Delphi でインポートすればいいだけの話なのだが、SensorsAPI.h のように IDL から生成されているにも関わらず IDL が公開されていない事が多いのだ...それって、COM の概念からしたらどうなのよ?と思わなくもない。

 C++ にしたって、COM は ATL から使う事がほぼ前提になっており、事実 MSDN にあるサンプルコードは ATL ベースのものばかりとなっている。つまり、

 Delphi から COM を使うにはこの 2 つの壁を乗り越えなくてはならない事になる。Embarcadero がトランスレートした COM インターフェイスの *.pas はあるにはあるが、(先述のように) それでも Windows のすべてを網羅しているという訳ではない。

 Vista 以降の TSF (XP 以前で言う IMM32 に相当) 絡み も API ベースではなく AIMM (Active Input Method Manager) 同様 COM ベースとなっているが、現行の Delphi では素直には使えない。

  1. Microsoft SDK をインストールする
  2. midl.exe ("%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin" とかにある) を使って IDL から TLB を生成する
  3. Delphi から [コンポーネント | コンポーネントのインポート] - "タイプライブラリの取り込み" を行う
 ここまでやって、初めて Delphi から使えるようになる (100% 完全にトランスレートされる訳ではないが、少なくとも 90% 以上の精度でトランスレートされる)。TSF 関係は IDL が公開されているのでなんとかなるが、センサー API のように C++ のヘッダしかない場合には MSDN をにらめっこしながら、自前でインターフェイスを記述しなくてはならない...正直、こんなのやってらんねぇ。

・ じゃあ、どうすんのよ?
 「Microsoft のアホ!」 としか言いようがありませんが、「助けて!ブラザー!!」 と C++Builder にお願いすればなんとかなります。例えば、センサー API を使って、利用出来るセンサーを列挙するコードは、

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <atl/atlbase.h>
#include <sensorsapi.h>
#include <sensors.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        Memo1->Lines->Clear();
        // センサーマネージャを取り出す為の変数
        CComPtr<ISensorManager> pSensorManager = NULL;
        // 取得したセンサーを格納する為の変数
        CComPtr<ISensor> pSensor = NULL;

        // センサーマネージャの取得
        HRESULT hr = CoCreateInstance(
                __uuidof(SensorManager), NULL, CLSCTX_INPROC_SERVER,
                __uuidof(ISensorManager),
                (LPVOID*)&pSensorManager);

        // センサーコレクション変数
        CComPtr<ISensorCollection> pSensorCollection;
        // 照度センサーを取り出す
        hr = pSensorManager->GetSensorsByCategory(
                SENSOR_CATEGORY_ALL,
                &pSensorCollection);
        if (SUCCEEDED(hr)){
                // 取得に成功したので、複数の候補から所望のセンサーを取り出す
                DWORD count = 0;
                hr = pSensorCollection->GetCount(&count);
                for (DWORD i=0; i<count; i++) {
                        CComPtr<ISensor> pCandidate;
                        hr = pSensorCollection->GetAt(i, &pCandidate);
                        if (SUCCEEDED(hr)){
                                // 例えばフレンドリーネームを条件にする場合
                                BSTR friendlyName;
                                hr = pCandidate->GetFriendlyName(&friendlyName);
                                // 取得したフレンドリーネームを基に比較等を行い、確定
                                Memo1->Lines->Add(friendlyName);
                                pSensor = pCandidate;
                                // 使い終わった変数は解放
                                SysFreeString(friendlyName);
                        }
                }
        }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        CoInitializeEx(NULL, COINIT_MULTITHREADED);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
        CoUninitialize();
}
//---------------------------------------------------------------------------

 サンプルをそのままパクれます。後は、C++Builder で DLL を作るもよし、コンパイルして生成された *.obj を Delphi でリンクするもよし。そういった意味で、同一コンパイラバージョンの Delphi / C++Builder が揃ってリリースされている現状は有り難いです。「今年の C++Builder (64bit) はどうするの?」 とか、意地の悪いツッコミが入りそうですが、"嘘くせぇ方法" で回避できるので多分問題ありません。

 てな訳で、COM に関しては「あ、買ったほうが安いね晩のおかずッ!!」 状態です。手動トランスレートに時間を割かれる位なら、C++Builder の力を借りたほうが早いし、企業であるなら安上がりです。そういえば、ジャンプアップキャンペーンは今月末まででしたね。

 「Delphi でセンサー API 対応してよー」 という要望は既に QC に入れてあるので、同意される方は Vote をお願い致します m(_ _)m

 あ、TSF も QC 入れてたんだった。

・ 素直に .NET 使えば?
 こと、センサー API に関して言えば、.NET は応答性が良くないと Microsoft のエバンジェリストも言っています。


11/06/24

・ 幻のJR九州CM、カンヌ国際広告祭金賞を受賞
 震災直後の自粛ムード真っ只中だったとはいえ、確かに幻にするには惜しい CM だったもんな。

 九州に居ると既視感溢れる CM になっている。「あー、あそこか!」みたいな。

・ スレート PC 絡みでちょっとがっかりした事
 2 点ほど。

 ぇー。

・ "嘘くせぇ方法" とは?
 64bit アプリから 32bit DLL なんかを呼び出す方法の事ですが、別に Pulsar の NDA に引っ掛かる事でもなんでもありません。MSDN に書かれている事です。

 例えば、UNLHA32.DLL をアウトプロセス COM サーバでラップすれば、32bit アプリからも 64bit アプリからも呼び出せます。これをさらに 64bit DLL でラップするもよし。COM でのラップ自体は Delphi そのものでやれるので、IDL がないからどうこうというのはありません。ただ、32bit / 64bit 混在環境では COM を使う頻度が高くなるのは間違いないでしょうね。

 新井さんにもう一冊くらい本を書いてもらいますか...こうなったら (^^;A


11/06/25

・ 3DO
 そういや、アレも ARM プロセッサだったな (w

・ IDL とか TLB とか
 ちょっと補足説明を書こうとしたら、マスターのトコに全部書いてありました (^^;A

 流石はマスター。


11/06/26

・ ハニカムインターフェイス
 実は理にかなっているハニカムインターフェイス。タッチ操作だと、画面の端はタッチしずらいので、四辺の余白はあってもなくても同じです。

 四角形だと四隅はまず押される事がないので領域の無駄です。円だと隙間ができてしまいます。最密充填という意味でハニカムは有効です。それと、X 方向にも Y 方向にも隣接するアイコンとのズレがありますので、視認性がいいです。

 タッチする時は指は斜めになっているハズで、指をまっすぐ立てたり真横にした状態でタッチする事はありませんからね。キーボードがグリッド状に並べられていない事を考えてもこれはアリだと思います。

・ センサー API with Delphi
 おういえ。何処で躓いているのか書いてないと、同じトコで詰まるヒトが出てきそうですな。

 本来なら、先日の C++Builder の例と同等のコードはこのようになるハズです。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  ActiveX, SensorsAPI, Sensors, Sensors2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  hr: HRESULT;
  pSensorManager: ISensorManager;
  pSensorColl: ISensorCollection;
  pSensor: ISensor;
  ulCount: DWORD;
  SensorName: WideString;
begin
  hr := CoCreateInstance(
          CLSID_SensorManager,
          nil,
          CLSCTX_INPROC_SERVER,
          IID_SensorManager,
          pSensorManager);
  if Failed(hr) then
    Exit;

  hr := pSensorManager.GetSensorsByCategory(
          SENSOR_CATEGORY_ALL,
          pSensorColl);
  if Failed(hr) then
    Exit;

  hr := pSensorColl.GetCount(ulCount);
  if Failed(hr) then
    Exit;

  for i:=0 to ulCount-1 do
    begin
      hr := pSensorColl.GetAt(i, pSensor);
      if Failed(hr) then
        Continue;

      hr := pSensor.GetFriendlyName(SensorName);
      if Failed(hr) then
        Continue;

      Memo1.Lines.Add(SensorName);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoInitializeEx(nil, COINIT_MULTITHREADED);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  CoUninitialize;
end;

end.

 コンパイルに必要なファイルは http://ht-deko.minim.ne.jp/software/SensorsAPI.zip にあります。コンパイルは通ります。ですが、GetSensorsByCategory() の所で pSensorColl に nil が返ります (エラーにはなりません)。

 恐らくというか、

 確実にこのいずれかなのでしょうが、サパーリわかりません。エラーになってくれた方がよっぽどデバッグしやすいのですが。まさか、この期に及んで QueryInterface() 使わないと動作しないとかないですよね?

 なお、センサーの付いていない PC をお使いでも Windows 7 である限り "仮想照度センサー" でセンサー API をテストする事ができます。

・ GPGPU プログラミング
 GPGPU による並列処理なら、

 なんてのがあるが、これまた C++ 前提の話...と思ってたら、OpenCL を Delphi から利用しようという試みが行われているらしい。Open CL Pascal なんてのがあったら面白いとは思う (Open CL C だって、どうせ中間言語的なバイナリに落とすのだから)。


11/06/30

・ RAD Studio XE ジャンプアップ・キャンペーン
 しつこいですが、今日までです。

・ @nifty
 やめるのをやめました。今まではデイタイムプラスというコースで、1,260円でしたが、お手軽1コースという 262.5円のコース (なんだい、その 0.5円は) があるので、そちらに変更しました。

 そもそも、Nifty のホームページサービスは "やる気が見られない" ので、そのうち完全に解約するでしょう。ココログに移行する気はありませんしね。


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