(11/04/01~)

11/04/01

Impress Watch のエイプリールフール企画
 今年は中止だとか。これに限らずエイプリールフール企画は要らん。エイプリールフール企画の残骸が Google とかに引っ掛かる事があるが、毎年毎年残骸は増えていくので (消えていくものもあるけど)、正直ウザイ。

 このサイトではエイプリルフールネタはやりませんのでご安心 (?) を。

Delphi で CSV を処理する ("ひとつの" 解答編)
 03/30 の件の解答です。例外処理で悩まなくて済むようにするには dbGo (ADO Express) を使うのが最も簡単です。Delphi XE Starter をお持ちの方には何の解決にもなっていなくてスミマセン。

 "例の意地悪な CSV (sample_csv.zip)" を読み込ませてみましょう。フォームには TStringGrid と TButton が一つづつ貼ってあるものとします。

uses
 ..., ADODB;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  ADOC: TADOConnection;
  ADOQ: TADOQuery;
  ExtProps: String;
  FullPathName, FilePath, FileName: String;
begin
  // ファイル名の設定
  FullPathName := 'C:\DATA\SAMPLE.CSV';
  FilePath := ExcludeTrailingPathDelimiter(ExtractFilePath(FullPathName));
  FileName := ExtractFilename(FullPathName);
  // dbGo の設定
  ADOC := TADOConnection.Create(Self);
  ADOQ := TADOQuery.Create(Self);
  try
    // コネクション文字列の生成
    // (OLE DB プロバイダ = MSDASQL)
    ExtProps := '';
    ExtProps := ExtProps + 'DRIVER={Microsoft Text Driver (*.txt; *.csv)};'// ドライバ名
    ExtProps := ExtProps + Format('DefaultDir=%s;', [FilePath]);             // CSV のあるフォルダ
    ExtProps := ExtProps + 'HDR=Yes;';                                       // 1 行目がヘッダか?
    ExtProps := Format('Extended Properties="%s";', [ExtProps]);
    ADOC.ConnectionString := 'Provider=MSDASQL;' + ExtProps;                 // OLE DB プロバイダ
    ADOQ.Connection := ADOC;
    // 接続
    ADOC.Connected := True;
    // CSV に対してクエリ発行
    with ADOQ do
      begin
        SQL.Clear;
        SQL.Add('Select * From "' + FileName + '"');
        Open;
        // StrinGrid の行数を設定
        if IsEmpty then
          StringGrid1.RowCount := 2
        else
          StringGrid1.RowCount := RecordCount + 1;
        // ヘッダを読む
        for i:=0 to Fields.Count -1 do
          StringGrid1.Cells[i, 0] := ADOQ.Fields[i].FieldName;
        // データを読む
        i := 1;
        while not EOF do
          begin
            StringGrid1.Cells[0, i] := FieldByName('FIELD_01').AsString;
            StringGrid1.Cells[1, i] := FieldByName('FIELD_02').AsString;
            StringGrid1.Cells[2, i] := FieldByName('FIELD_03').AsString;
            StringGrid1.Cells[3, i] := FieldByName('FIELD_04').AsString;
            StringGrid1.Cells[4, i] := FieldByName('FIELD_05').AsString;
            Inc(i);
            Next;
          end;
        Close;
      end;
    // 切断
    ADOC.Connected := False;
  finally
    ADOQ.Free;
    ADOC.Free;
  end;
end;

 理解しやすいようにソースコードは長めになっていますが、そんなに難しいものではありません。dbGo のコンポーネントをフォームに貼るのであればもっと簡単になるハズです。

 実行結果がコレです。フィールド中の空白/カンマ/エスケープされたクォーテーション/改行、省略されたフィールド等を考慮したコーディングは一切していませんが、行もフィールドもズレる事なく読み込めているのがお判り頂けると思います。

 「複数行になってないじゃねーか」と仰るかもしれませんが、StringGrid が改行で表示してくれないからこうなっています。このままだと "FieldByName('FIELD_02').AsString" で取得できるデータは 0x0A 区切りになっていますので、実用的にするためには StringReplace() で 0x0D,0x0A に置換するか、TStringList に放り込んで取り出すといった処理が必要ですが、ここまでやれば残った処理は些細なものです。少なくとも行とフィールドがズレてさえなければ後はどうにでもできます。

 CSV に対して SQL を投げているので、当然 Where 句も使えますし、Order By 句も使えます。

        SQL.Clear;
        SQL.Add('Select * From "' + FileName + '"');
        SQL.Add('Where                           ');
        SQL.Add('  [FIELD_01] > :_FIELD_01       ');
        Parameters.ParamByName('_FIELD_01').Value := 3;
        Open;
        ...

 フィールド名は "[]" で括らなければなりません。パラメータも普通に使えます。実行結果は以下のようになります。

 条件を絞って取り込んだり (空行を弾くとか)、フィールドを入れ替えて取り込んだり、フィールドを並べ替えて取り込んだりできます。同様のテキスト処理は BDE でも可能ですが、これだけのためだけに BDE を配布しなくてはならないのはどうかと思いますのでオススメはしません。

 また、CSV 処理に使える "OLE DB プロバイダ" には、

 がありますが、このうち Jet に関しては 64bit サポートがありません (サポート予定もありません) ので注意が必要です。ちなみに...同様のコードで、コネクション文字列を変更するだけで XLS や XLSX を読み出す事も可能です。ADO コネクション文字列の詳細に関しては NYORO PRESS さんの "ADO (ActiveX Data Object)" に詳細が書かれています。

Delphi で CSV を処理する (考察編)
 TStringList の挙動を知るにつれ CSV 処理クラスを書きたくなる衝動に駆られてしまうと思います。そしてクラスを書き上げていざ使ってみる段になって、「これだったら dbGo (ADO Express) で処理する方が手っ取り早くね?」と感じてしまうのです。

 先に書いたように dbGo (ADO Express) で処理すれば、抽出 / 並び替えを先に行ってから必要な部分だけを取り込めますので、殆どの場合、処理そのものを書き直さず SQL だけ書き換えれば済みますからね。

 プログラマとしてはこの手段を採る事に少々釈然としない感がありますが、「データを CSV でくれ」と言われた場合には 9 割以上の確率で Excel によるデータ入力が行われるのが実情であり、"Excel が吐く CSV と親和性が高いのは ADO による処理" というのもまた確かなのです。

先日の山本さんのセッションじゃないですが、
とんでもないデータの CSV を渡されて、「こんなの処理できるか、ボケー!!」と言いたくなる事がよくあります。
アレはテストケースの想像の斜め上を行きます。アレを事前に予測できたらエスパーです。
他にも 65,536 行を超える CSV データを古い Excel で開こうとして開けないもんだから「お宅から貰った CSV データ壊れてるよ」と言われたりとかさ。
愚痴です、えぇ愚痴ですとも。

 ...ただ、Excel が吐く CSV はフィールド中の改行が 0x0A、行改行が 0x0D,0x0A である事は先にも書きましたが、CSV の仕様をクラスプラットフォームで考えた場合、

 というのもアリですので、"プラットフォームに依存しない CSV 処理クラス (または DBX4 ドライバ等)" が欲しいのは欲しいんですよね...。

ついでに TSV について
 TSV は "Tab Separated Values" の略です。タブ区切りテキストです...が、TSV もひっくるめて CSV と呼ぶ事があります ("Character Separated Values" という苦しい言い訳が用意されています)。

 TSV のフォーマットはフィールドセパレータが単純にタブに置き換わっただけです...なので、フィールド中にカンマが存在する場合には CSV 同様に前後をクォート文字で括る必要があります。

 タブ区切りテキストをクリップボードに読み込ませると、そのまま Excel や Ooo-Calc に貼り付ける事ができるため、場合によっては CSV よりも重宝する事があります。ファイルへのエクスポートは CSV 形式、クリップボードへは TSV 形式で出力するようにしておくとアプリケーションの応用範囲が広がります。

民法じゃない方の年齢計算
 山本 (DelFusa) さんのセッションへのツッコミで書いた年齢計算のコードですが、アレは "民法上の年齢計算ってのもありますよ" という意味で書いたのであって、年齢計算には必ずアレを使わなければならないといったものではありません。

 実際には、民法上の年齢計算を行う GetAgeC() と、以下に示す "普通に思い付く年齢計算" な GetAge() を状況に応じて使い分ける必要があります。

// 年齢計算を行う
// -----------------------------------------------------------------------------
//  aBirthDay: 誕生日
//  aBaseDay : 基準日
//  result   : 満年齢
// -----------------------------------------------------------------------------
function GetAge(aBirthDay, aBaseDay: TDateTime): Integer;
var
  Year1, Month1, Day1: WORD;
  Year2, Month2, Day2: WORD;
  dBirthDay, dBaseDay: TDateTime;
begin
  dBirthDay := aBirthDay;
  DecodeDate(dBirthDay, Year1, Month1, Day1);
  DecodeDate(aBaseDay , Year2, Month2, Day2);
  if (Month1 = 2and (Day1 = 29and (not IsLeapYear(Year2)) then
    dBirthDay := dBirthDay + 1;
  DecodeDate(dBirthDay, Year1, Month1, Day1);
  result := Year2 - Year1;
  dBaseDay := EncodeDate(Year2, Month1, Day1);
  if dBaseDay > aBaseDay then
    Dec(result);
end;

 こちらの年齢計算のコードでは閏年を考慮する必要があります...これまたどこかに書いた気がするんですけどね。IsLeapYear() は指定された年が閏年であるかを判定する関数です。SysUtils 名前空間にあるハズですが、なければ以下のコードを使って下さい。

// 閏年かどうかを調べる
// -----------------------------------------------------------------------------
//  aYear:  西暦年
//  result: Trueなら閏年
// -----------------------------------------------------------------------------
function IsLeapYear(aYear: WORD): Boolean;
begin
  result := (aYear mod 4 = 0and ((aYear mod 100 <> 0or (aYear mod 400 = 0));
end;

 なお、TDateTime 型の値が閏年の範囲にあるかどうかを調べる関数は IsInLeapYear() で、こちらは DateUtils 名前空間に存在します。


11/04/02

64-bit版Delphiフィールドテストのご案内
 Delphi "Pulsar" のフィールドテストの案内のアナウンスがありました。

 フィールドテストやってると、バグ/要望報告を英語に起こしている間に誰かが同じ報告を上げたりします。次に、英語版以外のローカライズに起因する問題はドイツ/フランスの方が先に報告を上げる事があります。だからと言って、ここで安心していると、

 このような問題を見逃したりします。前バージョンで起きなかった不具合が "新機能の絡み" や "バグ修正のとばっちり" で発生する事があるのです。

 誰でも使うような機能の不具合は発見されやすいのですがレアな機能は検証されづらく、さらに "すべての言語に共通" -> "ローカライズに起因" -> "マルチバイトあるいは各国言語版に固有" の順で検証される頻度が下がります。

 Delphi 2009 では Unicode 化という大きな変化があったため、日本人のフィールドテスタが一人でも多く必要な状況でした。そして今回の "Pulsar" です。"Pulsar" では Unicode の問題はほぼ関係ないでしょうが、64bit 日本語 Windows での検証は必要だと考えます。"日本人が日本語でしか検証できないもの" ってのは少なからずあるからです。

 QC 同様、基本的にフィールドテストは英語で行われますが、過度に意識/萎縮する必要はありません...マイペースで報告をこなせばいいと思います。"フィールドテストに必要なのは質より量" だと思いますので、多くの方の参加を期待しています。得意分野は人によってそれぞれ異なるのですから...。

Delphi "Pulsar"
 海外のあちこちの情報を総合すると、"Pulsar"...と言うより次期 Delphi XE は、どうも 64bit 化だけじゃなさそうですね。クロスプロットフォームが含まれていないのは確かのようですが。

 FT に参加する前なので、好き勝手言っておきます。当たってたとしても当たってなかったとしても、FT に参加してしまったら NDA の関係でその真偽は言えませんから...てな訳で、FT に参加するのは明日以降にする事にします。

統一地方選挙
 被災地の統一地方選挙は延期されましたが、「それどころじゃない」というのは当然として、もう一つメリットがあります。被災地域で頑張っておられる立候補者の方々が自サイトで情報を公開する事が可能になるのです。

 立候補者には "選挙期間中はホームページ (苦笑) の更新は不可" という訳のわからない制約があるため、逼迫した状況下にあっても選挙活動の一環とみなされ、重要な情報を流せないという事態になるのです。アフォかと思われるでしょうが、そういう現状なのです。

Firefox Portabl Edition / Thunderbird Portable Edition を使う事の利点
 Windows 7 の 32bit 版と 64bit 版をマルチブートする環境に於いて、Firefox Portabl Edition / Thunderbird Portable Edition を入れておけば双方の OS から使い慣れた環境を呼び出すことができます。どのみち Firefox は 32bit 版しか正式リリースされていませんし。

Microsoft Office 2010 の 64bit 版をインストールするには?
 64bit Windows に Microsoft Office 2010 を普通にセットアップしても 32bit 版がインストールされてしまいます。詳細は以下で。

 ..."Pulsar" がリリースされたとして、Office との連携がとても厄介な気がするのは僕だけでしょうか?

てな訳で Windows 7 x64 インストール完了
 こんな事もあろうかと、x64 インストール用のパーティションを用意してあったのだ。マルチブートの際の Windows のブートメニューの編集は bcdedit.exe でやるのが普通だけれど、EasyBCD を使うのが簡単でいい。

 ...さてと。準備もできた事だし、フィールドテストの申込みでもすっか。

築木さんへ...DECO より
 IME のユーザー辞書フッ飛んだのがいけないんだい!いあいあ...誠に申し訳ございません。twitter か...気が進まないけど業務連絡用にアカウント取ってみっか。

Windows で 3.25GB 以上のメモリを有効にする
 「64bit OS 買えよー」とか、そういう問題ではありませんで。古い M/B とかだったりすると、64bit-Windows に 4GB 以上を載せてあっても 3.25GB しか認識しない事があるのです...ウチのもそれになってた事に気付きました。

 キッチリ 4GB 以上を有効にするには BIOS の設定を変更する必要があります。当方の "MSI K8N Diamond (MS-7100)" では以下のような設定でした。

 "MTRR mapping mode" は最初からこの値でしたので、関係ないのかもしれません。

 そんなこんなで、ちゃんと 4GB キッチリ使えるようになりました。ちなみに、下のが同じマシンでデュアルブートになっている Windows 7 32bit での画面です。3.25GB になってますよね?

 M/B によっては設定項目が異なっていたり、設定項目が存在しない事があると思いますので、取扱説明書はきちんとご確認ください。

同一マシンでの Windows エクスペリエンス インなんとかさんの比較
 誰得だとは思うが掲載してみる。

コンポーネント 評価についての詳細 サブスコア
Windows 7 (32bit)
サブスコア
Windows 7 (64bit)
プロセッサ: 1 秒あたりの計算 4.7 4.9
メモリ (RAM): 1 秒あたりのメモリ操作 4.7 4.9
グラフィックス: Windows Aero のデスクトップ パフォーマンス 6.9 6.9
ゲーム用グラフィックス: 3D ビジネスおよびゲームグラフィックス パフォーマンス 6.9 6.9
プライマリ ハードディスク: ディスクのデータ転送速度 5.9 5.9

 32bit / 64bit で係数が異なる事も考えられるが、係数が全く同じだったとしたら "ビバ!AMD!!"


11/04/03

twitter
 冷やし中華...いやいや、やめておこう、絶対に誰かがやったネタだ。

 デブキャンの時とか webiner とか、ネタにされた時につぶやこう。うん、そうしよう。トップページにアイコンだけは付けておいた。

雑談下部にある広告
 Google 先生のは味気ないので Amazon に変更。クーポンサイトの広告ウザイし、トレンドマイクロの件も頭にきたし。広告収入はレンタルサーバ代 (Minim なので安いぞ) がペイできればいいと思ってるので、あまり真剣にやる気はない...アイテムにネタコメント仕込んである時点でお気付きだろうけど。

ラジヲマン発売延期
 チッ...今だからこそ読んで欲しいのに。そういえば "プルト君の動画" は誰かが再アップしたようだ。

 原発関係の議論 (?) は 喫茶XRAY でやったので、興味があればどうぞ。ここのマスターは放射線技師なので僕よりは遥かに信頼できると思う。メニューに "ラジウムコーヒー" がある...かどうかは不明。

 それから、本サイトにてセシウムについての雑談である、"とある米ソの放射性降下物 (フォールアウト)" というのを書こうかと思ったがやめておいた...twitter の自己紹介ネタとちょっとカブってしまうので (w 何の事か解らないのであれば、日本における 1950年台後半~1960年台前半の放射性降下物の量を調べてみて下さい。

32bit / 64bit で係数が異なる?
 昨日の雑談は説明不足だったので補足しておく。

 詳しくは "64bitは苦手なCore Microarchitecture (後藤弘茂のWeekly海外ニュース)" に譲るが、Intel の Core Solo / Core Duo 系のプロセッサ (Intel Core MA) は 64bit 時にパフォーマンスが落ちる。対して Athron 64 等の AMD プロセッサは 64bit 時でも性能が落ちない。

 64bit OS に変更した場合にスコアが落ちると印象が悪いので、"Windows エクスペリエンス インデックス" は Core MA のプロセッサでもスコアが落ちないように 32bit / 64bit で係数を変えているのではないか?と思った訳。係数を変えると、相対的に AMD のプロセッサは 64bit 時のスコアが向上する事になるからね。


11/04/04

Microsoft Word でウムラウト等のダイアクリティカルマーク付文字を入力する
 Tiburón とか入力しにくいし。以下、日本語 106 /109 キーボードでのコンビネーション。IME はオフにした状態で入力する事。

 MS-Word で入力してメモ帳等の Unicode に対応したテキストエディタに貼り付けるといい。フォントによっては正しく表示されない事があるので注意。大文字を出したい時には、"Shift + <文字>"。"Ä" を出したければ、"Ctrl + :" に続けて "Shift + A" を押す (Caps Lock されていない場合)。

 練習してみましょう。"Tiburón" と入力するには...

  1. Shift + T
  2. i
  3. b
  4. u
  5. r
  6. Ctrl + Shift + 7 (Ctrl + ')
  7. o
  8. n
 てな具合に入力します。"Tiburón" と入力したいだけなら、ベトナム語入力用の Unikey をインストールした方が楽です...MS-Word 以外でも使えますし。

種類 コンビネーション 備考
逆感嘆符 ¡ Ctrl + Alt + Shift + 1 Shift + 1!
逆疑問符 ¿ Ctrl + Alt + Shift + / Shift + /?
アッシュ æ, Æ Ctrl + Shift + 6 , A (大文字は Shift + A) Shift + 6&
エスツェット ß Ctrl + Shift + 6 , S Shift + 6&
著作権表示記号 © Ctrl + Alt + C
登録商標記号 ® Ctrl + Alt + R
省略記号 Ctrl + Alt + . . はテンキー側不可
トレードマーク記号 Ctrl + Alt + T

 ...こんなのもあります。

短縮 URL
 あり?bit.ly の登録間違ったのか?

10 年前の仕様
 ふと、10 年前の仕事の資料を読み返した。そういやこの案件、"Windows 98 で動作する事" という条件があるのに、画面上にコントロールが数百個あるというシロモノだった。

 当時、開発は NT4.0 か Windows 2000 でやっていたと思うが、確か仕様変更のたびにコントロールが増えて行き、いざ実機に持っていったら "システムリソースエラー" という見たくもない半角カナのエラーが頻発して "氷のような冷たい汗が背中を大量に流れて行った" のを今でもよく覚えている。

 解決方法?どうしたかって?入力コントロール以外の表示するだけのコントロール (ラベルとかベベルとかパネルとか) を すべて TImage に描画しました 。おかげで劇的にリソース消費量が減りました...当時の僕の睡眠時間も大幅に減りましたけどね (w

単三電池1本で約40日間連続駆動、高性能な小型放射線測定器(ガイガーカウンター)「GC-SJ1」(GIGAZINE)
 このテの測定器は基本的に X線~γ線を測定するものだから、"放射性ヨウ素(131I)" や "放射性セシウム(137Cs)" は測定できない...ベータ崩壊だから。

 でも、矛盾しているようだが測定できない訳じゃない...何でかと言うと、

 放射性キセノン(131mXe) の半減期が 12 日、放射性バリウム(137mBa) の半減期が 2.6 分だから。つまり、"放射性ヨウ素と放射性セシウムの崩壊は検出できないけど、放射性キセノンと放射性バリウムの崩壊は検出できる" という事。もちろん、"全部が全部、放射性キセノンと放射性バリウムになるわけじゃない" のだけれど。

 うーん...お守りにしちゃ高いんじゃないかなぁ?個人的には、「どうやってシーベルト値を算出しているのか?」 が非常に気になる。

"レディー・ガガ" ちゃうわ!!
 いわゆる荻野目ちゃんです。

 一周回ってなんだか新鮮 (w


11/04/05

現地試験
 「だが断る」 とは言われなかったようだ (w

64bit on 64bit
 フィールドテストやろうと思ったら、仮想 PC を利用した方がいい...頻繁にベータリリースが行われるためだ。

 で、仮想 PC の話だが、例えば VirtualBox32bit OS がホストであっても、64bit OS をゲストにできる。但しこれは CPU が "Intel-VT" や "AMD-V" に対応している場合に限る。僕の開発マシンは "Socket 939 の Athron 64 X2" なので、AMD-V には対応していないのだ。

 「それじゃ、64bit OS の上の仮想 PC 上で 64bit OS を動かせばいいんだね」...とはならないのが、頭の痛い所。

Virtual PC VMware Player VirtualBox
32bit ホスト OS 64bit ホスト OS 32bit ホスト OS 64bit ホスト OS 32bit ホスト OS 64bit ホスト OS
32bit ゲスト OS
64bit ゲスト OS × × △ (AMD-V / Intel-VT が必須) △ (AMD-V / Intel-VT が必須) △ (AMD-V / Intel-VT が必須) △ (AMD-V / Intel-VT が必須)

 ゲストに 64bit OS を利用できる仮想 PC であっても、"必ず VT が必要になる" のだ...ご愁傷様。そういった事情で僕の場合、"64bit OS のテストを行うためには実機の 64bit OS が必要" だった訳だ...平たく言えば "今となっては僕の PC はヘボい" と言う事だね (w

 一応断っておくと、AMD 製 CPU は Socket AM2 (またはそれ以上) 対応の CPU であれば AMD-V にまず間違いなく対応している ("Socket 939 の Athron 64 X2" は非対応だが、"Socket AM2 の Athron 64 X2" は対応している)。Intel の CPU は詳細に型番を調べないと Intel-VT に対応しているかどうかは判らないので要確認。

「よーしパパ、Pulsar-FT のために Windows 7 64bit 版を買っちゃうぞ!」
 ちょ、ちょっと待って!本当に 64bit OS は必要なの?継続して利用する気があるのならもちろん止めないけど、Pulsar-FT のため "だけ" に購入するのは流石にどうかと思うよ?

 ちゃんと 64bit 版も用意されてるし、評価期間はインストール後 90 日間もある (最終有効期限は 2011/12/31) ので、まずはこちらを試してからでいいのではないかな?ただ、SP1 が適用されていないので、事前に "SP+メーカー" で、"HotFix 専用インストール CD/DVD" を作っておく事をオススメしとく。

「90日の使用期限内に Pulsar-FT をやり遂げられるのかい?」
 ごもっともな意見です。とりあえず "slmgr /rearm" でググるといい事があるかもしれませんが、評価版以外では実行しない方がいいと思いますし、しなければならない状況にもならないと思います。

Windows 7 64bit 版には 32bit 版 Explorer は存在しない...多分
 ちょっと調査不足で知らなかったのだけれど、Windows 7 の Explorer には 32bit 版 (またはモード) はないらしい。そういう事なので Explorer 拡張系は...大変だ。

 ちなみに Internet Explorer は 32bit 版がある。でも、32bit 版 IE のアドレスバーに "C:\" とか入力しても 32bit 版 Explorer にはならない。64bit 版 Vista では "ファイル名を指定して実行" から "%SystemRoot%\SysWOW64\explorer.exe /separate" とする事で 32bit 版 Explorer が使えたようだけど...。


11/04/06

RAD Studio XE ジャンプ・アップキャンペーン と RAD Studio XE Enterprise 版アップグレードキャンペーン は 2011/05/31 までに延長されました
 あちこち書き換えさせられたので謝罪と賠償を...(以下略)。何度も貼るけど、賢い買い方はこちら

 米国公式サイトにはトップページにバナーがあるのでキャンペーン延長を知る事が出来るが、残念ながら日本のサイトでは "震災お見舞いバナー" になっており、ちょっと気付かないと思う。たまたま "Delphi 64-bit コンパイラプレビュー" ページを見に行って気付いた。こういった情報は twitter や EDN Feed (JP) でキッチリ流すべきだと思う。

64bit 版 Windows 7 での 32bit Shell Extension
 32bit 版 Windows 7 から explorer.exe を持ってきてもダメだし、Visita のを持ってきてもエラーで動作しない。使い慣れたシェルエクステンションを利用したいのであれば、"32bit シェルエクステンションに対応したファイラ" を使うしかないようだ。32bit シェルエクステンション自体はちゃんと登録されているし、WOW64 で正しく動作する。

Delphi 2010 / XE で "ファイル検索" をした場合
 対象が

 の場合に日本語を検索すると "ほぼ、タブで開いているファイルしか検索してくれない"

 検索例に利用する日本語文字列として手っ取り早いのはフォームの定義部にある "{ Private 宣言 }" の部分だろう。ファイル検索 (Ctrl + Shift + F) で検索文字列に "宣言" を指定してみよう。"タブで開いているファイル + α" の範囲でしかヒットしないハズだ (ユニット数の多いプロジェクトで確認してみるといい)。

 イロイロと QC をあたってみたが、どうやらこれは QC#88114 らしい。一番近い QC は QC#89667 なのだが、QC#88114 の Duplicate という事になっている。

 「不便だぞ、コノヤロー!」と思われた方は是非 Vote を。


11/04/07

第 19 回デベロッパーキャンプ&ツアーの資料
 DL できるようになったようです。当サイトの "88.とりあえず、デベロッパーキャンプの資料を読んでみようか。" も更新しておきました。

totonica 氏は参戦済
 "Pulsar FT (Watercolor City)" より。ヤホォーーーイ!彼と一緒のパーティ (?) になるのは Tiburón 以来です。資料読み終わる迄、しばしお待ちを...すぐに追いつきますので。

 "FTer 一同は、今後しばらく Pulsar の話題に触れない" と思いますのでご注意を。「王様の耳はロバの耳ぃーーーー!!」 あー、ちょっとはスッキリした。

Extend the Delphi IDE with the Open Tools API
 OTA いじりたいなら、ホワイトペーパーだけでも DL しとくべき。昨日の 22:00 のセッションには間に合わなかったので、本日 03:00 のセッションに参加予定。本日は 09:00 にも、もう一回ありますが...。

 そして、まさかの寝落ち...orz。

QC Windows Client
 Web Client での Vote と異なり、QC Windows Client を使えば Vote 制限がありません。一つの QC では 1~10 pt の範囲ですが、複数の QC に対して幾らでも Vote 可能です。Windows Client は Embarcadero 製品に付属していますが、単体でのダウンロードも可能です (http://qc.codegear.com/qualitycentral.zip)。

 QC Windows Client で Vote するには、Vote したい QC を表示した上で、

 "Votes:" となっている部分をクリックして下さい。


11/04/08

Firefox 4 のブックマークツールバー
 賛否両論のブックマークツールバーの扱い on Firefox 4"Firefox4のブックマークバーを必要なときだけ表示させる方法 (適宜覚書-Fragments)" を参考にすると多少は融通が利くようになります。注意点としては、一旦ツールバーを標準状態に戻してからやる必要があります...でないと、意図しないバーが自動で消えます。

 ブックマークボタンの挙動がおかしい場合には "bug541844(fix with autohide menubar)" をインストールすればいいようです。

Visual Studio の公式フォーラム (日本語)
 ネイティブアプリ繋がりで Visual C++ のフォーラム をよく覗いている。.NET 系の言語は Delphi ユーザにはあまり参考になる投稿はない (と思う) し。

 単純比較できないのを承知で言うと、スレッド数はともかく個々のスレッドの閲覧数は殆どの場合で エンバカデロの公式フォーラム の方が上回っている (C# とか VB.NET と比較しても)。3 桁は当たり前で 4 桁閲覧のスレッドはザラにあるし。これでもう少し書き込みが増えるといいのだけれどなぁ...。

 これでコミュニティの優劣を語るとかいう趣旨ではないので注意。

Delphi Prism XE ISO (Update 1)
 リリースされた模様。単体のアップデータが見当たらないので、Delphi Prism XE をアンインストールして ISO からインストールする必要がありそうだ。リリースノートが欲しい所。

 あと、今更だけど "iPhone & iPad アプリを Delphi Prism XE で作るための資料 (Embarcadero)"


11/04/09

Delphi Prism XE Update 1 のリリースノート
 出たらしい。Pulsar のせいだろうか、なんだか最近のアップデータのリリースがドタバタしている気がする。ちょっと落ち着いてほしい。

劇場版マクロスF ~サヨナラノツバサ~
 熊本は今日から公開なのです。


11/04/10

Pulsar-FT
 やっとフォーラムの内容を読み終え、追い付く事ができた...ナナメ読みだけど。

Firebird 2.5 + Delphi XE with IBX
 以前、某所で正しく接続できないような書き込みを見掛けたのでテストしてみたけれど、正しく動作するじゃないか。

 IBX で Firebird を使う時の注意点は以下の通り。

 こんな所か。

統一地方選挙
 熊本では "熊本県議会議員一般選挙" が行われた。前に居た会社の社長サンも立候補していたが選挙区が違うので投票はできなかった (そもそも無投票で当選するけどね)。

 当然、選挙には行った。選挙行かないで (やる事やらないで) 文句言うのはアフォのする事だからね。


11/04/11

Pulsar プレビュー・ベータプログラム
 今日辺りから順次招待メールが届き出すハズ。64bit (Delphi) の情報をイチ早く入手したい方はどうぞ...但し、XE ユーザ優先です。"品質向上のためのフィードバックを目的としたフィールドテスト" の方はメールにて参加希望を出す必要アリ。

Old Style IDE
 Delphi XE...正確には Delphi 2010 からですが、IDE を Delphi 7 またはそれ以前の "旧 IDE" に限りなく近くする事ができます。旧 IDE はどんなものだったか思い出してみましょう。

 こんなでしたね。旧 IDE に近くする方法は良く聞かれますので設定手順の動画を作ってみました。

 今回、本文は動画の下にありますのでご注意 (スクロールさせて下さい)。出来上がりはこちら。

 ...ソックリだし。旧 IDE に慣れてしまってる方、Delphi 7 のメンテが未だにあり、旧 IDE とガリレオ IDE を往復すると混乱してしまう方にはオススメのレイアウトです。

 個人的には旧 IDE のようなフローティング形式が好き。フォームが散らかりやすいけど、レスポンスはいいので。Visual Studio に慣れてる方は逆に非フローティングの方がしっくりくるかもしれないですね。


11/04/12

今日は下の子の入学式
 でした。

 式そのものには間に合ったものの、ちょっと遅れて行ったので座る椅子がありませんでした。仕方ないので、子供の勇姿を目に焼き付けた後で退席しました。懇談会は嫁に任せた!

ちょっとカッコイイ半透明のコマンドプロンプト (Vista / 7 用)
 "Windows 7/Vistaでガラス半透明のコマンドプロンプト作成してみた (Win32プログラミング日記)" にある pseudocmd.exe は Vista 以降でサポートされる Glass を全画面に使ったコマンドプロンプトです。

 見た目カッコイイだけではなく、背景が透けて見えるので意外と (?) 実用的。仕事ができる人間に見える "かも" しれません。それと、Windows の個人設定でウィンドウの色をグレーにしておくと見やすいかも。

 このサイトはタイトルに偽りなく、"Win32" 絡みの話が多いです。Delphi ユーザにも有益な話があると思いますので、他の記事も読んでみる事をオススメします。

Japan Quake Map
 2011/03/11/ 01:16 以降、現時刻までに発生した地震を表示します。震源の深さを色で、規模を円の大きさで表しています。カウント単位は分です。"Display Options" の "Stickey Dots" にチェックを入れると震源地を継続的に点で表示します。

 ...正直な話、2011/03/11/ 14:46 以降はシャレになっていません。


11/04/13

埋め込みデザイナを解除した時のちょっとした不具合
 119.ガリレオ IDE を旧 IDE 相当のレイアウトにするには (Delphi 2010 以降) で紹介した方法ですが、難がない訳ではありません。

 ガリレオ IDE に変更されてからというもの、デフォルトが

 になっているため、どちらか一方でも異なっている場合には不都合がある事があります (FT 等でも検証されにくい...チェック漏れし易いという意味です)。

 過去にあった Old-Style IDE 関連の不具合は Delphi XE に至るまでにその殆どが修正されていますが、未だに直っていないものもあります。完全に状況を説明できる現象として QC#65189 が挙げられます。

 本来、"構造ウィンドウ" の内容は、

 で異なるのですが、埋め込みデザイナが無効...つまり、フローティングなフォームデザイナの場合には不具合があります。
  1. 新規プロジェクトを作成
  2. コードエディタをアクティブにし、"構造ウィンドウ" の内容を確認する*1
  3. F12 キーを押し、フォームデザイナをアクティブにする。
  4. "構造ウィンドウ" の内容を確認する*2
  5. もう一度 F12 キーを押し、コードエディタをアクティブにする。
  6. "構造ウィンドウ" の内容を確認する*3
  7. もう一度 F12 キーを押し、フォームデザイナをアクティブにする。
  8. "構造ウィンドウ" の内容を確認する*4
 *1 と *3 ではクラスや関数/変数の構造が表示され、*2 と *4 ではフォームの親子構造が表示されるハズですが、埋め込みデザイナが無効の場合には一度でもフォームをアクティブにしてしまうと構造ウィンドウにはフォームの親子関係しか表示されなくなってしまいます。

 動画 の最初の方と最後の方で、それぞれフォームデザイナとコードエディタを切り替えていますので、"構造ウィンドウ" の表示状態を実際に確認する事ができます (再起動後がフローティングデザイナです)。

 ...一応断っておきますと、回避方法がない訳ではありません。

 いずれかの方法で回避できますが...ちょっと面倒ですね。

 この不具合の QC が入っていた事は承知していましたが、ステータスが未だに Reported だったため、QC のコメント欄に発生条件を追記しておきました (英語間違えたケドw)。毎度毎度で恐縮ですが、「(゚Д゚)ゴルァ!!」 な方は是非 Vote をお願いします。


11/04/16

ニフティ25周年記念サイト
 とりあえず、TOP メニューでプロンプトが出たら "GO FBORLAND" だな (w

 パソコン通信はテレホでどうにか...ひょっとしてイマドキのヒトは "テレホーダイ" すら知らないかもな (w

 それはともかく、Nifty は過去ログを DL するのすら有料だったな...サンプルコードとかも。Delphi の情報なんて皆無に等しかったから、通信料を自腹で捻出して勉強したっけ。ここで、"今時の若いコは..." と続けると 親父の説教 となるのですね、わかります。

Nifty のログをメーラーで管理する
 NifToEml を使って Nifty ログをeml に変換してやればいい。

Nifty のログを Thunderbird で管理する
 Thunderbird Portable Edition を使い、先の eml を D&D で放り込めば、どこでも Nifty ログが読める。

 ...のだが、NifToEml の eml は SHIFT_JIS で、そのまま Thunderbird Portable Edition に取り込むと 差出人が文字化けしてしまう...よろしい、ならば Delphi XE だ

Shift_JIS の eml を UTF-8 に変換する
 やっつけ仕事なので手短に。

 まず、eml を UTF-8 仕様にする。Shift_JIS の eml は個人的にあまり好きではない。かと言って ISO-2022-JP に変換しようとすると半角カナが問題になる。パソコン通信の時代は半角カナがふんだんに使われているが、ISO-2022-JP に本来半角カナはない。全角変換を伴うと、メッセージが損なわれる可能性があるので、比較的影響の少ない UTF-8 にコンバートする事にしよう。

 ウダウダ書いたが、ぶっちゃけるとソースコードは以下のようになる。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FileCtrl, IOUtils, IdCoderMIME;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  U8: UTF8String;
  Dmy: String;
  FileName: String;
  SL: TStringList;
  Enc: TEncoding;
  Base64Encoder: TIdEncoderMIME;
begin
  if not SelectDirectory('変換したい eml の存在するフォルダを指定して下さい''', Dir) then
    Exit;
  SL := TStringList.Create;
  Enc := TEncoding.GetEncoding(932);
  Base64Encoder := TIdEncoderMIME.Create(Self);
  try
    for FileName in TDirectory.GetFiles(Dir, '*.eml', TSearchOption.soAllDirectories) do
      begin
        SL.LoadFromFile(FileName, Enc);
        // From
        for i:=0 to SL.Count-1 do
          begin
            if Pos('From: ', SL[i]) = 1 then
              begin
                // 差出人を取得
                U8 := Trim(Copy(SL[i], 7, Length(SL[i]) - 29));
                U8 := Base64Encoder.EncodeString(U8, TEnCoding.UTF8);
                // メールアドレス部分
                Dmy := Copy(SL[i], Length(SL[i]) - 2122);
                // From フィールドを置換
                SL[i] := 'From: =?utf-8?B?' + U8 + '?= ' + Dmy;
                // Reply-To を指定しないと差出人が表示されない事がある
                SL.Insert(i, 'Reply-To: =?utf-8?B?' + U8 + '?= ' + Dmy);
                Break;
              end;
          end;
        // Subject
        for i:=1 to SL.Count-1 do
          begin
            if Pos('Subject: ', SL[i]) = 1 then
              begin
                U8 := Copy(SL[i], 10, Length(SL[i]));
                U8 := Base64Encoder.EncodeString(U8, TEnCoding.UTF8);
                SL[i] := 'Subject: =?utf-8?B?' + U8 + '?=';
                Break;
              end;
          end;
        // Content-Type
        for i:=4 to SL.Count-1 do
          begin
            if Pos('Content-Type: ', SL[i]) = 1 then
              begin
                Dmy := SL[i];
                Dmy := StringReplace(Dmy, 'Shift_JIS''utf-8', [rfReplaceAll]);
                SL[i] := Dmy;
                Break;
              end;
          end;
        SL.SaveToFile(FileName, TEncoding.UTF8);
        Application.ProcessMessages;
      end;
  finally
    FreeAndnil(Base64Encoder);
    Enc.Free;
    SL.Free;
  end;
  ShowMessage('Done.');
end;

end.

 フォームにはボタンが一つだけ貼ってある状態だ。本当にやっつけ仕事だが、一応うまく動作する...イヤ、本当だってば。そんな疑り深いオマイサンにはスクリーンショットで証明せねばなるまい。括目してO野さんの有難い話を聞け。

 ちゃんとスレッドも切れてないっしょ?画面の FDELPHI?FBORLAND と間違ってインポートしちゃったのだ。O野さんの書き込みの日付に注目...あれから 16 年か。

他に巡回していた Nifty のフォーラム
 F#...じゃなかった、FSHARP とかにも行ってたな。でも、X68K 関係とかはむしろ草の根 BBS の方が多かったかも。


11/04/17

Nifty のログと全文引用するアフォ
 NifToEml...良さげだったが、アフォ対策がされていないようだ。

 Nifty の投稿データは以下のような構造になっている。

発言ID/総発言数   NIFTYID  ハンドル名      タイトル
(フォーラム番号)   日付

本文

 Nifty のログは個々の投稿データを連結したものであるため、以下のようなものになる。

00001/01000 BYF00221  DEKO             こんにちは
( 1)   11/04/17 12:00コメント数:1

こんにちは、初めての投稿です。

00002/01000 CQE02277  els              RE:こんにちは
( 1)   11/04/17 12:10

どもー (^o^)/

...

 ところがどっこい、中には "引用記号も付けずに投稿データを丸々引用する" 奴が居る訳だ。

00003/01000 XYZOOOO1  AFO              RE:こんにちは
( 1)   11/04/17 22:15  00001へのコメント   コメント数:2

他のフォーラムにいい情報がありましたよ。

00002/00500 ABCIIII0  TEST             すばらしい情報
( 6)   10/11/10 23:15

すばらしい情報です。

 こういうのが居ると、ログがこんな事になる。

00001/01000 BYF00221  DEKO             こんにちは
( 1)   11/04/17 22:00                     コメント数:2

こんにちは、初めての投稿です。

00002/01000 CQE02277  els              RE:こんにちは
( 1)   11/04/17 22:10  00001へのコメント

どもー (^o^)/

00003/01000 XYZOOOO1  AFO              RE:こんにちは
( 1)   11/04/17 22:15  00001へのコメント  コメント数:2

他のフォーラムにいい情報がありましたよ。

00002/00500 ABCIIII0  TEST             すばらしい情報
( 6)   10/11/10 23:15

すばらしい情報です。

00003/01000 BYF00221  DEKO             RE^2:こんにちは
( 1)   11/04/17 22:20  00003へのコメント                     

アフォだろ、お前。

00004/01000 CQE02277  els              RE^2:こんにちは
( 1)   11/04/17 22:30  00003へのコメント

バカだろ、お前。

...

 アフォ対策をしていない Nifty ログリーダでは、スレッドが繋がらなくなったり、読めなくなったりする。先の NifToEml で、このログから eml を生成すると、アフォの引用中の投稿データが生成され、本来の発言番号 00002 のデータが上書きされてしまう。

 まぁ、10 年以上前の事を今更責めても...いや、むしろ 10 年以上後まで迷惑掛けやがって!!

Nifty-Log to eml
 eml に吐かれたものを修正するのは面倒だし、そもそも NifToEml が複数ファイルに対応していないのが微妙に使いづらい...よろしい、ならば Delphi XE だ

 UTF-8 変換、eml 生成までこれだけで可能。アフォ対策もバッチリだ (w

 え?複数のログファイルはコマンドプロンプトから "COPY *.LOG ALL.LOG" みたいにして連結しろって?いあいあ、やってみると解るけどたまにログヘッダがあるので、連結されたログからログヘッダを除去するのがとても面倒なんだわ。もちろん、手動でログヘッダを取り除いたものを連結して使う分には問題ないのだけれどね。

 ソースコード (やっつけ) 付きなので、気に入らなかったら自由に改変して使って欲しい (GPL / LPGL とかケチ臭い事は言わない)。コンパイルには Delphi 2010 以降と SkRegExp / SkRegularExpressions が必要。純正の TRegExp でもいいけど、正規表現文字列が違っててちゃんと動かなくったって責任は持てないので注意。大した事はやってないので、Delphi XE Starter でもコンパイルできると思う。

 一番の問題点は、"今更、誰がこれを使うというのだ?" という事かな...あはははは orz

Thunderbird (Portable Edition 含む) に eml を大量にインポートするには?
 "ImportExportTools (MboxImport enhanced)" という拡張を使うと、eml をフォルダ指定でインポートできます。

 途中までしか取り込めない時は、大量の eml を Explorer から Thunderbird に一括で放り込み、「時間が掛ってるヨ。スクリプト実行する?やめる?」のダイアログを出して、"今後確認しない" にチェックを入れて続行すると、次回からはインポートミスがなくなると思う。

Nifty-Log to eml ちょっと機能追加
 Nifty-Log の中にはメーラで投稿されたものがあり、タイトルが文字化けしているものがある。これらは手動で修正するしかない。

 何故自動化できないのかと言うと、BASE64 化された事により "元のタイトルよりも文字数が長くなってしまい切り詰められてしまう事があるから" だ...つまりは、正常に復号できない可能性が高い、と。その投稿にレスが付いていればレスから判断して修正可能だが、レスが付いていない投稿の場合には BASE64 化された文字列から修復するしかないのがとても痛い。

 新たに [ISO-2022-JP の件名を変換] ボタンを追加しておいたので、BASE64 化されてしまったタイトルを貼り付ければ、元の文字列に復号してくれる...もちろん Nifty の文字数制限によって切り詰められている可能性があるので、正しく元通りに復号できるとは限らないのだが。


11/04/18

Nifty-Log to eml ちょっと修正
 派手にメモリリークしていたので修正。元々やろうとしていた事のためのコードを使いまわそうとしたのが間違い。いくらやっつけ仕事でも "ReportMemoryLeaksOnShutdown := True;" を一度位は試そうね、といういい例。

Get RAD Studio XE at the Delphi/C++Builder Price!
 日本では行われていないキャンペーンなのだけれど、一応情報として。2011/06/30 までの限定で Delphi XE の価格で RAD Studio XE が買える。

 今回は Delphi 単体よりも Rad Studio を買う方がオトクなのは 以前にも書いた 通りで、例えばバージョンアップ版を購入できるのなら、$499 出せば Professional 版の 7 製品、14 パーソナリティを利用する事が可能 となる。全部普通に買ってたら幾らになるんだろうな (^^;A

 英語版を購入する事に抵抗がない方は一考の価値があるかもしれない。英語版とは言え、最近の製品はちゃんと日本語 UI にする事が可能 だからだ。なお、このキャンペーンが日本で行われるかどうかは定かではない。

TMS Smooth Controls for Delphi and C++Builder XE
 おっと、書き忘れ。"Get RAD Studio XE at the Delphi/C++Builder Price!" キャンペーンでは TMS のVCL が貰えるが、既存の XE ユーザも既に DL 可能となっている。

 で、"TMS Smooth Controls" が使える事になった訳だが、もういっその事標準添付にすればいいのにと思う。


11/04/19

SKRegExp Trainer
 "Delphi 2005 以降で利用可能な SkRegExp (小宮さん作の正規表現クラス)" の練習ツール。

 とりあえず、Expression (エディットボックス) に

^(?<Year>\d{2,4})\/(?<Month>\d{1,2})\/(?<Day>\d{1,2})

 InputString (メモフィールド) に

2011/1/11
120000/01/01
95/2/12
2011/03/13
95/04/14

 って入力して、MultiLine にチェック入れて Execute ボタンを押してみよう。検索にマッチしたら Next ボタンで次以降をマッチさせる事が出来る。

 ...まぁ、そういう事だ。なんとなく使い方は理解できると思う。コントロールのキャプションは SkRegExp のプロパティに準拠してある。違うのは Exec / ExecNext メソッド (Execute / Next ボタン) だけだと思う。


11/04/20

PerlRegExp Trainer
 Delphi XE から標準搭載された TPerlRegEx (正規表現クラス) の練習ツール。

 とりあえず、RegEx (エディットボックス) に

^(?<Year>\d{2,4})\/(?<Month>\d{1,2})\/(?<Day>\d{1,2})

 Subject (メモフィールド) に

2011/1/11
120000/01/01
95/2/12
2011/03/13
95/04/14

 って入力して、MultiLine にチェック入れて Match ボタンを押してみよう。検索にマッチしたら Again ボタンで次以降をマッチさせる事が出来る。

 ...まぁ、そういう事だ。なんとなく使い方は理解できると思う。コントロールのキャプションは TPerlRegEx のプロパティに準拠してある...なんてデジャヴな記事だ (w

 TPerlRegExSkRegExp と違い、グループ名を返してくれるプロパティはない (多分)。また、

 各プロパティの添え字 0 には SkRegExp と同様に全体のマッチ結果が格納されているが、それとは別に全体の一致結果を返す  が用意されている。TPerlRegEx.MatchedText は全体に一致した文字列で、TPerlRegEx.Groups[0] と同義となる。

 一応断っておくと、SkRegExpTPerlRegEx もグループ名またはグループインデックスから一致したグループを指定する事は可能。TPerlRegEx に存在しないのは、検索結果からグループ名を取得する手段。自分で名前付きグループを指定しているのだから、名前が分からなくて困る事はないとは思う...今回のようなトレーナを作る用途でもない限りは。

VBSRegExp Trainer
  VBScript の TRegExp (正規表現クラス) の練習ツール。Delphi から VBScript の正規表現を使う方法は Mr.XRAY 氏の記事 "952_DelphiでVBScriptの正規表現 " を参考にして貰いたい。

 とりあえず、Pattern (エディットボックス) に

([A-Z])([a-z]+)

 String (メモフィールド) に

Book Pen Apple Flower Sea Tree

 って入力して、MultiLine にチェック入れて...あ、入れなくていいや。そのまま Execute ボタンを押してみよう。検索にマッチしたら Next ボタンで次以降をマッチさせる事が出来る。

 ...まぁ、そういう事だ。なんとなく使い方は理解できると思う。コントロールのキャプションは TRegExp のプロパティに準拠してある...何故か同じ記事を 3 回読んだ気がするぞ (w

 TRegExp はグループ名を返してくれるプロパティはない (多分) 上に、グループの位置と長さを取得する方法もない (多分)。え?「正規表現のサンプルが今までと違う」って?サンプルを "VBAで正規表現を使う (CodeZine)" からパクってきたからだよ。何故って...

動かねぇんだよ、これが...orz

 TRegExp は先の二つと比較すべきじゃないと思う。比較するのなら、

種類 コレクション型を返すクラス コアクラス
SKRegExp SkRegularExpressions.TRegEx SkRegExpW.TSkRegExp
Delphi XE 以降の標準 RegularExpressions.TRegEx RegularExpressionsCore.TPerlRegEx
VBScript VBScript_RegExp_55_TLB.TRegExp -

 用途からいってもこうだろうな。


11/04/21

IE にちょっとだけ優しくなりました
 このサイトは基本的に Firefox でしか表示を確認していない...個人サイトですもの。チラシの裏をそんなに一々チェックできるかっつーの。

 ...という態度を多少改めまして、IE でもそれなりに見れるようにしてみました。但し、可能な範囲で。多少マトモになったのは "ここ 1 年くらいの雑談" と "Delphi / Kylix コーナー" くらいのものだったりする。Google Chrome でもちょっとおかしかったから、直しておいて正解か。

 このサイトは 1997/10/27 からスタートしていますから、14 年目という事になります (ちなみに Yahoo!Japan は 1996/04/01 からです)。Netscape Navigator 全盛の頃からやってきたので、結構なページ数があり、とてもじゃないけどすべてを見直すのは一人じゃ無理なのです...ご了承ください m(_ _)m

 基本、サイトの確認も Netscape Navigator -> Mozilla Suite -> Firebird -> Firefox と昔から Mozilla 系でしかやってない。一時期は Mozilla の "サイトナビゲーションバー" とかにも対応させてたっけ。今ではもうすべて取り除いたけれど。ちょっと前までは Firefox 用のアドオン "Link Widgets" があったのよねー (現状、Firefox 4 には非対応)。

Portable なブラウザ
 最近は、(語弊があるが) インストールしなくても各ブラウザの挙動を確認できるので楽になった。

 Safari?知らんがな。

各正規表現トレーナ
 ソースコード公開してもよかったけど、TComboGrid (しかもカスタマイズ) 使ってるのを思い出して断念。もっとも、クラスをそのままコントロールで表現してるだけなのでソースコードもクソもない気はするが。

 気が向いたら正規表現の Tips でも書こうかな...ググればいくらでも出てくるので需要はないと思うけどなぁ...。

IEIE TabFirefox と。
 "愛しさ" も "切なさ" も "心強さ" も一切関係ない (w

 Firefox 4 を使うようになった直後は、IE Tab が動作しなくて困っていた...そもそも "IE Tab は複数存在する" のが話をややこしくしてるのだが...。ちなみに、今現在使っているのは "IE Tab +" だ。

 さて、"IE Tab" があればレンダリングエンジンを IE へと切り替えられるため、IE での表示を確認できる...まぁ、当たり前。しかし、IE8 をインストールしてあっても、"IE Tab によって Firefox 内で開かれる IE は IE8 とは限らない"

 この件は "[delphi-users: 0908] 同一マシンの TWebBrowserとInternet Explorer 8のレンダリングに違いは出るものなのでしょうか?" でもやったのでご存じの方もいらっしゃるかもしれない。簡単に言えば、

 ...という事だ。

 ...だが、しかし。"IE Tab の場合の EXE 名って何だろう?"。「firefox.exe」?残念、正解は "plugin-container.exe""IE Tab +" で IE に切り替えた時、レンダリングモードを IE8 と同等にしたいのなら、以下のレジストリファイルを使うといい。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"plugin-container.exe"=dword:00001f40

 これで、イチイチ IE を開く必要がなくなる。なお、8000 (0x00001f40) の所はバージョンを表しているので "他のバージョン相当にする事もできる" 事を覚えておくと、何かの時に役に立つかもしれない。例えば、自アプリに TWebBrowser を使ってる場合とかね。


11/04/22

サイト内検索
 トップページにあるサイト内検索を "Google カスタム検索" にしてみた。サイトマップ登録をしているせいか、少なくとも数日以内でインデックス化されるようだ。

 以前も Google ではあったのだが、単純に "site:" やってただけなので、ヒット率があまりよくなかったのです。

Themed DBGrid
 Delphi 2010 以降、DBGrid はテーマで描画されるようになった。当然 Delphi 7 ~ 2009 迄はテーマを有効にしてものっぺりとした描画にしかならなかったのだが、"Themed DBGrid runtime replacement" を使えば Delphi 7 ~ 2009 であっても DBGrid をテーマで描画してくれるようになるようだ。

 使い方は

  1. アーカイブを解凍する
  2. プロジェクトに ThemedDBGrid.pas を追加する。
  3. 再構築する
 たったこれだけ。設計時ではなく実行時のみテーマで描画される事に注意が必要。

 とりあえずスクリーンショットを。まずは設計時の画像。Delphi は 7 を利用しており、テーマが有効である (フォーム上に TXPManifest が存在する事に注意) 事を確認するために、ダミーで色々なコントロールを貼ってみた。

 次は普通にコンパイルした時の画像。TXPManifest が追加してあっても、DBGrid はのっぺりとした描画にしかならない...あれ?コントロールが消えて...あ、そうか。スクリーンショットを "Alt + Print Screen" で撮ってるからか。

 このサイトの常連さんや、僕のデブキャンセッションを聴かれた方には耳タコかもしれないけれど、Delphi 7 ~ Delphi 2006 のテーマを有効にしたアプリケーションを Vista 以降の OS で実行している場合、Alt キーを押下しただけでコントロールが消える。これを暫定的にせよ回避するには "Fix for QC report 37403 (VistaAltFix)" を使う。

 "VistaAltFix" はコンポーネントなので、インストールしてフォームに貼り付ければいいのだが、コンポーネントのインストールすら面倒なのであれば、

uses
  ..., VistaAltFixUnit;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  TVistaAltFix.Create(Self);
  ...
end;

 このように VistaAltFixUnit を uses し、Form の OnCreate に 1 行追加するだけでいい。

 Delphi 7 を使ったばっかりに思わぬ寄り道をするハメになったが、本来提示したかった画像は以下のようになる。他のコントロールはテーマで描画されているのに、DBGrid だけはのっぺりとした描画になっているのが確認できると思う。

 そしてプロジェクトに ThemedDBGrid.pas を追加してコンパイルしたもの。DBGrid がちゃんとテーマに沿って描画されている。

 確かにちょっとした違いではあるのだが、殆ど手間を掛けずに見た目をよくする事ができる。Delphi 7 ~ 2009 で DBGrid を利用している方は試してみてはいかがだろうか?

スレートPC 各種
 増えてきましたね。Dell と HP の日本法人は相変わらずですが。

 ACER ICONIA TAB W500 は、いいセン行ってると思います。ただ、Fusion APU を使うのなら C-50 だけではなく、"割り切った構成の E-350 モデルもあれば"、と個人的には思いました。E-350 では排熱がうまく行かないのかもしれませんが...。

SkRegExp version 1.1.17 リリース
 小宮さん作の正規表現ライブラリ SkRegExp の version 1.1.17 がリリースされました。併せて、先日作った SKRegExp Trainer もアップデートしてみました。


11/04/23

サービス終了のお知らせ (infoseek)
 isweb ライト に引き続き、

 もサービス終了かよ...isweb ベーシック / COOL ONLINE (有料会員) はまだ 1 年あるけどさ。

 ちなみに、

 うは、"flow of water" もか。こりゃ、あちこち巡回して情報集めとかなきゃな。

各正規表現トレーナのソースコード を公開」の巻
 がっかりする出来のソースコードかもしれませんが、一応公開してみます。

 注意点は以上となります。

 一覧にまとめてみました。

皆さんのWebサイト、ブログをエンバカデロ・テクノロジーズのWebサイトや製品で紹介しませんか?
 この企画は未だ生きていると思うので、2 つ程サイトを推薦しておいた。推薦したサイトから断られた場合も考えてどこを推薦したのかはあえて書かない事にする。

 それと...

 かなり以前に推薦した気がするのですが...何故に載っていないのだろう?断った? or 連絡してない?>お二方。

 おういえ、すぐさま推薦メールの件が メーラーデーモンさん からやってきたぞ...なになに?「embarcaderor.com って何さ?」...ぇー。応募方法にあった mailto: から送っただけなのにー。


11/04/24

Delphi の Tips
 書き途中ですが、とりあえずこれだけでも参考になるかもしれませんのでアップしてみました。

 僕が SkRegExp / SkRegularExpressions を推している理由が少しは解って頂けるかもしれません。


11/04/25

正規表現絡みの QC
 えーと。

 QC#93341 入れちゃったんですが、

 QC#87752 の重複っぽいです、てへっ♥ 内容は "MatchNext がうまく動かない" というものです。具体的な修正方法は QC#87752 のコメント欄にある URL から辿れる http://www.regexguru.com/2010/09/bug-in-delphi-xe-regularexpressions-unit/ にあります。

 もう一つ入れた QC は、

 QC#93333 です。名前付きグループがおかしくなる件 ですが、例として挙げている正規表現文字列はありきたりなものなので通らないハズはなく、グループの名前を変えれば通るのが摩訶不思議です。また、正規表現文字列そのものを変えるとグループ名に Year や Day が使えたりします...ちょっと理由が解りません。

 ...それにしても、SkRegExp / SkRegularExpressions ばっかり使ってるのがバレバレですね。

正規表現絡みの QC...の続き
 追記です。QC#93333 で言ってた内容は、

 上記 QC によると "time" でも同じ事が起きるようですね。これまた重複 QC かな?

 QC#93341の件は、「TRegEx.Match を直接呼び出さなければうまく動く」との事。

procedure TForm1.Button1Click(Sender: TObject);
const
  Exp = '[吉|\x{20BB7}]野[屋|家]';
var
  Regex: TRegEx;
  Match: TMatch;
  Dmy, mValue: String;
  mStart, mLength: Integer;
begin
  Memo2.Lines.Clear;
//Match := TRegEx.Match(Memo1.Lines.Text, Exp);
  RegEx := TRegEx.Create(Exp);
  Match := RegEx.Match(Memo1.Lines.Text);
  while Match.Success do
    begin
      mValue  := Match.Value;
      mStart  := Match.Index;
      mLength := Match.Length;
      Dmy := Format('%s (%d, %d)', [mValue, mStart, mLength]);
      ShowMessage(Dmy);
      Match := Match.NextMatch;
    end;
end;

 こんな感じで。.NET のRegEx を模して作られているので、同じような記述 で動作する事を期待しちゃいますね...どうしても。

SkRegularExpressions ver0.9 リリース
 QC#93341 の試験をパスする SkRegularExpressions ver0.9 がリリースされました (ラッパークラスの方です)。多謝 m(_ _)m


11/04/26

Internet Explorer 9 日本語正式版
 全世界から遅ればせながらリリースされました。既に DL 可能です。なお、"XP では動作しません" からね?ちゃんと "CSS3 ドラえもん" が丸く見えてますか?

 "IE Tab" の件 は以下のレジストリエントリで良いようです。

Windows Registry Editor Version 5.00

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

".NET のRegEx を模して作られている" (中略) "期待しちゃいます"
 この C# の例

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "a*";
      string input = "abaabb";

      Match m = Regex.Match(input, pattern);
      while (m.Success) {
         Console.WriteLine("'{0}' found at index {1}.", 
                           m.Value, m.Index);
         m = m.NextMatch();
      }
   }
}
// The example displays the following output:
//       'a' found at index 0.
//       '' found at index 1.
//       'aa' found at index 2.
//       '' found at index 4.
//       '' found at index 5.
//       '' found at index 6.

 Delphi で書き直すと、

program Example;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  RegularExpressions;
//SkRegularExpressions;

const
  pattern: string = 'a*';
  input: string   = 'abaabb';
var
  m: TMatch;
begin
  m := TRegEx.Match(input, pattern);
  while m.Success do
    begin
      Writeln(Format('"%s" found at index %d.',
                     [m.Value, m.Index]));
      m := m.NextMatch;
    end;
end.
// The example displays the following output:
//       "a" found at index 1.
//       "" found at index 2.
//       "aa" found at index 3.
//       "" found at index 5.
//       "" found at index 6.
//       "" found at index 7.und at index 6.

 こうなると思うのだけれど (帰ってくる文字列のインデックスは 0 ベースと 1 ベースの違いがあるから仕方がないとして) 、

program Example2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  RegularExpressions;
//SkRegularExpressions;

const
  pattern: string = 'a*';
  input: string   = 'abaabb';
var
  m: TMatch;
  RegEx: TRegEx;
begin
  RegEx := TRegEx.Create(pattern);
  m := RegEx.Match(input);
  while m.Success do
    begin
      Writeln(Format('"%s" found at index %d.',
                     [m.Value, m.Index]));
      m := m.NextMatch;
    end;
end.
// The example displays the following output:
//       "a" found at index 1.
//       "" found at index 2.
//       "aa" found at index 3.
//       "" found at index 5.
//       "" found at index 6.
//       "" found at index 7.

 今の所、こうしか書けないという事。SkRegularExpressions ver0.9 では Example のコードも通るようになったけれど。

Capture コレクション
 (正規表現の話です) ラッパークラスの Capture コレクションは未実装なのか。まぁ、使い所が限られてくるので Capture はとりあえずいいか。

468_各種システム設定ダイアログの表示]を追加 (Mr.XRAY)
 ...そう来ましたか、マスター。

 Vista 以降って、コントロールパネルの配置が変わってて "どこに何があるのかを探すのがとても面倒" だったりするけれど、マスターのトコにあったようなサンプルを発展させて Delphi の "IDE インサイト" 的なランチャーを作ったら便利かもしれないなとちょっと思った。

Rad Studio のブラウザ (Welcome ページ含む) ってさ...
 IE コンポーネント使ってるよね?という事は...

Windows Registry Editor Version 5.00

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

 "BDS.EXE を指定しちゃえば...?"

 これであちこちのサイトを Rad Studio 内のブラウザで見れるっ!( ・∀・)人(・∀・ )...でも、Embarcadero フォーラムとかはタブに表示されるタイトルが変更される度に再描画される (やってみると解ります) のであまり快適じゃないかも...(´・ω・`)ショボーン 同一ウィンドウ内でページ遷移させる為に TWebBrowser を 2 つ使ってるのかな?

 なお、ブラウザ (レンダリングモード) が何になっているのかは http://www.useragentstring.com/ で確認する事ができます...ま、どこでもいいんだけどさ。

Document Explorer (MS-Help2) ってさ...
 IE コンポーネント使ってるよね?という事は...

Windows Registry Editor Version 5.00

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

 "dexplore.exe を指定しちゃえば...?"

 ( ・∀・)人(・∀・ )これでイザって時はこっちでブラウズできるぜい!


11/04/27

SkRegularExpressions ver0.91 リリース
 TRegEx との互換性 (Replace) が向上しています。多謝 m(_ _)m

正規表現の Tips
 コンテンツがかなり充実してきました。

 軽く紹介するだけのつもりが、あれやこれやで増えてしまいました (^^;A これでもまだ書き途中です。


11/04/28

Delphi / C++ Builder 関連サイト検索
 Delphi Tips ページ の下部に "Delphi /C++ Builder 関連サイト検索" を付けてみました。

 自サイトを持ってらっしゃる方は http://ht-deko.minim.ne.jp/searchresult2.html に直接リンクしておくと便利かもしれません。Back ボタンを押した場合には、このサイトではなく "呼び出し元のサイト" に戻るようになっています。ご自由にどうぞ。

 この関連サイト検索は、基本的に日本語のサイトのみを検索してくれます (Embarcadero の公式サイト等は引っ掛かります)。ここ 1~2 年内に更新のあったサイトを中心に検索リストに突っ込んでありますので、かなりノイズの少ない検索結果が得られると思います (現在 300 サイト)。

 Delphi /C++ Builder 関連の情報や Tips を公開されているサイトで、検索に引っ掛からないサイトがありましたらお知らせください。順次検索リストに突っ込みますので。

iPad2 の発売日
 震災の影響で Internet Explorer 9 日本語正式版 同様に発売が遅れていた iPad2 ですが、確か本日より発売になるハズです。


11/04/29

Delphi のサイトを見つけるのは簡単だが、C++ Builder のサイトを探すのは難しい。
 ネタばらし。

 単純に "Delphi" で検索すると "車のメーカ" がヒットしたり、"Delphi for PHP (現 RadPHP)" が引っ掛かったりする。それでも有名なサイトや頻繁に更新があるサイトは検索上位に来るので、適当な単語を追加してやればピックアップする事ができる。

 問題なのは、更新頻度が少なかったり、海外ドメインだったりで検索下位に沈んでしまっているサイトだ。これらをピックアップするにはどうしたらいいのか?

 これが実は非常に簡単な事で、"Delphi begin end" で検索 してやればいい。"漢はコードで語る" 方が多いので、これでかなり拾える。いつもネタにされる begin~end がこんな場面で役に立つとはヴィルト先生ですら思わなかっただろう。"Delphi for PHP" では begin~end なんて使わないのでこれを除外する事ができる...逆に "Delphi for PHP" の情報を探すのは難しいのだが...。

 "Delphi for PHP" の情報を探すのが難しいのと同じ理由で "C++Builder" の情報を探すのは困難を極める。"C++Builder" "C++ Builder" "BCB" と、サイトによってメインの呼び方が違うので、これを拾い上げるのはかなり難しい。特に特徴のある記述がソースコード中にある訳じゃないので、普通に C++ の情報にヒットしてしまったりする。"C++Builder 固有の情報" というのは案外探しにくいものだ。闇雲に検索しても当たりを引く確率が低いので、"C++Builder" を扱っているサイトからのリンクで芋づる式に辿ってサイトリストに突っ込んでいる。

 "C++ Builder" にはこの際、別のユニークな名前を付けてもらえるとヒットしやすくていいんだがなぁ...例えば "俺の C++ がこんなに可愛いわけがない"、略して "俺++" とか...って、それは やまぎぅさんのサイト か (w

Firebird Wiki
 うぐぅ...Firebird Wiki って死んでないか?メンテ中なのだったらいいのだが...。

正規表現の Tips (完成)
 とりあえず完成。追記したトピックは以下の通りです。

 なんとか形になりました。

ONKYO スレート PC の新型
 TW317A7PH / TW117A6PH が発表されました。旧機種との差異だけを列挙してみます (旧機種の情報はこちら)。

 まずは TW317A5 -> TW317A7PH。

機能 TW317A5 TW317A7PH
OS Windows 7® Home Premium 32ビット 正規版 (日本語版) WindowsR 7® Professional 32ビット 正規版 (日本語版)
システムメモリー 1GB 2GB
動作時間 約5時間 約4.4時間
ドッキングコネクタ
ソフトウェア Windows Live® Mesh
価格 ¥69,800 ¥79,800

 メモリが 2GB になったのと OS が Home Premium からProfessional になっており、何故か駆動時間が落ちています。他の違いと言えばドッキングコネクタくらいですが、Bluetooth があるのですから、ドッキングコネクタではなく接点式の充電スタンドでよかった気がします。

 次に TW117A4 -> TW117A6PH。

機能 TW117A4 TW117A6PH
OS Windows 7® Home Premium 32ビット 正規版 (日本語版) WindowsR 7® Professional 32ビット 正規版 (日本語版)
システムメモリー 1GB 2GB
動作時間 約3.8時間 約3.5時間
ソフトウェア Windows Live® Mesh
価格 ¥49,800 ¥59,800

 上位機種同様、メモリが 2GB になったのと OS が Home Premium からProfessional になっており、何故か駆動時間が落ちています。

 Windows Anytime Upgrade (Home Premium -> Professional) が 1 万円程度ですから、"メモリが倍増している分だけ相対的に安くなった法人向けモデル" と位置付ける事ができると思います。新型というより新グレードってトコですかね。


11/04/30

コードエディタで開いているファイルの保存先をエクスプローラで開く。
 ソースファイルのある場所をエクスプローラで開きたい事が多いので、[ツール | ツールの構成...] から...

 このように登録していると便利なのだけれど、Delphi XE に限って言えば、

 プロジェクトを保存しているのなら、プロジェクトマネージャからエクスプローラを開く事ができる。

Internet Explorer 9
 HTML5 とかハードウェアアクセラレーションの類は暴力的なまでに速いな>IE9。例えば Speed Reading なんて Firefox 4 と比べると雲泥の差がある...Firefox 6 (alpha 1) もまたクソ速いのだが、出てもいないものは比較対象にすべきじゃないと思うし。

 IE9 だと、"SVG 女子" なんかも滑らかに動作するが、こういうものを見ていて思うのは、「ブラウザ依存問題がまた再燃するんじゃね?」 という事。実装レベルに合わせて HTML の動作レイヤーを定義すべきなんじゃないかと思う。

 その他のブラウザテストは http://ie.microsoft.com/testdrive/Views/SiteMap/Default.html から。Microsoft のサイトだからと色眼鏡で見ない方がいいかも...客観的にブラウザの挙動を知るのは悪い事じゃないと思うし。

イタ電
 巷ではゴールデンウィーク真っ最中ですが、こちとら仕事です。てーかさ、「連休明けに使いますから」 とか、俺に GW 休むなって話なのよね。こうなると、誰かにイタ電 (嫌がらせともいう) をしたくなってしまうのが心情というものです。

 さて、黒 DEKO さんは先日、Nifty-Serve のログを整理中に面白い投稿を見つけました。それは "FDELPHI MES( 6):入門者のための Pascal文法とDelphi-IDE" の

[36383] スピーカー音で電話をかけたい

 でした (Nifty-Serve ログをお持ちの方は内容をご確認下さい)。結局スレッド中で解決はしていないのですが、「コレは面白そうだ」と思って仕組みを調べた事がありました。

 具体的な情報はというと...

 WikiPedia に全部書いてありました。信号音 100ms とミニマムポーズ 50ms で仕様に一致しますわね。

 さて、どうやって信号音を生成するかですけど、そこは仕事の合間の暇潰し。コスト (時間) を掛けていたらシャチョサンに怒られてしまいます...ここは一つ、ローテクで行く事にしましょう。

  1. 信号音は Wikipedia にある (パブリックドメイン) のを使う。
  2. 音声ファイルは ogg なので、まず wav に変換。
  3. 長さ制御が面倒なので、100ms にトリミング。
  4. これをリソースファイルにブチ込む。
  5. MMSystem.PlaySound() を SND_SYNC (再生終了まで処理が戻らない) で連続再生。
 概略はこんな所です。周波数と ms を指定できる Windows.Beep() で信号音を生成する事も考えましたが、あくまで単音なので今回の用途には使えません。

 そして、なんだかんだしているうちに出来上がったのが以下のソースです。

unit dtmf;

interface

uses
  Classes, SysUtils, MMSystem;

type
  { TDTMF }
  TDTMF = record
  public
    class procedure Play(const aPhoneNumber: string; aMinimumPause: Integer = 0); static;
  end;

implementation

{ TDTMF }

class procedure TDTMF.Play(const aPhoneNumber: string; aMinimumPause: Integer = 0);
var
  C: Char;
  {PlayWav Begin}
  procedure PlayWav(aC: Char; aMinimumPause: Integer);
  var
    RS: TResourceStream;
    ResName: String;
    dC: Char;
  begin
    // Generate Resource Name
    case C of
      '#': dC := 'N'// Number
      '*': dC := 'S'// Asterisk
    else
      dC := aC;
    end;
    ResName := Format('DTMF_%s', [dC]);
    // Play DTMF 100ms
    RS := TResourceStream.Create(hInstance, ResName, 'WAV');
    try
      PlaySound(RS.Memory, 0, SND_MEMORY or SND_SYNC);
    finally
      RS.Free;
    end;
    // Sleep <aMinimumPause>ms (Minimum Pause)
    Sleep(aMinimumPause);
  end;
  {PlayWav End}
begin
  // Play Null
{
  PlayWav('_', 0);
}
  // Play DTMF
  for C in aPhoneNumber do
    if CharInSet(C, ['#''*''0'..'9''A'..'D']) then
      PlayWav(C, aMinimumPause);
end;
end.

 短いですね。え?何故関数じゃないのかって?最初はもっと機能が要るかなと思って用意してたら、結局使わなかったってだけです。他意はありません (w

 使い方は以下のようになります。

uses
  ..., dtmf;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TDTMF.Play(Edit1.Text, 10);
end;

 これまた短いですね。Button1 を押すと Edit1 に入力された電話番号を再生しますので、PC のスピーカーに受話器を近づけて下さい。本気 (と書いてマジと読む) で使う気なら、二重再生防止の機構をちゃんと実装して下さいね。

 2 番目の引数はミニマムポーズですが、PlaySound() の再生オーバーヘッドがあるので、0 ms (= 引数省略) でもイケると思います。最初に無音の wav を再生しようとしているのは、PlaySound() が等間隔で鳴らない事があったからですが、この処理はあってもなくてもあまり変化はありませんでした。

 リソーススクリプトファイル (dtmf.rc) はこんな感じです。

DTMF_0     WAV "WAV\Dtmf0.wav"
DTMF_1     WAV "WAV\Dtmf1.wav"
DTMF_2     WAV "WAV\Dtmf2.wav"
DTMF_3     WAV "WAV\Dtmf3.wav"
DTMF_4     WAV "WAV\Dtmf4.wav"
DTMF_5     WAV "WAV\Dtmf5.wav"
DTMF_6     WAV "WAV\Dtmf6.wav"
DTMF_7     WAV "WAV\Dtmf7.wav"
DTMF_8     WAV "WAV\Dtmf8.wav"
DTMF_9     WAV "WAV\Dtmf9.wav"
DTMF_A     WAV "WAV\DtmfA.wav"
DTMF_B     WAV "WAV\DtmfB.wav"
DTMF_C     WAV "WAV\DtmfC.wav"
DTMF_D     WAV "WAV\DtmfD.wav"
DTMF_N     WAV "WAV\Dtmf-.wav"      // Number (#) 
DTMF_S     WAV "WAV\DtmfStar.wav"   // Asterisk (*)
DTMF__     WAV "WAV\DtmfNull.wav"   // Null

 wav ファイルをご自分で用意されるのが一番ですが、面倒臭がり屋さんのために リソース付きソース を用意しておきました。

 それでは、皆さんご一緒に Let's イタ電!!...すんなよ? (^^;A

SkRegExp version 1.2.0 リリース
 小宮さん作の正規表現ライブラリ SkRegExp の version 1.2.0 がリリースされました。併せて、先日作った SKRegExp Trainer もアップデートしてみました。

[ツール | ツールの構成...]
 ...これで思い出したぞ。"ツールの構成" はパラメータ指定に挙動不審なトコがあり、具体例は以前にも雑談で書いた事がある。

 QC#44304 の重複と言われたのでそのままにしておいたが、この QC は Close になっている上に、僕の指摘した件は解決しないのだった。てな訳で QC 入れた。

 "()" を含むパスを直接指定できない訳なんだが、64bit OS では "C:\Program Files (x86)" とか、"()" を含むパスは普通にあるからな。

ToDo リスト
 もう一つ思い出した。先日書いた QC#88114 の件はソースファイルを UTF-8 にすると解決するのだけれど、ToDo にも同じような問題がある。

 同様に、ToDo もソースファイルが UTF-8 とかじゃないとリストアップしてくれない (プロジェクトを閉じて再度開くと表示されない)。この件は Delphi 2010 で直ったと思う。ただ、Delphi XE を購入して、それに付属している Delphi 2007 を併用しているヒトは注意が必要です。なお、この QC の投稿者は totonica△ です。


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