C++Builder Tips

第5回 Delphi talksに参加してきた

この手のイベントに参加するのは本当に久しぶり。楽しい時間を過ごせました。 LTのネタは諸事情により2年3ヶ月ほど塩漬け状態な、コードフォーマッタープラグインネタ。あまり役に立たない、昨日使用したプレゼンを公開します。 ちなみに、プラグインそのも…

UnicodeからShift-JISへの変換、どうする?

なし崩し的にDelphi Advent Calendar 2012に記事を書く羽目になった件について。(ぉぃ まぁ、実業務でのちょっとした覚え書きな件もあるので、いい機会だし久しぶりに更新してみる。ここ数年でプログラミング環境はUnicodeを意識せざるを得なくなった。DBの…

RAD Studio XEとF-Secure Internet Security 2011の相性問題

メインマシンのセキュリティソフトをウイルスバスターからエフセキュア インターネット セキュリティ 2011に乗り換えたのだけど、RAD Studio XEを起動すると「使用許諾コードが不正」と判断されてRAD Studioが起動しなかった。 これは、エフセキュア インタ…

C++BuilderではOpen Tools APIを使ったアドオンをデバッグできない件についての回避方法

C++BuilderではOpen Tools APIを使ったアドオンをデバッグできない件があり、これをQC#92188として登録したのだけど、Embarcaderoから回答があって一応の解決法が見つかりました。以下の手順でアドオンのデバッグが可能。 OTAを使ったプロジェクトをC++Build…

TBalloonHint::ShowHintの使い方

TBalloonHint::ShowHintに問題があるみたいで、代替にJVCLのTJvBalloonHintを使うというエントリーを書いたのだけれども、Embarcaderoの高橋さんからコメントがあって、再テスト。自分の勘違いで問題が無いことが確認できたのだけれども、以下の点に注意。 T…

Open Tools API その4:続・ソースエディタへのアクセス ソースエディタの「中身」をいじる

エディタの編集バッファ ビュー(IOTAEditView)のBufferプロパティがソースエディタ内部のバッファで、ソースファイルの中身を編集する。インターフェースはITOAEditBuffer。 ソースエディタが1つのファイルをオープンしている場合、ビューは複数あっても、…

Open Tools API その3:ソースエディタへのアクセス

モジュール モジュールとはIDEがアクセスする抽象的なエディタの組み合わせのことで、Delphi/C++Builderのプロジェクトにおけるユニットに相当。ユニットがソースファイル(*.pas/*.cpp)やヘッダファイル(*.h)、フォームファイル(*.dfm)の組み合わせであるよ…

Unified InterbaseをC++Builder XEで試してみた。

かねてから、Pro版で使用可能なFirebird/Interbase用のコンポーネントを探していて、 Unified Interbaseコンポーネントをつかってみた(その1) Delphiッこ倶楽部東京出張所でUnified Interbaseコンポーネントの解説記事 という記事がポストされていたので…

JVCLのTJvBalloonHintを使う

QC#66768によると、TBallonHintは任意の位置にバルーンヒントを表示できないっぽい*1ので、代替としてJVCLのTJvBalloonHintを使ってみる。TJvBalloonHintはTBallonHintをJVCLが拡張したコンポーネントでは無いので、使い方が根本的に違う。あと、現時点での…

ヒントの内容をHTML形式で定義して表示する

通常のポップアップヒントでは出来ない強調表示や文字の色変えをHTMLで定義して描画してみる。ただ、ポップアップヒントを表示する目的だけでIEコンポーネントやGeckoを使うのはヘビーなので、JVCLが用意してくれている簡易HTMLレンダリングルーチンを使用。…

TCustomForm::OnCreateでの注意点

フォーム作成時のエラー処理でちょっとハマったので、ほとんど覚え書き。アプリケーションの設定ファイルをアプリケーションと同じフォルダに置くことはよくあること*1だけど、設定ファイルが無い場合はデフォルト値で初期化するのではなく、アプリケーショ…

Open Tools API その2:メニューの差し替えとノーティファイアインターフェース

IDEのメニューを差し替えるには、IDEそのもののサービスであるINTAServicesのMainMenuプロパティを取得する。 これはTMainMenu型なので、通常のメニューにアクセスのと全く変わりなし。 procedure TFilterWizard.DataModuleCreate(Sender: TObject); var i: …

PrintScreenキーを無効にしてスクリーンショットを無効化する

セキュリティ的に絶対的な効果はないけど、アプリケーションの実行中にPrintScreenキーを無効にしてスクリーンショットを撮れなくするのはそれなりの抑止力があるはず。キーストロークをWindowsに登録するホットキーはフックよりも実装が楽。元ネタは、ここ…

Universal Character Set Detector C LibraryをC++Builder XEから使用する

Mozillaのエンコーディング自動判別ライブラリである「universalchardet」をDLL化したのをC++Builderで動作させてみました。C++Builderでの修正箇所はprmem.hの「#include 」を「#include 」にするだけ。アーカイブはhttp://a7m.sakura.ne.jp/SOURCE/univers…

Update Pack 1 for C++Builder XEのBoost Update 1についてのちょっとした注意

Boost Update 1を含むRAD Studio XE/C++Builder XE Update1がリリース。ただし、Boost Update 1にすると、boost::tupleを使っている部分でコンパイルエラーになるので以下の部分を修正。$(BDS)\include\boost_1_39\boost\tr1\detail\config.hppの48行目、"(_…

Open Tools API その1:"Hello,World!"を表示してみる

プロジェクトの作成 IDEへのアドオンは、パッケージを作成してそれをIDEに「登録」することで実装される。RAD Studioの場合、[ファイル|新規作成|パッケージ-Delphi]で新規プロジェクトを作成する。Open Tools APIのクラスやインスタンスは通常のプロジェク…

Open Tools API その0:概要

戯言前口上 RAD Studioにコードフォーマッターが実装されても、残念ながら、宗教論争にすらなるC/C++のコーディングスタイルすべてをカバーし切れていないのが不満。ということで、RAD Studioのコードエディタ上からGNU IndentやUncrustifyといった既存のコ…

RAD Studio XEからSSHトンネリングを利用してSunversionリポジトリにアクセスする

LinuxやFreeBSDといったUnix系OSにSSHとSubversionがインストールされていれば、RAD Studio XEからでもSSHトンネリングを利用してリモートのSubversionのリポジトリにアクセスできる。 サーバーは以下のように設定されているものとするので、適宜読み替えて…

第17回 エンバカデロ・デベロッパーキャンプ セッションB2自己フォロー その2:Delphi用のプロジェクトしかないコンポーネントをC++Builderにインストールする

RAD Studio(C++BuilderとDelphiの両方)がインストールされている場合は、Delphi用のプロジェクトのプロジェクトオプションを変更することによって、C++Builderのプロジェクトでも使用可能。当然、コンパイル後のパッケージではなくソースコードが必要。 RA…

第17回 エンバカデロ・デベロッパーキャンプ セッションB2自己フォロー その1:JCL/JVCLをRAD Studioへインストールする

RAD Studio XEにインストールする場合は以下の点に注意。RAD Studio XEはJCL2.21 & JVCL2.40で対応。これらは、パートナーDVDに含まれている。 $(BDSCOMMONDIR)*1にフォルダ"hpp"を作成する。C++Builderが使用するJCLのヘッダファイルはここに生成される。*2…

RAD Studio XEファーストインプレッション その3:VCL&サードパーティコンポーネント編

UnicodeStringに関するちょっとした仕様変更 UnicodeString::t_char()は移行期間が過ぎたということで「非推奨」に。それに伴い、プロジェクトのTCHARのマッピングがデフォルトでwchar_tに。よって、C形式の文字列ポインタ(const wchar_t*)が欲しい場合は、c…

RAD Studio XEファーストインプレッション その2:C++ライブラリ編

C++RTLの更新 まず、ディスカッションフォーラムで問題になっていた、ストリームIOについての致命的なバグはFIXされました。こんなコードを喰わせると何故か文字化け。 #include <string> #include <iostream> #include <locale> int main() { char locale[] = "japanese"; std::locale</locale></iostream></string>…

RAD Studio XEファーストインプレッション その1:Subversion編

"Fulcrum"のコードネームで開発されていた、C++Builder/Delphiの新バージョンが"RAD Studio XE"として発表。 ベータテストをやっていたのだけど、表に出せる部分は出してもいいよとのお達しがEmbarcaderoから来たので、ほんの少しだけ晒してみる。 もちろん…

C++Builder 2010 でHTMLヘルプを使用する

既に情報は出ているけど、個人的なニーズがあってまとめてみた。 1. アプリケーションがHTML Helpを表示するようにする。 適当なソースコード(WinMainがあるコードかメインフォームのコードが一番無難かも)に以下の2行を追加。#include <HtmlHelpViewer.hpp> #pragma link "HTML</htmlhelpviewer.hpp>…

dbGo(ADO)を使ってODBC経由でCSVファイルをパースする

前準備: Windowsが64bit版の場合は、コントロールパネルの「ODBC (32ビット)」ではなく、32bit版の"C:\Windows\SysWOW64\odbcad32.exe"を実行する。 ユーザーDSNかシステムDSNに"Microsoft Text Driver"が含まれているか確認。 接続: OLE DB プロバイダー…

自分自身のリソースからアプリケーション名とバージョン番号を取得する

C++Builderの[プロジェクト|オプション|バージョン番号]で設定したバージョン番号を取得するには、GetFileVersionInfoとVerQueryValueを使用してアプリケーションの情報を取得する。VerQueryValueで戻ってくるサイズは文字数。 UnicodeString GetApplicat…

C++Builder2010にDelphi用のシェルコントロールコンポーネントをインストールする。

$(BDSCOMMONDIR)\Demos\CPP\Apps\ShellControlsにある、C++Builder用のシェルコントロールコンポーネントが不安定なので、Delphi用のサンプルをインストール。 [ファイル|新規作成|パッケージ]で新規パッケージを作成する プロジェクトを保存。プロジェクト…

bcc32.exeの拡張構文"__property"と仮想関数

アクセスメソッドは多用しても、プロパティは標準C++に無いからあまり使っていなかったけど、「シンタックスシュガー」としては激しく便利。 ただ、仮想関数との兼ね合いがちょっと気になったので試してみた。 //------------------------------------------…

正規表現チェッカーの技術的な解説もどき

今回リリースした正規表現チェッカーはBoostにかなり依存しているのだけど、コアとなるboost::regexだけではなく、 boost::foreach boost::preprocessor boost::shared_ptr なんてものを使ってます。特に、boost::preprocessorはかなり協力。VCLコンポーネン…

ストリーム入出力を使用して、文字コードがUTF-8なファイルを読み書きする

Boostのutf8_codecvt_facetをインクルードして、imbueでストリームに設定してやればOK。 libs/detail/utf8_codecvt_facet.cppもインクルードしてやらないとリンクエラーが発生。 UnicodeStringをstd::wstringにしてもちゃんと読み書きできる。 参考URL: htt…