(11/11/01~)

11/11/01

StrUtils.SplitString (Delphi XE 以降)
 StrUtils.SplitString() はカンマ区切りの処理の時だけ使っていたのですが、何気に CR+LF を分割するのに使ってみようと思ったのです。そしたら...

 QC 登録するハメになりましたとさ...orz。

Help Update 1 for Delphi, C++Builder and RAD Studio XE2
 リリースされました。新井さんのブログの "Now RAD Studio XE2 help update 1 is available" というエントリーに面白いコメントがありますが、

「こまけぇこたぁいいんだよ!!」

 "従来のローカライズされたドキュメントはもっと gdgd だった事" を知らないのでしょうね。2007 以降で見ても、"一度として英語版ヘルプのコンテンツ量に追いついた事がない" という事実も。麻生元総理の漢字の読み間違いの件を思い出しちゃったよ。成果物で文句を言うならともかく...ねぇ?


11/11/02

Update 2 for Delphi, C++Builder and RAD Studio XE2
 リリースされました (リリースノート)。事前に Update1 を適用しておく必要があります。Update2 を適用した ISO も用意されています。

 修正された項目の一覧はこちら

続・StrUtils.SplitString()
 twitter でツッコミが入ったので確認してみたら、引数 Delimiters はデリミタ (Char) を並べて複数指定するもので、文字列をデリミタとして使えるものではないという事だった。

 やろうとしていた事の代替手段としては、TRegEx.Split() が使えます。


11/11/06

SoftBank X02T (TOSHIBA)
 ...さて、ここに白ロム状態の X02T がある訳だが。

  

 仕事が忙しい時に限って面白そうなオモチャが増えやがる。"面白そう" というのは 「Windows Mobile 的な意味で」 、です (w

 My Mobiler さえ繋がってしまえばこっちのものだ (My Mobiler に関してはアドエスの記事を参照)。


11/11/07

貰った SoftBank X02T はタッチパネルがマトモに使えない
 ...そうでもなけりゃ、貰えないわな (w

 キャリブレーション地獄に陥ったり、全くタッチが効かなかったりするこの X02T だけれど、原因が判った。最初は表面保護フィルムのせいかと思って表面保護フィルムを剥がしてみたのだけれど、余計に状況が悪化してしまい凹んだ。

 けれど、その悪化したことが幸いして、原因を特定する事ができた。

 ここだ。経年劣化により接触不良を起こしているものだと思われる。表面保護フィルムの反りにより、バイメタルみたいな感じで抵抗膜ごと剥がれてしまったのだろう。抵抗膜と端子部分は導電性シリコン?で接続されているが、ここがダメになっている模様。X02T でキャリブレーション地獄に陥っている方は、この部分を強めに押さえながらキャリブレーションしてみるといいかもしれない。

 理屈からして、表面保護フィルムを剥がす時に、抵抗膜ごと剥がしてしまうとタッチパネルの動作に異常をきたす可能性が高いので注意。貼る時も気泡を過度に恐れて、フィルムを反らしながら貼るのはやめておいた方が良さそうだ (特に厚めのフィルムの場合には)。多分、タダ同然で簡単に修理する事ができると思うが、仕事せないかんので続きは後日。

矛盾
 Delphi で仕事してるのに、Delphi 関係の話題を雑談で書けないこの矛盾...。守秘義務とかそういうのじゃなくて、当たり前の事しかやっていないので "書くべきものがない" という事。

 実験やったり調べ物をしている時にはネタを拾えるのだけれど、忙しくて実装しかやっていない時は本当にネタがない。


11/11/08

Delphi アプリケーションで ActiveSync (Windows Mobile 同期センター) 中の Windows CE / Mobile 機へファイルをコピーするには?
 そういやあったよ、Delphi ネタ。元ネタは Delphi Q&A 掲示板の "windowsCEへのコピー" です。

 Delphi で、ActiveSync 中の Windows CE / Mobile 機へファイルを転送するには、RAPI を使います。CodeCentral に RAPI の定義ユニットがアップされていますので、これを使うのが簡単でいいでしょう。

 必要なのは、アーカイブ中の RAPI.pas と RAPI2.pas だけです。

 コメ欄にもありますが、ちょっとした RAPI.pas の修正が必要です。

 Unicode 版 Delphi で使うためには以下の修正も必要です。

  ...

  //added 10/16/2000 - Terence Goggin; terencegoggin@hotmail.com
//TDesktopToDevice = function(DesktopLocation, TableList: String; Sync: BOOL; Overwrite: Integer; DeviceLocation: String): Longint stdcall;
  TDesktopToDevice = function(DesktopLocation, TableList: AnsiString; Sync: BOOL; Overwrite: Integer; DeviceLocation: AnsiString): Longint stdcall;
  //added 01/19/2003 - Octavio Hernandez; dotnet@danysoft.com
//TDeviceToDesktop = function(DesktopLocation, TableList: String; Sync: BOOL; Overwrite: Integer; DeviceLocation: String): Longint stdcall;
  TDeviceToDesktop = function(DesktopLocation, TableList: AnsiString; Sync: BOOL; Overwrite: Integer; DeviceLocation: AnsiString): Longint stdcall;

  ...

  //added 10/16/2000 - Terence Goggin; terencegoggin@hotmail.com
//function DesktopToDevice(DesktopLocation, TableList: String; Sync: BOOL; Overwrite: Integer; DeviceLocation: String): Longint;
  function DesktopToDevice(DesktopLocation, TableList: AnsiString; Sync: BOOL; Overwrite: Integer; DeviceLocation: AnsiString): Longint;
  //added 01/19/2003 - Octavio Hernandez
//function DeviceToDesktop(DesktopLocation, TableList: String; Sync: BOOL; Overwrite: Integer; DeviceLocation: String): Longint;
  function DeviceToDesktop(DesktopLocation, TableList: AnsiString; Sync: BOOL; Overwrite: Integer; DeviceLocation: AnsiString): Longint;

  // (実装部も同様)

 String を AnsiString に変更しているだけです...とは言えこの部分は変更しなくても構いません。Windows Mobile だと ADOCE 関連はデフォルトでは動作しませんので、MDB の変換を行うこれら 2 つの関数を使う事はまずないと思われるからです (どのみち adofiltr.dll が "存在しなくて/最近の WM に対応していなくて" 使えないと思いますが)。

 実際のファイルコピーの方法はデモプログラムを見れば一目瞭然だと思いますので省略します。


11/11/09

Delphi / C++Builder / RAD Studioユーザー向け「XE2」発売記念キャンペーン
 面倒なので、ESD 版だけの一覧です (w

通常版 ESD (新規ユーザ向け)

ジャンプアップキャンペーン ESD (1~2006ユーザーおよび Starter Edition ユーザ向け)

アップデート ESD (Starter Edition を除く 2007~XE ユーザ向け)

 ※価格にポイント等は反映されていません。また、価格は変動する事がありますのでリンク先を必ず確かめるようにして下さい。
 ※Starter Edition の制限については ソフトウェア使用許諾およびサポート契約書を確認してください。
 ※各 SKU の違いについては RAD Studio XE2 機能一覧 を参照して下さい。
 ※XE2 を購入すると、過去のバージョン (Delphi の場合だと XE / 2010 / 2009 / 2007 / 7) を利用する事ができます (Starter / アカデミック除く)。詳細はこちらで。

 両方とも、2011/12/27 までのキャンペーンです。このキャンペーンで貰えるのは、

 ...となっています (Starter / アカデミック除く)。あれ?Ultimate では何が貰えるんだ?ちなみに全部貰えた場合、$2,935 相当になるそうだけど、僕の調べとは $29 乖離している。FastCube が $150 換算なのか?


11/11/10

HotFix 1 for Delphi, C++Builder and RAD Studio XE2
 "for Delphi, C++Builder and RAD Studio" となっていますが、Delphi に関係あるのかな?

BDE Installer for Delphi, C++Builder and RAD Studio XE2
 XE2 で BDE を使うためのモジュールです。BDE アプリのエンドユーザ向け配布ツールではありません。

アンドキュメンテッド(?) VCL ~逆引きVCL新機能
 昨日の筑木さんの Web セミナーは面白かった。本当なら先日のデブキャンで講演予定だったものだ。

 内容は流石の安定感だった。あまりドキュメントのない .NET 互換クラスや、文字コード、VCL コンポーネントの話だったのだけれど、"Undocumented" なだけに、知らないヒトは全く知らないものもあったように思う。

 twitter でツイートしたのだけれど、TGridPanel に関しては、以前から "Delphiでフローレイアウト (EDN)" という記事がある。BDS 2006 情報 にもリンクが貼ってあったのでサクっと URL を提示する事ができたけれど、多くのヒトはこの記事を読んでいないかもしれない。

 TGridPanel の % 指定を行う場合には *.dfm を直接書き換えた方が早いのだけれど、その理由も EDN の記事中に書いてある。*.dfm 中にコメントが使えればなぁ...複雑な TGridPanel や入れ子になった TGridPanel の *.dfm を直接書き換えるのは結構しんどかったりする。ま、一旦外部のテキストエディタで編集してから書き戻せば済む話ではあるのだけれど。

 後日、資料が公開される事があったら、読み返してみたいと思います。


11/11/11

AppWave
 アプリケーション配布ツール...といった所。詳細は Youtube Channel で。

 いまいちライセンス関係がハッキリしません (DL できるのはトライアル版のようですが、それなら "Get AppWave. It's Free" って何よ?って話です) が、社内でアプリケーションを配布するには便利そうです。

 ただ、AppWave試すときには、VM とかでやった方がよさそうです。

 後者が、AppWave Browser に起因するものだった場合には、AppWave Browser も VM とかで試した方がよさそうですね。アプリケーションを使う側にとっては大したことのない問題ですが、開発者側からするとちょっと頂けない問題です。

 Delphi 2007 の使用許諾登録情報をスッ飛ばす件は QC に入れたい所ですが、QC にはカテゴリもなく、テストする度に Delphi 2007 の登録カウントが増えていく事になるので、できれば勘弁願いたい所です。

 国内に限って言えば、AppWave Browser だけでも UI がローカライズされていないと厳しいかもしれません。


11/11/14

Unicode版TEditor の上書きモードの処理修正 (au2010の日記)
 au2010 さんによる Unicode 版 TEditor の修正です。恐らく、当サイトにある Unicode 版 TEditor の修正方法だと思います。ワードラップがエンバグしたまま放置していて心苦しいのですが、そのうち直します。

アンドキュメンテッド(?) VCL ~逆引きVCL新機能
 先日の筑木さんの Web セミナーEmbarcadero の Youtube Channel にて公開されています。

 Webセミナー「アンドキュメンテッド(?) VCL ~逆引きVCL新機能~」自己フォロー も併せてご覧ください。

codegear.com
 どうでも良い事だけれども、codegear.com の証明書の有効期限が切れているようだ。


11/11/18

Lightning Fighters (日本名: トライゴン) より Faraway
 プログラミングしていてイマイチ調子が出ない時には "燃える曲" を再生するに限る。

 個人的には "エアーウルフ" の曲とごっちゃになる事がある。"グラディウス外伝" では何故かボスとして登場。

 正直、ゲームとしては好きな部類ではなかったけれど (ボムのある縦シューは好きじゃない)、Stage 1 & Stage 2 の BGM と "Dragon Laser" "Lightning Sword" の SE は強烈に記憶に残っている。

AppWave Browser が Delphi 2007 の使用許諾登録情報をスッ飛ばす件
 結局、AppWave Browser だけの利用でもスッ飛ばすらしい。AppWave 自体はいい感じなので、これだけはどうにかして欲しい。

 てな訳で、QC 登録してみた。


11/11/26

TTouchKeyBoard と電卓
 アプリケーション組み込みの電卓を作ることになりまして。

 別の部分で TTouchKeyboard を使っているので、TTouchKeyBoard で電卓のキー部分を作ってみようと思った訳です。

 ちょっと難儀しましたが、一応形になりました。"%" の処理が一般的な電卓と Windows の電卓では動作が違う事に気付いたので、そこだけペンディング中です。メモリ関連の操作は実装してあります。

 "+" キーは縦長ですが、TTouchKeyBoard は普通にやると "+" キーのような縦長のキーが作れない気がします。え? 「Layout = 'NumPad' ではできてるじゃないか」 って?縦長ができるのは、恐らく右端からだけです。キーの情報を格納している TVirtualKey には

 しかありません。これはキーを段ごとに左詰めで配置しているという事です (Layout = 'Keyboard' のキーはマトリクス状に並んでいませんよね?)。いわゆる ColSpan / RowSpan 方式ではありませんので、縦長のキーを作るとキーがカブってしまいます。Like this.

 LeftMargin / RightMargin で空白を作ろうとしたり、高さ 0 のボタンを配置して問題回避を試みましたが、すべてうまくいきませんでした。左詰めで配置されるので、右端からだと例外的に縦長ボタンを作れるのですが。

カスタムタッチキーボードの作り方 (Delphi 2010 またはそれ以降)
 最も簡単なやり方は Chris Bensen 氏の "Hacking the TTouchKeyboard" の記事に従う事です。

  1. XML でキーボードレイアウトファイルを作成する。
  2. kcc.exe (後述) でキーボードレイアウトのバイナリを生成する。
  3. プロジェクトのリソースに RCDATA でキーボードレイアウトのバイナリを含める。
  4. TTouchKeyboard.Layout を変更する。
 このようになります。順を追って説明します。

XML でキーボードレイアウトファイルを作成する
 XML の記述の仕様は "Hacking the TTouchKeyboard Part IV" にて解説されていますが、イチから作るのは面倒なので既存のキーボードレイアウトから XML ファイルを生成します。

 XML の生成には "Save Touch Keyboard Layout (SaveLayout.exe)" をコンパイルして使います。そのままだとちょっとだけ使いにくいので、SaveKeyboard.pas に軽微な修正を施します。

procedure SaveXmlFile(const FileName: string; KeyboardLayout: TVirtualKeyLayout);
var
  ...
  Dmy: String// 追加
begin
  ...
  { 出力 された XML を整形して読みやすくする }
  { ---------------------------------------- }
  Dmy := XMLDoc.FormatXMLData(Document.XML.Text);
  Document.XML.Text := Dmy;
  Document.Active := True;
  { ---------------------------------------- }

  Document.SaveToFile(FileName);
end;

 XML を整形して、

procedure TForm1.Button3Click(Sender: TObject);
...
begin
  ...
  try
    SaveDialog1.FileName := LayoutName + '.xml'// ファイル名のデフォルトを生成
    if (Layout <> niland SaveDialog1.Execute then
      SaveXmlFile(SaveDialog1.FileName, Layout);
  finally
    Layout.Free;
  end;
end;

 保存用のファイル名を自動的に付与します。SavaDialog1 の Filter プロパティと DefaultExt プロパティも設定しておくといいでしょう。

 このツールで 106 キーボードとテンキーを XML 出力した結果は以下のようになります。まずは日本語キーボードです。

<keyboard keyboardname="Standard106" keyboardtype="Standard" width="848" height="262" minwidth="550" minheight="180" rowheight="48">
        <language languagename="ja" name=""/>
        <row topmargin="0" bottommargin="2">
                <key caption="Esc" scancode="1" width="40" height="48" rightmargin="2" stretch="true"/>
                <key caption="漢字" scancode="41" width="83" height="48" leftmargin="2" rightmargin="2"/>
                <key scancode="2" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="59" modifiername="fn" fontsize="10" caption="F1"/>
                </key>
                <key scancode="3" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="60" modifiername="fn" fontsize="10" caption="F2"/>
                </key>
                <key scancode="4" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="61" modifiername="fn" fontsize="10" caption="F3"/>
                </key>
                <key scancode="5" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="62" modifiername="fn" fontsize="10" caption="F4"/>
                </key>
                <key scancode="6" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="63" modifiername="fn" fontsize="10" caption="F5"/>
                </key>
                <key scancode="7" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="64" modifiername="fn" fontsize="10" caption="F6"/>
                </key>
                <key scancode="8" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="65" modifiername="fn" fontsize="10" caption="F7"/>
                </key>
                <key scancode="9" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="66" modifiername="fn" fontsize="10" caption="F8"/>
                </key>
                <key scancode="10" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="67" modifiername="fn" fontsize="10" caption="F9"/>
                </key>
                <key scancode="11" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="68" modifiername="fn" fontsize="10" caption="F10"/>
                </key>
                <key scancode="12" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="69" modifiername="fn" fontsize="10" caption="F11"/>
                </key>
                <key scancode="13" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="70" modifiername="fn" fontsize="10" caption="F12"/>
                </key>
                <key caption="\" scancode="125" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="125" modifiername="shift" caption="|"/>
                </key>
                <key keyimage="3" scancode="14" width="55" height="48" leftmargin="2" stretch="true" publishedname="Backspace"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key keyimage="0" scancode="15" width="85" height="48" rightmargin="2" stretch="true" publishedname="Tab"/>
                <key scancode="16" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="16" modifiername="caps"/>
                </key>
                <key scancode="17" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="17" modifiername="caps"/>
                </key>
                <key scancode="18" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="18" modifiername="caps"/>
                </key>
                <key scancode="19" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="19" modifiername="caps"/>
                </key>
                <key scancode="20" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="20" modifiername="caps"/>
                </key>
                <key scancode="21" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="21" modifiername="caps"/>
                </key>
                <key scancode="22" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="22" modifiername="caps"/>
                </key>
                <key scancode="23" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="23" modifiername="caps"/>
                </key>
                <key scancode="24" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="24" modifiername="caps"/>
                </key>
                <key scancode="25" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="25" modifiername="caps"/>
                </key>
                <key scancode="26" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="26" modifiername="caps"/>
                </key>
                <key scancode="27" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key scancode="43" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key caption="Del" scancode="83" width="57" height="48" leftmargin="2" stretch="true" publishedname="Del"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key caption="Caps" scancode="58" width="110" height="48" rightmargin="2" toggle="true" stretch="true" modifiername="caps" publishedname="Caps"/>
                <key scancode="30" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="30" modifiername="caps"/>
                </key>
                <key scancode="31" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="31" modifiername="caps"/>
                </key>
                <key scancode="32" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="32" modifiername="caps"/>
                </key>
                <key scancode="33" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="33" modifiername="caps"/>
                </key>
                <key scancode="34" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="34" modifiername="caps"/>
                </key>
                <key scancode="35" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="35" modifiername="caps"/>
                </key>
                <key scancode="36" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="36" modifiername="caps"/>
                </key>
                <key scancode="37" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="37" modifiername="caps"/>
                </key>
                <key scancode="38" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="38" modifiername="caps"/>
                </key>
                <key scancode="39" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="39" modifiername="caps"/>
                </key>
                <key scancode="40" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="40" modifiername="caps"/>
                </key>
                <key keyimage="2" scancode="28" width="128" height="48" leftmargin="2" stretch="true" publishedname="Enter"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key keyimage="1" scancode="42" width="119" height="48" rightmargin="2" stretch="true" modifiername="shift" publishedname="LeftShift"/>
                <key scancode="44" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="44" modifiername="caps"/>
                </key>
                <key scancode="45" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="45" modifiername="caps"/>
                </key>
                <key scancode="46" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="46" modifiername="caps"/>
                </key>
                <key scancode="47" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="47" modifiername="caps"/>
                </key>
                <key scancode="48" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="48" modifiername="caps"/>
                </key>
                <key scancode="49" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="49" modifiername="caps"/>
                </key>
                <key scancode="50" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="50" modifiername="caps"/>
                </key>
                <key scancode="51" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key scancode="52" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key scancode="53" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key caption="\" scancode="115" width="48" height="48" leftmargin="2" rightmargin="2">
                        <modifier scancode="115" modifiername="shift" caption="_"/>
                </key>
                <key keyimage="1" scancode="42" width="71" height="48" leftmargin="2" rightmargin="2" stretch="true" modifiername="shift" publishedname="RightShift"/>
                <key keyimage="4" scancode="72" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key caption="Fn" scancode="-2" width="48" height="48" leftmargin="2" toggle="true" modifiername="fn"/>
        </row>
        <row topmargin="2" bottommargin="0">
                <key caption="Ctrl" scancode="29" width="75" height="48" rightmargin="2" modifiername="ctrl" publishedname="LeftCtrl"/>
                <key caption="Alt" scancode="56" width="53" height="48" leftmargin="2" rightmargin="2" modifiername="alt" publishedname="LeftAlt"/>
                <key caption="無変換" scancode="123" width="105" height="48" leftmargin="2" rightmargin="2"/>
                <key scancode="57" width="126" height="48" leftmargin="2" rightmargin="2" stretch="true"/>
                <key caption="変換" scancode="121" width="85" height="48" leftmargin="2" rightmargin="2"/>
                <key caption="カナ" vk="21" width="60" height="48" leftmargin="2" rightmargin="2"/>
                <key caption="Alt" scancode="56" width="53" height="48" leftmargin="2" rightmargin="2" modifiername="alt" publishedname="RightAlt"/>
                <key caption="Ctrl" scancode="29" width="75" height="48" leftmargin="2" rightmargin="2" modifiername="ctrl" publishedname="RightCtrl"/>
                <key keyimage="6" scancode="75" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key keyimage="5" scancode="80" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key keyimage="7" scancode="77" width="48" height="48" leftmargin="2"/>
        </row>
</keyboard>

 次にテンキーパッドです。

<keyboard keyboardname="NumPad" keyboardtype="NumPad" width="190" height="229" minwidth="180" minheight="150" rowheight="48">
        <row topmargin="0" bottommargin="2">
                <key keyimage="3" scancode="14" width="48" height="48" rightmargin="2" publishedname="Backspace"/>
                <key vk="111" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="106" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="109" width="48" height="48" leftmargin="2" stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key vk="103" width="48" height="48" rightmargin="2"/>
                <key vk="104" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="105" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="107" width="48" height="92" leftmargin="2" stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key vk="100" width="48" height="48" rightmargin="2"/>
                <key vk="101" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="102" width="48" height="48" leftmargin="2"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key vk="97" width="48" height="48" rightmargin="2"/>
                <key vk="98" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key vk="99" width="48" height="48" leftmargin="2" rightmargin="2"/>
                <key keyimage="8" vk="13" width="48" height="92" leftmargin="2" stretch="true" publishedname="Enter"/>
        </row>
        <row topmargin="2" bottommargin="0">
                <key vk="96" width="96" height="48" rightmargin="2"/>
                <key vk="110" width="48" height="48" leftmargin="2" rightmargin="2"/>
        </row>
</keyboard>

 今回の目的は電卓のキーパッドを作る事なので、テンキーパッドのレイアウトを変更して作ることにしました。最終的にできたのがコレです。

<keyboard keyboardname="CalcPad" keyboardtype="CalcPad" width="240" height="229" minwidth="180" minheight="150" rowheight="48">
        <row topmargin="0" bottommargin="2">
                <key caption="R・CM" vk="120" width="48" height="48"                rightmargin="2"               />
                <key caption="M-"   vk="121" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="M+"   vk="122" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="+/-"  vk="123" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="CA"   vk="128" width="48" height="48" leftmargin="2"                 stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key                vk="103" width="48" height="48"                rightmargin="2"               />
                <key                vk="104" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key                vk="105" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="%"    vk="125" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="C・CE" vk="126" width="48" height="48" leftmargin="2"                 stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key                vk="100" width="48" height="48"                rightmargin="2"               />
                <key                vk="101" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key                vk="102" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="×"   vk="106" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="÷"   vk="111" width="48" height="48" leftmargin="2"                 stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="2">
                <key                vk="97"  width="48" height="48"                rightmargin="2"               />
                <key                vk="98"  width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key                vk="99"  width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key                vk="107" width="48" height="92" leftmargin="2" rightmargin="2"               />
                <key                vk="109" width="48" height="48" leftmargin="2"                 stretch="true"/>
        </row>
        <row topmargin="2" bottommargin="0">
                <key                vk="96"  width="96" height="48"                rightmargin="2"               />
                <key                vk="110" width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key                vk="0"   width="48" height="48" leftmargin="2" rightmargin="2"               />
                <key caption="="    vk="127" width="48" height="48" leftmargin="2"                 stretch="true"/>
        </row>
</keyboard>

 XML は UTF-8N で保存されますので、UTF-8N を編集できるテキストエディタがあると便利です。簡易エディタを Delphi で作ってもいいかもしれませんね。

 数字と四則演算、小数点はそのままキーコードで返ってきます。それ以外は VK_F9 等の仮想キーコードを返すようになっています。"=" は Enter でもよかったのですが、今回電卓を実装するアプリケーションでは Enter を他の処理に使っているので、Enter にはしていません。

R・CM
VK_F9
M-
VK_F10
M+
VK_F11
+/-
VK_F12
CA
VK_F17
7
VK_NUMPAD7
8
VK_NUMPAD8
9
VK_NUMPAD9

VK_F14
C・CE
VK_F15
4
VK_NUMPAD4
5
VK_NUMPAD5
6
VK_NUMPAD6
×
VK_MULTIPLY
÷
VK_DIVIDE
1
VK_NUMPAD1
2
VK_NUMPAD2
3
VK_NUMPAD3

VK_ADD

VK_SUBTRACT
0
VK_NUMPAD0
.
VK_DECIMAL

VK_F16

 このような配置になります。5 段目の vk="0" のキーはダミーですが、これがないと正しく配置されませんし、リサイズ時にキーの大きさの計算を間違います。先述のようにこのままだとキーがカブってしまうのですが...。

"Keyboard Layout Compiler (kcc.exe)" でキーボードレイアウトのバイナリを生成する
 "Keyboard Layout Compiler (kcc.exe)" はソースコードで提供されていますので、一旦コンパイルしてバイナリを生成します。出来上がった kcc.exe はコンソールアプリケーションです。

 使い方はとてもシンプルで、

kcc.exe キーボードレイアウトファイル

 とするだけです。正常にコンパイルされると、*.binary というファイルが生成されます。

 このコンパイラは Delphi のコンパイラや RTL のバージョンに依存すると思われるため、一度 kcc.exe を作ったらすべての Delphi で使えるとは思わない方がいいでしょう。面倒でもコンパイラ毎に kcc.exe を生成する必要があります。

プロジェクトのリソースに RCDATA でキーボードレイアウトのバイナリを含める
 キーボードレイアウトファイルのバイナリ (*.binary) ができたら、リソースとしてアプリケーションに埋め込みます。Delphi ビルトインのリソースマネージャ ([プロジェクト | リソースと画像]) を使ってもいいのですが、何故かうまく動作しない事があるので手動でリソースを追加します。

  1. [ファイル | 新規作成 | その他...] から、テキストファイルを作成し、拡張子を *.rc にして保存します。
  2. このリソーススクリプトファイルに、以下の一行を記述します。
    CALCPADKEYBOARD         RCDATA "CALCPADKEYBOARD.binary"
 プロジェクトマネージャに *.rc があれば勝手にコンパイルされてリンクされます。リソース名は任意ですが、"KEYBOARD" という文字を含めて下さい。リソースの種類は RCDATA です。

TTouchKeyboard.Layout を変更する。
 アプリケーションにリソースを埋め込む事ができたら、コードで、

  TouchKeyboard1.Layout := 'CalcPad';

 このように記述すればレイアウトが電卓キーになります。設計時に電卓のレイアウトを選択したいのであれば、lib フォルダ内にある keyboardLayouts.res にキーボードレイアウトを追加しておけばいいのですが、電卓レイアウトを使わなくても TTouchKeybord を使う限りリソースに含まれてしまう (exe が肥大する) ので、オススメできません。


11/11/27

続・TTouchKeyBoard と電卓
 さて、昨日の続きをやるとしましょう...とは言え、"基本的なやるべき事" は昨日の雑談でやってしまいましたので、注意点その他です。

縦長キーは本当に配置できないのか?
 繰り返しになりますが、TTouchKeyBoard にはキーボードの段があって、それに沿って左詰めでキーが配置できます。キーの大きさは任意ですが、縦に長い場合には下の段にはみ出る事になります。

 それを前提で考えると、この現象に納得が行くと思います。青色の部分がダミーキーですが、はみ出たボタンの上にボタンが描画されているのです。ちなみに 5 段目の "." のRightMargin または "=" のLeftMargin で調整しようとするとリサイズ時のキーの大きさに不整合を生じます。

 さて、TTouchKeyBoard のキーは TButton のようなものではなく、HTML のクリッカブルマップのようなものです。つまり、キーの定義順にヒットテストを行なって押されたかどうかを判定し、ボタンを描画しています。

 ...なのですから、この問題の解決方法は "ダミーキーをどうにかして描画させなければいい" という事になります。青色の領域で "+" キーとダミーキーのヒットテスト領域が重なっていますが、青色の領域をクリックしても常に "+" キーが押された事になります。ヒットテストは登録順なのですから、ダミーキーのヒットテスト判定が行われる事はない訳です。

 事実、この状態で青色の領域をクリックすると "+" キーの押された状態が描画され、以降 "+" キー は正しく描画されます。但し、再描画処理が走ると、ダミーキーで上書き描画され、元に戻ってしまいます。

ダミーキーを描画させないようにするには?
 あまり時間がなかったのでソースを詳しく追いかけていないのですが、とりあえずダミーキーを描画させないようにするには、Keyboard.pas を直接書き換えるしかないような気がします。

 Keyboard.pas を自作アプリケーションと同じ所へコピーし、そちらを書き換えてコンパイルする方法を採れば、他のアプリケーションに影響を与える事はありません。また、修正はごくごく軽微で済みます。

procedure TCustomKeyboardButton.Paint(Canvas: TCustomCanvas);
...
begin
  if key.Vk = 0 then // この 2 行を追加
    Exit;            // 仮想キーに 0 が指定されていたら描画しない
  ...

 ここでは描画を無視する仮想キーコードを 0 に指定していますが、他の仮想キーコードでもいいと思います (万が一このキーコードが飛んできても実害がないようなものを指定して下さい)。この問題をもっとスマートに解決する方法をご存知の方はご連絡ください。

電卓のロジック
 関数電卓を作るのでなければ、そう難しいものではありません。

 基本的な考え方は上記チュートリアルをご覧ください。タッチ操作の場合にはエラーダイアログが出ないようにした方がいい (タッチ操作ではコモンダイアログのボタンを押しにくい) ので、"Division by ZERO" の処理は忘れずにキッチリやっておきましょう。関数電卓を作りたいのであれば、インタプリタやコンパイラの作り方の知識があった方がいいように思います。

 「そもそも、電卓の C と CE と CA の違いって何?」 という方は、

 等を参照してください。

  「% の計算結果が~」 の件は、"〔3〕〔÷〕〔1〕〔5〕〔%〕" を Windows の電卓とリアル電卓でやってみると解ると思います。結局、一般的な電卓と同じロジックを実装する事にしました。


11/11/28

金なら 1 枚、銀なら 5 枚。
 溜め込みすぎだろ...。

 キョロちゃんファンクラブ から、

 を DL してせっせと応募作業に勤しんだ...orz。


11/11/29

ONKYO TW2A-A25Z7CK
 TW-317 シリーズの後継機。

 TW-317 シリーズとの違いをざっくり言えば、ディスプレイサイズが 10.1 インチと小型化され、ディスプレイそのものも従来の静電容量方式に加え、ペン (デジタイザ) による電磁誘導方式にも対応しているという事。

 ディスプレイサイズがデグレードに見えるかもしれないが、実際の所 スレート PC は 10.1 型が主流なので、これでいいと思う。前にも書いたと思うが、iPad や iPhone の強みは解像度等のハードウェアが固定されている事に他ならない。「iPhone 5」が発売中止になった理由 (TechTargetジャパン) の記事はあながち間違っては居ないと思う (コメ欄は苦笑するしかないけど)。

Windows と UI と解像度とタッチ操作の話
 "すべてベクター画像か 3D で処理する" のであればともかく、普通に画像で UI を作ろうとすると (FLASH でやるみたいにね) 大変な労力を伴うのは当サイトの "スレート PC プログラミング (TW317A5 の活用)" でも書いている通り...まぁ、現在は FireMonkey があるので、多少は見栄えの良いものが比較的楽に作れるようになってはいるのだけれど。

 いずれにせよ、

 どちらか片方でも固定されていれば随分楽になるのだから、TW2A-A25Z7CK の画面サイズ小型化がイコール "デグレード" とはならないと言える。

 # 画面解像度が固定されていないと...例えば FireMonkey でアニメーション処理とかをミリセカンドとかで指定するけど、
 # 使い所によっては画面解像度によってアニメーション速度が異なる事になっちゃうのだしね。

 余談になるけれど、デスクトップ機でのマルチタッチは一部を除いて主流には成り得ないと思う。ビジネス用途でもニッチな分野に留まると思われる...やってみれば判るけれど、腕を上げた状態で対角 20 インチオーバーをせわしなく動かして続けたら、翌日には間違いなく筋肉痛だ (w

 スレート PC で解像度が問題になって、普通の Windows アプリでそこまで問題にならないのは、従来の Windows アプリは "リサイズ可能なウィンドウ" という方法を採れるからに他ならない。タッチ操作でのリサイズってのは案外難しく、少なくとも従来の Windows アプリをタッチ操作でリサイズするのはかなり面倒だったりする。TW2A-A25Z7CK はペン操作にも対応しているので、TW317 シリーズよりはリサイズしやすいとは思う...ペン必須だけれど。

 タッチ操作だと、ゲーム画面のように "一つの画面の中で何かをやる" というのには向いているのだけれど、マルチウィンドウの操作にはとことん向いていない。目的のタッチ位置がどうしても指で隠れてしまう事に加え、特に静電容量方式のタッチディスプレイだと 5 ~8 mm のポイント精度になってしまうため、マルチウィンドウのウィンドウ操作のための領域...従来の Windows アプリならキャプションバーの高さ等は 48px~64px ないと快適に操作できない。つまり、UI のために無駄に領域を必要としてしまう事になる。画面の情報量を落としてまでタッチ操作にこだわるというのは承服しがたいと思う。

 これまた余談だけれど、Delphi の TTouchKeyboard のキーキャプションはよく考えられている。左上にちょこんと文字があるので、「なんで真ん中に大きく表示しないの?」 と思いがちだが、あの位置であるからこそ、指で操作した時に文字が視界に入る事になる。"よく考えられている" というのは深読みし過ぎで、実は単に普通の物理的キーボードの刻印に倣っただけかもしれないけれど、とりあえずここは賞賛しておく事にする (w

 # タッチ操作でキーキャプションが視界に入りやすいのは右利きの場合に限る話なので、
 # 左利き用にスイッチ (キーキャプションを右寄せ) できるようなプロパティがあるといいのかもしれない。

 あれこれ考えてみると Windows 8 のメトロ UI はタッチ操作の面ではよくできた UI だと思う。筋肉痛の問題は解決できないような気はするけれど。

Help Update 2 for Delphi, C++Builder and RAD Studio XE2
 リリースされました。リリースノートは DocWiki にあります。具体的な修正点は 英語版リリースノート を参照して下さい。


11/11/30

Microsoft Office Starter 2010を無料でダウンロードするには? (適宜覚書-Fragments)
 な・ん・だ・と?

Microsoft Office IME 2010
 そういえば、Microsoft Office IME 2010 も無料ダウンロード版があるんだったな。

続・続・TTouchKeyBoard と電卓
 twitter で au2010 さんからツッコミが入ったのでやってみた。TTouchKeyboard.DefaultButtonClass か...。

  1. まず、以下のような TCustomKeyboardButton の派生クラスを作る。
      TKeyboardButtonEx = class(TCustomKeyboardButton)
      public
        procedure Paint(Canvas: TCustomCanvas = nil); override;
      end;
    
    
    { TKeyboardButtonEx }
    
    procedure TKeyboardButtonEx.Paint(Canvas: TCustomCanvas);
    begin
      if key.Vk = 0 then
        Exit;
      inherited;
    end;
  2. そして、Form の OnCreate イベントハンドラ等で以下のように記述する。
      TouchKeyboard1.DefaultButtonClass := TKeyboardButtonEx;
      TouchKeyboard1.Layout := 'CalcPad';
 とてもスッキリした。そしてやってる事は、らいなタンさんの "TTouchKeyboardをいぢ(め)る。(全力わはー)" と同じ事だと気付く (w


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