サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
円安とは
a7m.hatenablog.jp
ビットマップファイルを動的に生成する場合、解像度情報はデフォルトの96dpiで生成される。 デバイスに依存しないで、任意解像度のビットマップにMM_HIMETRIC(1/100mm)単位で描画する場合、以下の手順で、ビューポート範囲等を設定する。 void SaveImage(HDC hDC, long Width, long Height, int dpi) { ::SaveDC(hDC); HPEN hPen = ::CreatePen(PS_SOLID|PS_GEOMETRIC, 10, RGB(0,0,0)); HBRUSH hBrush = ::CreateSolidBrush(RGB(0xff, 0xff, 0xff)); ::SelectObject(hDC, hPen); RECT rr = {0, 0, Width, Height}; ::FillRect(hDC, &r
デリーターとは スマートポインタが管理できるのは、メモリ領域だけではなく「構築」と「破棄」がペアになっている任意のリソースも管理できる。 例えば、Cのfopen関数でオープンしたファイルをfclose関数でクローズしたり、あるいは、Windows APIのGDIオブジェクトをDeleteObject関数で破棄したりとか。 その仕組みを実現するのが「デリーター」で、厳密にはスマートポインタのデフォルトのデリーターが"operator delete"となっている。 #pragma hdrstop #include <windows.h> #include <boost/tr1/memory.hpp> // スマートポインタがGDIオブジェクトを破棄するデリーター struct GDIDeleter { void operator()(HANDLE handle) { ::DeleteObjec
UnicodeStringでこんなこと出来るんだ。 //--------------------------------------------------------------------------- #include <iostream> #include <vcl.h> #pragma hdrstop #include <tchar.h> //--------------------------------------------------------------------------- #include "boost/format.hpp" #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { UnicodeString us("あいうえお"); // boost::format UnicodeString us3;
C++ Templates: The Complete Guideの57ページにこんなコードがあった。 //--------------------------------------------------------------------------- #pragma hdrstop #include <tchar.h> #include <string> //--------------------------------------------------------------------------- #pragma argsused // note: reference parameters template <typename T> inline T const& max (T const& a, T const& b) { return a < b ? b : a; }
プロジェクトの作成 IDEへのアドオンは、パッケージを作成してそれをIDEに「登録」することで実装される。RAD Studioの場合、[ファイル|新規作成|パッケージ-Delphi]で新規プロジェクトを作成する。Open Tools APIのクラスやインスタンスは通常のプロジェクトでは参照しないので、それらを含んでいるパッケージであるdesignide.dcpをプロジェクトに明示的に含めなければならない。プロジェクトマネージャーで[参照の追加]を選択。$(BDS)\lib\win32\release\designide.dcpを選択すれば、designide.dcpがプロジェクトに含まれる。 「ウイザード」の実装 ウイザードを実装するには、ToolsAPI.pasで定義してあるウィザードインターフェースとノーティファイアインターフェースを継承したサブクラスを定義し、必要に応じたメソッドを実
う〜ん、よく判らん。 とりあえず、翻訳ソフトに突っ込んでみた。 Introduction この論文はすべてあなた Delphi ユーザーに我々が働いて、そして Delphi コンパイラに関して考えていることへの若干の洞察を与えるように意図されます。 我々はここ、 Embarcadero の世界的な本部であなたたちみんながあなたの Delphi コンパイラが好きである方法をすべてあまりにもよく知っています、そしてなぜならR&D研究室に若干のクールな言葉とコンパイラ技術醸造があります、そして我々はあなたがあなたの大好きなコンパイラの未来に関して最新であったことを確認することを望みましたから。 Some History けれども最初に、私にコンパイラについてあなたに少しの歴史を与えさせてください。 これの大部分があなたたちみんなにおそらくニュースではありません、しかしそれを覚えていることは重要で
昨日のネタのうち、キャスト関連は思い込みとか理解不足なところがあったので、実際に動かしてみた。 //--------------------------------------------------------------------------- #include <iostream> #pragma hdrstop #include <tchar.h> //--------------------------------------------------------------------------- #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { double a = 123.4567; //int i0 = reinterpret_cast<int>(a); // error!!! [BCC32 エラー] Fil
TStreamReaderとTStreamWriterが便利そうなので試してみた。 まずは、ファイルの読み込みを行うTStreamReader。 //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if (OpenDialog1->Execute() == false) return; std::unique_ptr<TStreamReader> is(new TStreamReader(OpenDialog1->FileName)); int l = 0; UnicodeString Buffer; Memo1->Clear(); Memo1->Lines->BeginUpd
C++Builderの[プロジェクト|オプション|バージョン番号]で設定したバージョン番号を取得するには、GetFileVersionInfoとVerQueryValueを使用してアプリケーションの情報を取得する。VerQueryValueで戻ってくるサイズは文字数。 UnicodeString GetApplicationNameAndVersion() { // 自分自身のフルパス const TCHAR* ExeName = Application->ExeName.t_str(); // リソース領域のサイズを取得 DWORD Size = GetFileVersionInfoSize(ExeName, NULL); // リソース領域を取得 BYTE *pVersionInfo = new BYTE[Size]; GetFileVersionInfo(ExeName, NULL,
フォーム作成時のエラー処理でちょっとハマったので、ほとんど覚え書き。アプリケーションの設定ファイルをアプリケーションと同じフォルダに置くことはよくあること*1だけど、設定ファイルが無い場合はデフォルト値で初期化するのではなく、アプリケーションを起動させないケース。 void __fastcall TForm1::FormCreate(TObject *Sender) { UnicodeString ConfigFile = TPath::ChangeExtension(Application->ExeName, L".ini"); if (!TFile::Exists(ConfigFile)) { throw Exception(L"設定ファイルがありません!"); } } という感じで、フォームの作成時にエラーか何かが発生して、例外を投げても、何故か_tWinMainのtry〜catch
前口上 小型で気軽に使えるLinuxサーバが欲しくてCHUWI HeroBoxをゲット。 試行錯誤をしまくって、何とかモノになったので覚え書き。 CHUWI HeroBox ミニPC 小型PC 8GBメモリー 256GB SSD Celeron N4100 プロセッサー Windows10 高速Wi-Fi/BT4.0/Type-C/USB …
shared_ptrを使ってみる unique_ptrが変数の寿命が尽きた段階でメモリ領域を開放するのに対し、shared_ptrは参照カウンタを持ち参照カウンタがゼロになるとメモリ領域を開放する。 #include <tchar.h> #ifdef __BORLANDC__ #include <boost/tr1/memory.hpp> namespace std { using namespace tr1; // 他のコンパイラと同様にstd::tr1をstdとする } #else #include <memory> #endif #include <iostream> // 円を表す図形 class CPrimitiveCircle { public: CPrimitiveCircle() : x(0), y(0), r(0) { } CPrimitiveCircle(int xx,
なし崩し的にDelphi Advent Calendar 2012に記事を書く羽目になった件について。(ぉぃ まぁ、実業務でのちょっとした覚え書きな件もあるので、いい機会だし久しぶりに更新してみる。 ここ数年でプログラミング環境はUnicodeを意識せざるを得なくなった。DBのエンコーディングがUTF-8であることなんて良くあること。コードを書く側としてはエンコーディング変換とかはフレームワークの類いがよろしくやってくれるから余り気にする必要は無いはず。 それに、C++11でUnicodeリテラルが導入されたから、こんな感じで、いろいろアレなことが出来る。 #include <vcl.h> #include <stdio.h> #pragma hdrstop #include <tchar.h> #pragma argsused int _tmain(int argc, _TCHAR* a
C++のコンテナ類を列挙するときに便利なのがboost::foreach。可変長配列であるvectorを列挙する場合は以下の感じ。 //--------------------------------------------------------------------------- #include <iostream> #include <string> #include <vector> #include <boost/foreach.hpp> #include <tchar.h> //--------------------------------------------------------------------------- class CPlayer { public: CPlayer(const std::string& name, const std::string
次期C++BuilderのC++コンパイラがLLVM/clangになる*1というので、早速いじってみた。 まずはインストール。現時点でWindows上でclangを動かすにはmingwが必要とのことで、まずはmingwのインストール。 http://sourceforge.net/projects/mingw/files/Installer/mingw-get/catalogue/からDownload mingw-get-inst-20120426.exeをクリック。 ダウンロードしたインストーラーを実行してmingwをインストール。 続いて、LLVMのインストール。LLVMのダウンロードページからWindows用のバイナリをダウンロード。 ダウンロードしたアーカイブを解凍して、mingwのインストール先に上書き。 以上で、Windows上でclangがインストールされる。 コンパイルは以
Mozillaのエンコーディング自動判別ライブラリである「universalchardet」をDLL化したのをC++Builderで動作させてみました。 C++Builderでの修正箇所はprmem.hの「#include 」を「#include 」にするだけ。アーカイブはhttp://a7m.sakura.ne.jp/SOURCE/universalchardet-CB.7zに用意しました。 C++Builderでの使い方は以下の通り。TMemoryStreamのバッファとかをそのまま渡せる。 // ファイルを読み込んでから std::unique_ptr<TMemoryStream> pBuffer(new TMemoryStream()); pBuffer->LoadFromFile(FileName); pBuffer->Position = 0; char encoding[CH
UnicodeStringに関するちょっとした仕様変更 UnicodeString::t_char()は移行期間が過ぎたということで「非推奨」に。それに伴い、プロジェクトのTCHARのマッピングがデフォルトでwchar_tに。よって、C形式の文字列ポインタ(const wchar_t*)が欲しい場合は、c_str()かw_str()を使用。(といっても、中身は全く同じ)どうしても"const char*"な文字列が欲しい場合は、一度AnsiStringにキャストしてからc_str()でポインタを取得。 この辺の変更はTCHARのマッピングがcharかwchar_tとでUnicodeString::t_char()の挙動が変わる仕様がクロスプラットフォームを考えたときによろしくないせいかと思うけど。 正規表現クラス 正規表現クラスであるTRegExが追加。サードパーティだとSkRegExpと
コマンドプロンプトの補完アプリであるConsole2を導入してみる。 アーカイブはプロジェクトページの[Files|console-devel|2.00]より、最新版をダウンロード。 Console2はそのままだと日本語が入力が出来ないので、http://wiki.pythonpath.jp/moin/ConsoleIme よりIME対応バイナリをダウンロード。アーカイブのConsole.exeをそのまま上書き。 Dirコマンドなどを実行したときにカラム位置がずれる場合は、以下の手順を実行。 [View|Console Window]を選択して、コンソールウィンドウを表示する。 コンソールウィンドウの[プロパティ]を選択。 プロパティダイアログの[フォント]タブを選択。 フォントを「MS ゴシック」にする。 Console2は[Edit|Settings|tabs]でタブを作成すると、タブ
TBalloonHint::ShowHintに問題があるみたいで、代替にJVCLのTJvBalloonHintを使うというエントリーを書いたのだけれども、Embarcaderoの高橋さんからコメントがあって、再テスト。自分の勘違いで問題が無いことが確認できたのだけれども、以下の点に注意。 TBalloonHintは動的に生成せずにフォームに貼ったコンポーネントを使い回すこと。 ShowHintメソッドで指定する座標はフォームの座標ではなく、スクリーン座標を指定する。 ShowHintメソッドはヒント表示後すぐに終了する。HideAfterプロパティで指定した時間を待たないので、直後にdeleteなどで破棄するとヒントそのものが表示されない。 以下は正しく動作するコード例。TBalloonHintはコンポーネントとしてフォームに貼ること。 C++Builderの例: void __fastc
スマートポインタって何? C++において、operator newでメモリ領域(ヒープ領域)を動的に確保した場合、その領域はoperator deleteでプログラマが責任を持って解放してやらなければならない。しかし、deleteを書き忘れたり、例外が発生したときの処理を怠った場合など、それが正しく行われないことはよくある。正しく解放されなかった領域はOSやプロセスが使用可能なメモリ領域を「不正占拠」し、それが積もり積もると、OSやプロセスが停止する場合がある。 #include <memory> class Mess {}; void f(Point p1, Point p2) { Rectangle* r(new Rectangle(p1, p2)); r->rotate(45); // 矩形を45度回転 // ... if (in_a_mess) throw Mess(); // 例
半ば個人的な手順書。少々怪しいかも。すべてCUIで行う場合を想定。 開発ツールのインストール デフォルトではgccとか入らないので。 # yum groupinstall 'Development Tools' 'Development Libraries' PHP5.3をインストール デフォルトのPHPは5.1なので、5.3をインストール。ただし、php53-pearが無いのでpearはPHP5.1のをインストール後アップグレード。最初はメッセージが色々出るけど気にしない。(参考:http://d.hatena.ne.jp/Akkiesoft/20110411/1302488866) # yum remove php php-* # yum install php53 php53-* # yum install php-pear # pear upgrade --force Archiv
「C++プログラマであるかを見分ける10の質問」に答えてみた。自分の解釈だとこんな感じ。正解かどうか、特に2のreinterpret_castと10は自信なし。ちなみに、Java版は/.Jの日記で。 1. iterator の役割について説明せよ. ポインタがメモリのアドレスを指し示すように、イテレータはコンテナの中身を指し示す。ポインタとの違いは、コンテナの「先頭」と「終端」を意味する値があること。 2. *_cast およびCスタイルのキャストそれぞれについて概要を説明せよ. Cスタイルのキャスト:単なる型変換。数値ならば精度が落ちる場合がある。 static_cast:同上。C++での静的変換はCスタイルのキャストではなく、こっちを使用するべき。 reinterpret_cast:ポインタ同士、もしくは、ポインタと同サイズの整数型とのキャスト。メモリイメージの無理矢理コピー、精度落ち
QC#66768によると、TBallonHintは任意の位置にバルーンヒントを表示できないっぽい*1ので、代替としてJVCLのTJvBalloonHintを使ってみる。 TJvBalloonHintはTBallonHintをJVCLが拡張したコンポーネントでは無いので、使い方が根本的に違う。あと、現時点での最新版である3.40では、Windows 7でビジュアルスタイルが有効な場合でヒントが表示されないバグがあるので、$(JVCL)\run\JvBalloonHint.pasをSVNリポジトリの最新版と差し替える必要がある。 使い方は単純でツールパレットのJv Non-VisualにあるTJvBalloonHintをフォームに貼り、ActivateHintを呼び出すだけ。ヒントの表示はActivateHintの他にActivateHintPos、ActivateHintRectがあるので、
通常のポップアップヒントでは出来ない強調表示や文字の色変えをHTMLで定義して描画してみる。ただ、ポップアップヒントを表示する目的だけでIEコンポーネントやGeckoを使うのはヘビーなので、JVCLが用意してくれている簡易HTMLレンダリングルーチンを使用。これは、TJvHTLabelやTJvHTButtonなどでも使われている。 まずは、標準のヒントウインドウを継承したサブクラスを定義する。 class THtmlHintWindow : public THintWindow { public: __fastcall THtmlHintWindow(TComponent* AOwner) : THintWindow(AOwner) { } void __fastcall Paint(void); TRect __fastcall CalcHintRect(int MaxWidth, co
マルチスレッドを考慮してSingletonを実装するとき、アクセスする度にTCriticalSectionを使ってオブジェクトの中身を保護してやらないといけないのかな・・・。 class CSingleton { private: CSingleton(){} CSingleton(const CSingleton& obj) {} virtual ~CSingleton(){} public: static CSingleton& getInstance(); static void release(); private: static CSingleton* s_pInstance; }; CSingleton& CSingleton::getInstance() { if (s_pInstance == NULL) { // シングルトンオブジェクトの初期化 // TCritical
ちょっと出遅れたけど、C++Builderの新バージョン、"C++Builder 2010"についての情報が解禁になったので、個人的な感想とかを晒してみる。 詳しい情報は、本家とかDelphi系ブロガーの皆様に任せるとして(ぉぃ)、いち、C++Builderユーザー視点から。 現時点で、まだRTMが済んでいないのでもしかしたら変更があるかも。 全般的な感想としては、ぶっちゃけた話マイナーチェンジ。だけど、IDEについては全俺が泣いた新機能てんこ盛り。 エディタの検索機能の強化 少し前のデベロッパーキャンプで指摘があった、Shift+F3で逆方向検索が出来るようになりました!! FirefoxっぽいUIなので今までと比べものにならないくらい使い勝手がアップ。もちろん、正規表現とかマッチ部分のハイライトとかも。 C++クラスエクスプローラーの「復活」 変数とかクラスとかの定義とか、参照情報とか
第12回デベロッパーキャンプでネタにしたmlang.dllのDetectInputCodepageがBOM無しUTF-8をWindows-1252と誤判別するので、代替としてバベルを使ってみる。 使い方はヘッダファイルbabel.hをインクルードして、プロジェクトにbabel.cppを追加するだけ。 以下はコード例。 //--------------------------------------------------------------------------- #include <iostream> #include <fstream> #include <iterator> #include <string> #pragma hdrstop #include "babel/babel.h" #include <tchar.h> //-----------------------
既に情報は出ているけど、個人的なニーズがあってまとめてみた。 1. アプリケーションがHTML Helpを表示するようにする。 適当なソースコード(WinMainがあるコードかメインフォームのコードが一番無難かも)に以下の2行を追加。#include <HtmlHelpViewer.hpp> #pragma link "HTMLHelpViewer" これがないとWinHelpが呼び出されてしまうので注意。 2. メインフォームのOnCreateでヘルプファイルを指定する。 void __fastcall TfrmMain::FormCreate(TObject *Sender) { Application->HelpFile = ChangeFileExt(Application->ExeName, _T(".chm")); // ヘルプファイルの指定 Application->OnHe
前準備: Windowsが64bit版の場合は、コントロールパネルの「ODBC (32ビット)」ではなく、32bit版の"C:\Windows\SysWOW64\odbcad32.exe"を実行する。 ユーザーDSNかシステムDSNに"Microsoft Text Driver"が含まれているか確認。 接続: OLE DB プロバイダーは「Microsoft OLE DB Provider ODBC Drivers」を選択。 接続文字列はこんな感じ。Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Text Files;DBQ=G:\;DefaultDir=G:\;DriverId=27;FIL=text;MaxBufferSize=2048;PageTimeout=5;"DBQの値がテキストファ
次のページ
このページを最初にブックマークしてみませんか?
『C++Builder好きの秘密基地』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く