C++Builder 10 Seattleでランタイムなしで動作するようにするには

C++Builderで作成したWindowsアプリケーションをランタイムなしで実行できるようにするには、次の設定を行います。

  1. メニューから「プロジェクト」→「オプション」を選択し、プロジェクトオプションダイアログを表示します。
  2. 「C++リンカを選択し、「動的RTLとリンクする」のチェックを外します。
  3. 「パッケージ」→「実行時パッケージ」を選択し、「実行時パッケージを使ってリンク」のチェックを外します。

しかし、C++Builder 10 Seattleでは上記の設定を行っても、エラーが発生します。

borlandmm

「コンピューターに BORLANDMM.DLL がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」

以前のバージョンのmemmgr.libを使うことで問題を回避できます。

たとえば、C++Builder XE8のmemmgr.libをC++Builder 10 Seattleにコピーする場合は、

C:\Program Files (x86)\Embarcadero\Studio\16.0\lib\win32\release\memmgr.lib

C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\win32\release\memmgr.lib

にコピーします。

これは、C++Builder 10 Seattleの不具合のようです。
Quality PortalにRSP-11768で登録されています。

追記:2015年11月20日

C++Builder 10 Seattle Update 1で修正されたようです。

C++11で数値と文字列の変換

C++11から数値と文字列の変換を簡単にできるようになりました。

数値を文字列に変換する

数値を文字列に変換するには「std::to_string」関数を使用します。

例:std::stringに変換する

int val = 123;
std::string str = std::to_string(val); // "123"

例:std::wstringに変換する

int val = 123;
std::wstring str = std::to_wstring(val); // "123"

文字列をint型に変換する

文字列をint型に変換するには「std::stoi」関数を使用します。

例:文字列をint型に変換する

std::string s = "123";
int i = std::stoi(s); // 123

例:16真数として文字列をint型に変換する

std::string s = "10";
int i = std::stoi(s, nullptr, 16); //16

std::string s = "0xFF";
int i = std::stoi(s, nullptr, 16); //255

例:8真数として文字列をint型に変換する

std::string s = "10";
int i = std::stoi(s, nullptr, 8); //8

文字列をfloat型に変換する

文字列をfloat型に変換するには「std::stof」関数を使用します。

例:文字列をfloat型に変換する

std::string s = "12.3";
float f = std::stof(s); //12.3

例:指数表現の文字列をfloat型に変換する

std::string s = "1.234e2";
float f = std::stof(s); //123.4

C++Builder XE8でExcelを起動してファイルを開く

C++Builder XE8でExcelを起動してファイルを開くコードです。

UnicodeString FileName = L"C:\\tmp\\Book1.xlsx";
Variant Excel = Variant::CreateObject("Excel.Application");
Excel.OlePropertySet("Visible", true);
Variant Workbooks = Excel.OlePropertyGet("Workbooks");
Variant Workbook = Workbooks.OleFunction("Open", WideString(FileName));

C++Builder XE8でAndroidアプリケーションのロギング

C++Builder XE8でAndroidアプリケーションのロギングを行う方法です。

#include <FMX.Platform.hpp>

UnicodeString msg = L"ログメッセージです。";
if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXLoggingService)))
{
    // IFMXLoggingServiceが利用な可能なとき
    _di_IFMXLoggingService LoggingService =
        TPlatformServices::Current->GetPlatformService(__uuidof(IFMXLoggingService));
    LoggingService->Log("%s", ARRAYOFCONST((msg)));
}

ログはAndroid Debug Monitorで確認できます。

ログ