2025/01/09 多機能画像スクリーンセーバー KScrn32/KScrn64(フリー版、シェアウェア版)をVectorで公開

C++BuilderのTips集

C++Builder

C++Builderを活用した開発で役立つ、実践的なテクニックや便利な機能をまとめたTips集です。

今後、随時追加していく予定です。

std::string と String 間の変換

C++Builderでは、std::stringVCLStringUnicodeString)間の変換がよく必要になります。以下の方法を使うことで簡単に変換できます。

変換方向コード例
std::string → StringString vclStr = stdStr.c_str();
String → std::stringstd::string stdStr = AnsiString(vclStr).c_str();
Unicode対応 (UTF-8)std::string utf8Str = UTF8String(vclStr).c_str();
#include <vcl.h>
#include <string>

正規表現の利用

以下は、正規表現を利用して文字列中の”640×320”の部分を抜き出す処理の例です。

std::regex、std::smatch を利用しています。

#include <string>
#include <sstream>
#include <regex>

String url = "https://media/aaaaaaabbbbb?format=jpg&name=640x320";

std::string extractNumber(const std::string& url)
{
    // 正規表現で数値部分を抽出
    std::regex regex("\\d+x\\d+");
    std::smatch match;
    if (std::regex_search(url, match, regex))
    {
		return match.str();		// 一致した文字列を返す
	} else {
		return "";				// 一致しなかった場合は空文字列を返す
	}
}

String ImageSizeStr(String url)
{
    std::string wstr1   = extractNumber(AnsiString(url).c_str());
    String wstr         = wstr1.c_str();

	return wstr;
}

文字列(TString)が、特定の文字列を含んでいるかチェック

特定の文字列が文字列(TString)に含まれているか確認したい場合があります。このような場合、Pos メソッドを使用すれば簡単に確認できます。尚 Pos メソッドは、大文字と小文字を区別します。

プロトタイプ宣言

int Pos(const UnicodeString &SubStr) const;
  • SubStr: 検索する部分文字列。
  • 戻り値: 部分文字列が見つかった場合は1から始まる位置、見つからなかった場合は0を返します。

使用例1

#include <vcl.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String str		= "Hello, world!";
	String subStr	= "world";

	int pos = str.Pos(subStr);

	if (pos > 0)
	{
		ShowMessage("部分文字列 '" + subStr + "' は、'" + str + "' の " + IntToStr(pos) + " 文字目にあります。");
	} else {
		ShowMessage("部分文字列は見つかりませんでした。");
	}
}

使用例2

Pos メソッドを使用して、文字列 “1024×768″ の、”x” の前後の文字列 “1024”、 “768” を取得します。

	String str		= "1024x768";
	String width, height;

	int pos = str.Pos(L"x");
	if (pos > 0)
	{
		width	= str.SubString(1, pos - 1);
		height	= str.SubString(pos + 1, str.Length() - pos);
	}

TStringListで、特定の文字列が含まれているかどうかチェックス

TStringListに特定の文字列が含まれているかどうかは、以下のメソッドを使用する事で確認できます。

IndexOfメソッド

TStringListに特定の文字列が含まれているかどうかは、IndexOfメソッドを使用して確認できます。

#include <System.Classes.hpp> // TStringListを使用するために必要

    // 検索する文字列
    String searchStr = L"Banana";

    // IndexOfを使用して文字列を検索
    int index = stringList->IndexOf(searchStr);

    // 一致する文字列が文字列リスト内にない場合、IndexOf は -1 を返します。
    // リスト内の最初の文字列に一致する場合、IndexOf は 0 を返し、2 番目の文字列に一致する場合、IndexOf は 1 を返します。

TStringHelper.Contains

TStringHelperContainsメソッドは、特定の部分文字列が文字列内に含まれているかどうかを確認するために使用されます。このメソッドは、文字列を操作する際に非常に便利です。

この文字列が指定された文字列を含んでいるかどうかを返します。

Containsは、True if the string contains the string given through the Value パラメータを返すか、そうでなければ False を返します。この関数は、大文字小文字を区別します。

#include <System.SysUtils.hpp> // TStringHelperを使用するために必要

	// 判定する文字列
	String mainStr = L"Hello, C++Builder!";
	eString subStr = L"C++";

	// Containsを使用して部分文字列が含まれているかを確認
	if (mainStr.Contains(subStr))
	{
		ShowMessage(L"文字列 \"" + subStr + L"\" は \"" + mainStr + L"\" に含まれています。");
	} else {
		ShowMessage(L"文字列 \"" + subStr + L"\" は \"" + mainStr + L"\" に含まれていません。");
	}

リソースファイル(*.rc)

リソースファイル(*.rc)を利用することで、アイコン、ビットマップ、カーソル、文字列、バイナリデータなどのリソースをプログラムに埋め込むことが可能です。テキストファイルで、リソースファイル(*.rc)を作成した方が、移植性が良くなります。作成したリソースファイルは、ソースファイル(*.cpp等)と同様に、プロジェクトに登録して使用します。

BITMAP

  • ビットマップ画像を定義します。
MYBITMAP BITMAP "mybitmap.bmp"

ICON

  • アイコンを定義します。
MYICON ICON "myicon.ico"
// TResourceStreamを使用して、ストリームデータとして読み出せます。
TResourceStream *resourceStream = new TResourceStream((Winapi::Windows::THandle)HInstance, L"MYICON", RT_ICON);

TIcon *icon = new TIcon();
icon->LoadFromStream(resourceStream);
delete icon;
  • マルチアイコン

マルチアイコンの場合、「ICON」は指定すると、コンパイルエラーとなるようです。以下のようにすれば、OKでした。

// ICONを使用しない
MYICON ICON2 "myicon.ico"
TResourceStream *resourceStream = new TResourceStream((Winapi::Windows::THandle)HInstance, _TEXT("MYICON"), _TEXT("ICON2"));

TIcon *icon = new TIcon();
icon->LoadFromStream(resourceStream);
delete icon;

CURSOR

  • カーソルを定義します。
MYCURSOR CURSOR "mycursor.cur"

STRINGTABLE

  • 文字列テーブルを定義します。
STRINGTABLE
BEGIN
    IDS_HELLO "Hello, World!"
    IDS_GOODBYE "Goodbye!"
END

RCDATA

  • 任意のバイナリデータを定義します。
MYDATA RCDATA "mydata.dat"

リソースファイルの例

以下に、複数のリソースを含むリソースファイルの例を示します。

// MyResource.rc

// ビットマップリソース
MYBITMAP BITMAP "mybitmap.bmp"

// アイコンリソース
MYICON ICON "myicon.ico"

// 文字列テーブルリソース
STRINGTABLE
BEGIN
    IDS_HELLO "Hello, World!"
    IDS_GOODBYE "Goodbye!"
END

// カスタムバイナリデータ
MYDATA RCDATA "mydata.dat"

使用例

WAVEファイルをリソースとして実行ファイルに組み込み、使用する例です。

リソースデータは、TResourceStreamクラスを利用してストリームデータとして取り扱えます。

リソースファイル

WAVEファイル用のリソースファイルを作成します。

Sound_alarm1 WAVE "alarm1.wav"
Sound_ring5 WAVE "ring5.WAV"

TResourceStreamの定義

ヘッダファイルに、TResourceStreamの変数を定義します。

	TResourceStream *rs_ok;
	TResourceStream *rs_ng;

TResourceStream変数の生成

コンストラクタ等で、TResourceStream変数を生成します。

	rs_ok		= new TResourceStream((Winapi::Windows::THandle)HInstance, _TEXT("Sound_ring5"), _TEXT("WAVE") );
	rs_ng		= new TResourceStream((Winapi::Windows::THandle)HInstance, _TEXT("Sound_alarm1"), _TEXT("WAVE") );

TResourceStream変数の削除

WM_CLOSE等で、TResourceStream変数の削除します。

	delete rs_ok;
	delete rs_ng;

TResourceStream変数の使用

作成した、sndPlaySound APIを使用して音を鳴らします。成功時に、”ring5.WAV”、失敗時に “alarm1.wav” を鳴らす例です。

    if(ret)
    {   // 成功時
        rs_ok->Position = 0;
        sndPlaySound((const wchar_t *)rs_ok->Memory, SND_MEMORY | SND_ASYNC);
    } else {
        // 失敗時
        rs_ok-rs_ngPosition = 0;
        sndPlaySound((const wchar_t *)rs_ng->Memory, SND_MEMORY | SND_ASYNC);
    }

スクリーンセーバー関係

スクリーンセーバーの起動

    // スクリーンセーバーを起動する
	SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, 0);

スクリーンセーバーの設定画面の起動

   // スクリーンセーバーの設定画面を起動する
	::ShellExecute(Handle, _TEXT("open"), _TEXT("control.exe"), _TEXT("desk.cpl,,1"), _TEXT(""), SW_SHOW);

Webページの表示

#include <shellapi.h>

	String url = _T("https://progkeiyou.com/");
	ShellExecute(0, _T("open"), url.c_str(), NULL, NULL, SW_SHOWNORMAL);

RAD Studio 12 Athens ヘルプ

RAD Studio 12 Athens ヘルプです。

RAD Studio 12 Athens ヘルプ - RAD Studio

タイトルとURLをコピーしました