C++Builder好きの秘密基地 このページをアンテナに追加 RSSフィード

2012-03-10

第21回エンバカデロデベロッパーキャンプに行ってきた

ある意味、ネタ満載の楽しい「キャンプ」でした。まとめるのが面倒なので、箇条書き。

  • C++Builder使いにとっては、今年は俺のターン!!
  • お、俺はデモの神にそそのかされて無理矢理失敗させられたんだって感じで、最高のタイミングでデモの神が降臨するなwwwwwwww まぁ、おいらも何度も経験しているし。
  • FastReportはかなり使える。帳票の類いを自前で書いていた身としては、このツールあればそんなに苦労しなくて済んだのに。
  • Firemonkeyが楽しすぎる件についてwww
  • うん、IP eachableな環境を整えないと…。Wifi Pocketに寄生させていただきました。ありがとうございます。<(_ _)>
  • 今朝は「地獄のミサワ」状態wwwwww
  • えーと、ぼく、でるふぁいぜんぜんわからないから、ごうかくてんみまんでもいいよね。
  • ええ、そうですか。Mac MiniIYHしないといけないのか。オゼゼが全くないのに。orz

追記:
おいらの愛機たるHPのDV7-6100だと、デフォの状態ではFiremonkeyが動かない。orz
どうもGPU切り替え機能が悪さをしている模様。
対応策としてBIOSGPUを常時有効状態にするか、デフォGPUを使用するアプリRAD StudioそのものとFiremonkey使用の自作アプリを追加すればOK。
さらには、HP製のPCに環境変数"PLATFORM"が定義されているので環境変数絡みの問題を解決しないと、ビルドが出来ないので要注意。

2011-11-13

Webセミナー「アンドキュメンテッド(?) VCL 〜逆引きVCL新機能〜」自己フォロー

QAで指摘があった件を試してみました。

TListViewのグルーピングがうまくいかなかった件

本当は、こんな感じに表示されるはずでした。
テストは、64bit版のWindows 7でテーマ有効。実機はWindows 7の32bit版。この辺の差異かな…。

TDirectory.GetFilesでファイル属性を取得する

TDirectory.GetFilesはファイル名だけかと思いきや、無名メソッドを使用するバージョンで属性とか取れるという指摘があったので試してみました。
結果をフィルタリングするために使われる TFilterPredicate オプションがあって、そこで属性を取得。
Delphiのサンプルはこんな感じ。

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir : String;
  Root: WideString;
  Files: TStringDynArray;
  FilterPredicate: TDirectory.TFilterPredicate;
begin
  Dir := GetMyDocumentsPath(CSIDL_PERSONAL);
  if SelectDirectory('フォルダを選択してください。', Root, Dir, [sdNewUI]) then
    Edit1.Text := Dir;

  with Memo1 do begin
    Clear;
    Lines.BeginUpdate;
    // ファイルを検索
    Files := TDirectory.GetFiles(Edit1.Text, '*.pas', TSearchOption.soAllDirectories,
        function(const Path: string; const SearchRec: TSearchRec): Boolean
        begin
            Lines.Add(Format('Path = %s Size = %d', [Path + SearchRec.Name, SearchRec.Size]));
            Result := true;
        end
    );
    Lines.EndUpdate;
  end;
end;

引数に無名メソッドを渡し、その中でファイルの属性を取得する。

C++Builderの場合は無名メソッドコンパイラがサポートしていないので、TCppInterfacedObject<TDirectory::TFilterPredicate>を継承したクラスで判定する。(参考:http://www.gesource.jp/weblog/?p=4509

class Filter : public TCppInterfacedObject<TDirectory::TFilterPredicate>
{
public:
  bool __fastcall Invoke(const System::UnicodeString Path, const Sysutils::TSearchRec &SearchRec)
  {
    UnicodeString s = Format("Path = %s Size = %d", ARRAYOFCONST((Path + SearchRec.Name, SearchRec.Size)));
    Form1->Memo1->Lines->Append(s);
    return true;
  }
};

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  wchar_t DirPath[MAX_PATH];
  ::SecureZeroMemory(DirPath, sizeof(DirPath));
  ::SHGetFolderPath(0, CSIDL_PERSONAL, 0, 0, DirPath);
  UnicodeString Dir(DirPath);

  if (::SelectDirectory(L"フォルダを選択してください。", "//", Dir, TSelectDirExtOpts() << sdNewUI)) {
    Edit1->Text = Dir;
    Memo1->Clear();
    Memo1->Lines->BeginUpdate();
    // ファイルを検索
    Filter* filter = new Filter();
    TDirectory::GetFiles(Edit1->Text, "*.cpp", TSearchOption::soAllDirectories, filter);
    // delete filter; // deleteは不要
    Memo1->Lines->EndUpdate();
  }
}

フィルタリングを行うクラスのインスタンスはnewで初期化する必要があるが、明示的にdeleteする必要が無い。

ちなみに、C++11のラムダ式*1C++Builderに実装されたら、こんな感じになるのかな…。

    TDirectory::GetFiles(Edit1->Text, "*.cpp", TSearchOption::soAllDirectories, 
      [this](const System::UnicodeString Path, const Sysutils::TSearchRec &SearchRec)
      {
        UnicodeString s = Format("Path = %s Size = %d", ARRAYOFCONST((Path + SearchRec.Name, SearchRec.Size)));
        Memo1->Lines->Append(s);
        return true;
      });

ああ、滅茶苦茶便利。

*1C++Builder XE3(?)でC++11のラムダ式サポートまだぁ?(AA略

2011-09-05

第20回エンバカデロ デベロッパーキャンプで喋れなくなりました。

明日のセッションA4「アンドキュメンテッド(?) VCL 〜逆引きVCL新機能〜」は自分の諸事情により急遽講演中止となりました。
セッションを申し込まれた方、大変申し訳ありません。

明日の分は、後日Webセミナーとして実施する予定です。

2011-07-07

7月21日のウェブセミナーと、第20回エンバカデロ デベロッパーキャンプで喋ります。

7/21のオンラインセミナーは、13/14回デベロッパーキャンプでやったポインタというかメモリ管理ネタの再演。
このネタの評判がいいとの話しでオファーがあったのでオンラインセミナーとして再演します。

9/6の第20回デベロッパーキャンプは「アンドキュメンテッド(?)VCL」と称して、残念ながらドキュメントが整備されていないVCLのクラスやコンポーネントについての使用法。BDS2006以降の新機能が中心。
一応、逆引き形式なので、何かリクエストがあれば、アンドキュメンテッドなもので無くても、自分が判る範囲で対応します。
リクエストはこの記事のコメントか、Twitterの#dcamp_jpのハッシュタグでつぶやいてください。

7/26 追記:

Q&Aで、おすすめの本は?と言うのがあったので、追記。
とりあえず、こんなものかな?

Debug Hacks -デバッグを極めるテクニック&ツール

Debug Hacks -デバッグを極めるテクニック&ツール

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

Linkers & Loaders

Linkers & Loaders

Boost C++ Librariesプログラミング第2版

Boost C++ Librariesプログラミング第2版

Boost C++をチューンアップする最先端ライブラリ

Boost C++をチューンアップする最先端ライブラリ

2011-04-01

第19回 エンバカデロ・デベロッパーキャンプ セッションT3自己フォロー

参加者の皆様お疲れ様でした。プレゼンの最初でいきなりしくじってしまいましたが、何とか完走できたつもりです。不明な点等ありましたらコメントください。

C++Builderでの問題点

なぜか、IDEの言語が日本語だとC++Builderで作ったアドオンがデバッグ出来ない。*1どうも、IDEがデバッグシンボルを読み込んでくれない模様。非常に後ろ向きな解決方法として、すっぴんの仮想マシンを作成してそれにRAD Studio XEをインストール。インストールする言語は日本語と英語。BDSSetLang.exeでIDEの言語を英語にすると大丈夫っぽい。でも、自分の実機ではそれでもうまくいかないので他のアドオンとかの影響もあるのかも。*2 *3

デバッグ時にIDEをハングアップさせない方法

OTAを使うとIDEの本体にも影響がありハングするなどデバッグ時に不便なことがあり、それについて言及したのだけど、DEKOさんから「代替レジストリを使って見たらどうか」という指摘があったので試してみた。
デバッグ実行時のオプションの[実行|実行時引数]に"-rregkey"を設定すると、デバッグ時のRAD Studioが参照するレジストリがデフォルトのHKCU\Software\Embarcadero\BDSからHKCU\Software\Embarcadero\regkeyとなるので、オリジナルの環境に影響を与えないでアドオンのデバッグが可能。regkeyは任意の名前をつけられる。

f:id:A7M:20110401164350j:image

この方法に気づいていればプレゼンに入れられたのに。orz

DEKOさんへ業務連絡

Twitterのアカウントをとってくれると嬉しいかな。ちょっとした連絡事項等が(ほぼ)リアルタイムかつ、パブリックに公開できます。
あと、「s/築/筑/g」でございます。まぁ、自分の名字を説明するのに便利だし、この手の違いはずっと慣れているので、UNICODEの包摂基準なんてどうということ無いです。(ぉ

サンプルコードについて(04/06)

セッションで使用したサンプルコードを http://a7m.sakura.ne.jp/SOURCE/DevCamp19_T3_Sample.zip にアップロードしました。ご自由に使ってください。

*1Windows 7のx86とx64の両方で確認。

*2:とっととQC送りしないといけないけど、英訳('A`)マンドクセ

*3:04/08にQC#92811送り完了。