operator=()をoverrideできるのか?

C++

operator=()をoverrideできるのか? できるかできないかであれば、できる。 しかし、しない方が良いだろう。ベースクラスのポインターを保持する関数などで派生クラスを含めたコピーをしたい場合どうなるか。 確認をした。 なお今回のお題では呼び出し側での…

namespaceに関する備忘(その1)

namespaceで名前空間を指定すると、同じ関数名でも別の名前空間であればコンフリクト(名前の衝突)しないので、プログラム作成の上で重宝する。 例えば、テンポラリーな処理を行う上でローカルな関数を定義することがあるが、関数名を定義しているのを忘れて…

中華系スパム再び

3月中は結局30日まで1通も来なかった中華系詐欺メール。 3月31日より平常運転に・・・日4~8通くらいかな、詐欺メールが来る。 それぞれIPは異なるので、別サーバーなのだが結局なんだったのだろう?

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

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

PILOTの顔料インク 強色(TSUWAIRO)

この4日にPILOTから顔料インクの強色(TSUWAIRO)が発売された。 知っている範囲ではPILOTの万年筆用顔料インクは初めてのはず。 国内大手3社(PILOT,SAILOR,プラチナ)の中では最後発となる。 同時にクリーニングキットも発売、こちらも最後発。現在、自分がメ…

中華系スパムが来なくなって怖い

大体1日に数通来ていた中華系詐欺メール。 メールソースのDate:を見れば+8:00となっていて、IPアドレスを確認しなくともほぼ確実に中国発のメールだと判る。 これが今月に入ってから1通も来ないので気持ちが悪い。 逆に-3:00とか-8:00,-9:00と言ったアメリカ…

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

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

CSIDLではなく KNOWNFOLDERIDをつかう。GetSpecialFolderPathではなくGetKnownFolderPathをつかう

久しぶりにWindows規定のフォルダーを調べる必要があって、CSIDLの何だっけと調べてみた。MicrosoftのCSIDLに関するページをみると、最初に以下のように書かれている。 注意 Vista Windows、これらの値は KNOWNFOLDERID 値に置き換えられています。 新しい定…

enumを基に変換関数を内蔵したオブジェクトをつくる

enumで定義されたデータをシリアライズするときは、何らかの数値(あるいは文字列)と相互変換する。 相手がintでC言語であれば、単純にキャストで相互変換もできる。C++であればstatic_castを使うこともあるだろう。 enum en { e1, e2, e3 }; en e = e3; int …

オブジェクト毎に内部インターフェースをカスタマイズする方法

複数のオブジェクトクラスに対して、同じ動作をさせるクラスの設計をすることがある。 例えば、ファイルへのIO処理はいろいろなオブジェクトを文字列かバイナリに相互変換させるクラスあるいは関数を設計する。 毎度個別に記述するのも良いが、もう少し簡便…

拡張メタファイルの描画精度

Windows上でベクター画像を取り扱うプログラムを作成する場合、サイズを変更しても劣化のないメタファイル・拡張メタファイル形式は一定のメリットがある。 特にクリップボード経由の場合は便利なことが多い。 一方、メタファイルを用いる場合、ビットマップ…

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

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

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

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

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

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

TImageViewerなどでZoomジェスチャーの処理をする

TImageViewerなどでZoomジェスチャーの処理について探せる範囲で情報が無いのでメモ。処理は幾つかの状態保存変数とOnGestureイベントの記述で済む。 まず、TImageViewerのTouchプロパティのInteractiveGesuturesを開いてZoomをTrueにする。 OnGestureコード…

Firemonkeyジェスチャーイベント処理

この情報についてはC++ Builder 10.4.1(Sydney)で確認した情報なので、将来変わる可能性がある。 と言うか、昔と変わった部分についてEmbarcaderoがドキュメントの更新をしていないための備忘だ。まず、ジェスチャーのIDの定義だが、現時点でSystem.UITypes.…

Androidでカメラを利用するには

Firemonkeyを用いてAndoroidアプリを開発し、アプリにカメラ機能を追加するには2つの方法がある。 TCameraComponentを使って、アプリ内で撮影できるようにする。 TTakePhotoFromCameraアクションかIFMXCameraServiceを用いて、他のカメラアプリで撮影する。 …

Firemonkeyでスクロールボックスのスクロール位置を指定する

TScrollBox,TVertScrollBox,THorzScrollBoxといったTCustomScrollBoxの派生クラスをレイアウトベースとして使う場合、スクロールの位置を知りたい場合がある。 名称にScrollが付いていないのでわかりにくい(ヘルプもわかりにくい)がViewportPositionプロパテ…

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

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

Firemonkeyでキーボードに重ならないように編集中のコントロールの位置を変更する(ずらす)方法

FiremonkeyでAndroidアプリケーションのテキストの入力を行うときに、仮想キーボードが出現して入力するコントロールを覆い隠す場合は、フォーム全体を上方向にずらしてコントロールを表示させたい。 Firemonkey以外で開発しているのであれば詳細は割愛する…

FiremonkeyでAndroidアプリに外部ファイルを添付する

FiremonkeyでAndroidアプリを開発するときに、アプリで使用するファイルを配置する方法についてメモ。 IDEのメニューで「プロジェクト」→「配置」をクリックして配置画面を表示させる(の配置ではない)。 上のバーの用紙に+がついたアイコンがファイルの追加…

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

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

double版 powについて

先日powのint版を作成して、通常のpowを用いた場合と比較した。 今回はint版と同じアルゴリズムを用いたdouble版powと通常のpowを比較してみる。 ただし乗数は整数に限るとする。 double pow( double x, int exp ); かけ算のルーチンは以下の通り double pow…

整数版powについて

C言語、あるいはC++言語において累乗を計算する場合powを使う。幾つか亜種があるが標準で用意されているのは実数版のみだ。 最も一般的なpowの定義は以下の通り double pow( double x, double expr ); 整数版は用意されていないので、累乗が欲しいときには実…

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の代わりになる乱数ライブラリだ。 実用的な乱…