読者です 読者をやめる 読者になる 読者になる

第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…

1ドット間隔の点線を描画するペンを作成する

TPenのStyleプロパティにpsDotを設定しても1ドット間隔の点線を描画してくれない。この場合はExtCreatePen APIでジオメトリックペンを作成し、それをTPenに結びつける。 LOGBRUSH logBrush; logBrush.lbColor = RGB(0x00, 0x00, 0x00); logBrush.lbHatch = 0…

C++Builderのライブテンプレート

ライブテンプレートが手軽で、かつ、かなり便利なのでライブテンプレートの作り方とC++Builder2009のライブテンプレートを使うを参考に作ってみた。作ったのは、アクセサの自動生成。アクセサとプロパティの宣言部分(accessor_decl.xml) <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0"> </codetemplate>

C++Builder/Delphiの色設定をUniSynEditに反映させる

UniSynEditのTSynCppSynは、C++BuilderのIDEの色設定をレジストリから取得して、その設定をUniSynEditに反映できる。ただ、残念ながらBDS2006以降に対応していないので、BDS2006以降に対応したつもり。 修正したソースは、http://a7m.sakura.ne.jp/SOURCE/Un…

C++BuilderでMSXML6を使用する

C++Builder標準のTXMLDocumentはXPathが使えないなど微妙に使いづらいので、MSXMLのタイプライブラリをインポートして使ってみる。まず、以下の手順でMSXMLのタイプライブラリをインポートする。 [コンポーネント|コンポーネントのインポート]を選択 "VCL f…

覚え書き:TStreamReaderとTStreamWriterの使い方

TStreamReaderとTStreamWriterが便利そうなので試してみた。まずは、ファイルの読み込みを行うTStreamReader。 //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { i…

UniSynEditをC++Builder/Delphi 2010へインストールする方法

Unicodeが扱える高機能なエディターコンポーネント、unisyneditがC++Builder/Delphi 2010に対応したので、その覚え書き。 残念ながら、日本語環境ではそのままインストールできないので以下の手順を踏む必要がある。 アーカイブを公式から落として、アーカイ…

VCLからExcelにアクセス(C++Builder版)

第9回デベロッパーキャンプ セッションA2でネタになった、VCLを使ってExcelにアクセスするサンプルのC++Builder版を作ってみた。 オリジナルと違うのは読み込み元のデータベースをdbExpressでBlackfish SQLに接続したこと。 それに伴って、ソースコードに一…

第14回エンバカデロ・デベロッパーキャンプセッションT3自己フォロー(Delphi/C++Builder DB総ざらい)

C++Builder/Delphi 2010のdbExpressでInterbaseのドライバーを使ってFirebirdに接続するとエラー。 Pathは通しているけど、エラーメッセージに"Incompatible version"ってあるから、ドライバーがFbclient.dllをリネームしたgds32.dllかどうかチェックしてい…

第14回エンバカデロ・デベロッパーキャンプセッションT7自己フォロー(グリッドの特定列をボタンにする)

やることは、グリッドのセルにボタンを表示してそれに応じたダイアログ等を表示すること。コンポーネントを作らずにオーナードローでごまかす。 1.初期化 まずフォームにTDrawGridとTButtonを貼り付ける。TDBGridならばオーナードローにする 行数分だけ動的…

Windows 7 (x64)でC++Builder/Delphi 2009のデバッガが動作しない場合の対処法

MSDNとかでWindows 7のRTM版を入手して、早速乗り換えた人も多いと思うけど、残念ながらC++Builder/Delphi 2009のデバッガで以下のようなエラーが発生。 現状での対処方法はバイナリエディタでパッチを当てるしかない。あくまでも自己責任なので、そこのとこ…

C++Builder 2010情報解禁

ちょっと出遅れたけど、C++Builderの新バージョン、"C++Builder 2010"についての情報が解禁になったので、個人的な感想とかを晒してみる。 詳しい情報は、本家とかDelphi系ブロガーの皆様に任せるとして(ぉぃ)、いち、C++Builderユーザー視点から。 現時点…

覚え書き:C++Builder 2009以降でコンポーネントをビルドする場合についての確認事項

C++Builder 6用のプロジェクトをコンバートして、[Delphiコンパイラ|コンパイル|構文オプション|コンパイラに渡す追加スイッチ]に-LUDesignIDEを追加するときは、Baseだけでなく、デバッグ、リリース全てに追加する。*1 Delphiのソースでコンパイルエラ…

TFormの境界線を消した場合(BorderStyle=bsNone)の移動とリサイズ

以下の設定をすれば、TFormを移動したり、サイズの変更が可能。ただし、Vistaだと境界線が残る。 class TForm1 : public TForm { __published: // IDE 管理のコンポーネント private: // ユーザー宣言 public: // ユーザー宣言 __fastcall TForm1(TComponent…

TRichEditで書式が部分的に変更できない場合の対処法

TRichEditの書式設定がうまくいかない場合、フォームの生成時にRichEditのデュアルフォントモードを無効にしたほうがうまくいくっぽい。 void __fastcall TForm1::FormCreate(TObject *Sender) { // デュアルフォントモードを無効にする DWORD dwLangOptions…

UnicodeStringとboost::formatとの連係

UnicodeStringでこんなこと出来るんだ。 //--------------------------------------------------------------------------- #include <iostream> #include <vcl.h> #pragma hdrstop #include <tchar.h> //---------------------------------------------------------------------------</tchar.h></vcl.h></iostream>…

C++Builder 2009でboost 1.37.0をビルドする方法

RAD Studio Command Promptを開いて、以下を実行。今月末リリース予定の1.38も同じ方法で大丈夫なはず。 bjam --prefix=C:\lib\boost\ --toolset=borland-6.1.0 link=static,shared runtime-link=static,shared release debug install "--prefix"はインスト…

第11回 エンバカデロ・デベロッパーキャンプB5セッション自己フォロー(その2:TurboPower編)

以下の手順でTurboPowerコンポーネントはC++Builder 2009にインストール出来る。(LockBoxとOnGuardは成功)他のコンポーネントも大丈夫かも。 オリジナルのアーカイブを本家からダウンロード。 Delphi 2009用アーカイブをダウンロード。 オリジナルのアーカ…

Xerces3.0.0をC++Builder 2009でビルドする方法

Xerces3.0.0が動くらしいので、試してみた。手順は以下の通り。 インストール先のprojects\Win32\BCB6\MakeBuildDirs.batを実行。 インストール先のprojects\Win32\BCB6\Xerces-allにある、XercesLib.bprをC++Builder2009で読み込む。 プロジェクトを変換し…

Singletonパターンとマルチスレッド

マルチスレッドを考慮してSingletonを実装するとき、アクセスする度にTCriticalSectionを使ってオブジェクトの中身を保護してやらないといけないのかな・・・。 class CSingleton { private: CSingleton(){} CSingleton(const CSingleton& obj) {} virtual ~…

C++Builder 2009用ユニット参照関係修復スクリプト

フォームを使用していないユニット*1をコードエディタで表示すると、コードエディタ下側のタブに「コード」と「履歴」しか表示されない場合があるので、それを解消するRubyスクリプト。 require "rexml/document" doc = REXML::Document.new($<) doc.element…