C++ Builder

TRichEditでリッチなテキストをプログラムする

TRichEditを使って、メモ帳もどきを作る場合は、編集ボタンなどでモードを切り替えするなどすれば、任意の修飾を行える。 一方、プログラムで文字列を修飾しようとすると気をつける必要がある。 修飾を前提とした場合やってはいけないこと TRichEdit::Text、…

Viewport3Dの画像をコピー・印刷するには

TViewport3Dの画像をコピーしたり印刷したい場合はどうするか。 その方法と注意点について示す。 まず、今回のコードはAndroidでは動かない(プリンターサービスとかがない)コードが含まれるので注意。 画像をコピー TViewport3Dの画像をクリップボードにコピ…

C++ Builderの出力mapのアドレスは相対アドレス

タイトルの通り、C++Builderで出力されるmap中のアドレスは相対アドレスになる。 このため、実行時のアクセス違反メッセージで表示されるアドレス値とは異なることに注意。ベースアドレスは最初に記述されている。例えば以下の通り。 Start Length Name Clas…

C++ Builderの出力mapを自動コピーして保存する

C++ Builderもリンク時にmapファイルを出力できる。 release版でアドレス違反が発生したときのメッセージをもとに、mapファイルで発生元の関数を推測できる。ただし、そのためには準備がいる。 mapの出力設定はオプションのリンカ→出力→マップファイルの種類…

フォームの閉じ方とModalResultの設定について

VCLでフォームを表示させ終了時にフラグで処理を変更したいときにフォームのModalResultを参照するケースがある。 ただし、ModalResultの設定については注意しなければいけない点があるのでメモ。 また、フォームの閉じ方についてもメモ。 ShowModalで表示さ…

Firemonkeyで次のタブストップオブジェクトを得る

VCLフレームワークであれば、以下のコードでタブで移動する先のコントロールを得ることができる。 TWinControl* pNext = FindNextControl( Edit1, true, true, false ); しかしFiremonkeyフレームワークにはFindNextControlに相当する機能はない。 いろいろ…

マルチプラットフォームでZipファイル中の日時を扱う場合の注意事項

FiremonkeyでもTZipFileを使って、ZIPファイルの操作ができる。 マルチプラットフォームなので、Windows以外のプラットフォームでも利用できるのだが、日時の操作に関して注意が必要だ。Zipファイル中のファイルの日時は、TZipHeader構造体のModifiedDateTim…

FiremonkeyとVCLで共有するコードの作成(2022-03-16更新)

このところVCLで作成した共用コードをFiremonkey(FMX)でも用いることができるように手直しをするようになった。 WindowsオンリーであればVCLを使う方が楽だ。一方3DやAndroidではFiremonkeyを使う。 ランタイムだけを使うコードであれば問題は大きくないが、…

C++ Builderのプラットフォーム定義済みマクロ

C++ Builderでプラットフォーム毎に条件コンパイルをする場合のマクロは、いつも探すのが大変なのでメモ。ドキュメントではメインヘルプ(Web版であればトピック)で"定義済みマクロ"を検索すれば見つかる。 一部を掲載。 マクロ 説明 __ANDROID__ Android環境…

Firemonkeyで静的ライブラリをリンクする方法

C++ Builderで静的ライブラリをリンクするには幾つかの方法がある。 手軽な方法として自分はいつも#pragma linkを使っていた。 1.#pragmaでリンクする方法 VCLでaaa.libをリンクしようと思ったときには、次のように記述する。 #pragma link "aaa.lib" ところ…

TStreamAdapterをIStreamに変換する

どのバージョンから変わったかもう覚えていないが、C++ BuilderでVCLベース(Delphiクラスオブジェクト)のポインターを扱う場合、場合によっては通常のC++のポインターではだめな場合がでるようになった。 例えばTXMLDocumentでノードの取り扱いがそうで、TXM…

VCLフォームを含むDLLを作る場合に必要なこと

DelphiあるいはC++ BuilderでVCLのフォームを含むDLLを作る際に必要なこととして、最初にメインフォームのハンドルを渡す必要がある。 プログラム本体側のApplicationと、DLL側のApplicationは別のインスタンスで、同期しない。 このため、DLLで何も考えず以…

STLのrandomを使う場合の備忘

確認したのはC++ Builder 10.xのTokyoとRioだけなのでCLang一般ではないと思う。 しかし、インプリメントを確認しないで実装するとセキュリティホールになると思われる。STLのrandomライブラリーはCベースのrandの代わりになる乱数ライブラリだ。 実用的な乱…

C++ Builderでアイコンをリソースに登録する場合の備忘

Windowsプログラムでアプリケーションのアイコンの他に、関連付けファイルのためのアイコンなどを登録したい場合がある。 ただし、何も考えないで登録すると、アプリのアイコンがリソースで登録したアイコンになってしまう。C++ Builder(Delphiもそうだろう)…

SelectDirectoryでリンカエラー

SelectDirectoryを使うプログラムを書いているとき、リンカエラーを起こすことがある。 どうも、よくわからずいろいろしている内にリンクできてなんとなく放置していた。今回、C++ Builderが10.3(Rio)になったのので、既存のプログラムをコンバートしてみる…