MAD3D Topへ →叶迫攝ン計研究所Topへ  記述責任者名倉 裕

BCBプログラミング覚え書き

プログラミング環境

目次

 リンク 私が参考にしたWEBページ


シリアルポート番号10以上の設定

 CreateFile()関数で、シリアルポート番号10以上を設定する時、ファイル名を次のように設定する。
 ポート番号=10の時、"\\.\COM10"

 C記述例
CreateFile(
 "\\\\.\\COM10",
 GENERIC_READ | GENERIC_WRITE,
 0,
 0,
 OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,
 0
);

参照 Microsoft サポート オンライン 

塗りつぶさない円、楕円

 TCanvas->Ellipseメソッドで楕円を描くと、楕円周の色はTCanvas->Pen->Colorで、中はTCanvas->Brush->Colorで塗りつぶされる。
 塗りつぶさない楕円を描くには、
 TCanvas->Brush->Style = bsClear;
と設定する。
 戻す事を忘れないように。初期値はbsSolid(べた塗り)。

ハンドル開放せず

 CreateFile(), CreateEvent()などの関数でハンドルを獲得する。
 このハンドルは適宜、CloseHandle()で開放しなければならない。
 ハンドルを次から次に獲得して開放を怠ると、ソフトウェアはいずれ停止するか、WindowsXPがブルースクリーンを生じる。
 メモリリークと違ってハンドルの未開放は、CodeGuardは監視、警告してくれない。
 タスク・マネージャーがハンドルの数を表示して、奇妙な増加を見せてくれるだけだ。

通信デバイスの判別

RS232C と RS422 の判別法 標準RS232Cポートと、USB/RS422変換器( Edgeport/1i )
 
使った関数
bool GetCommProperties( HANDLE hdl, LPCOMMPROP cp );
hdl : 通信デバイスのハンドル
cp : COMMPROP構造体へのポインタ
 
上記関数を実行した結果、COMMPROP構造体中
cp.dwProvSubType == 1 : RS232C
cp.dwProvSubType == 3 : RS422
となる。
 
dwProvSubType は、以下の値が定義されている。(BCB.6 winbase.h)
#define PST_UNSPECIFIED ((DWORD)0x00000000)
#define PST_RS232 ((DWORD)0x00000001)
#define PST_PARALLELPORT ((DWORD)0x00000002)
#define PST_RS422 ((DWORD)0x00000003)
#define PST_RS423 ((DWORD)0x00000004)
#define PST_RS449 ((DWORD)0x00000005)
#define PST_MODEM ((DWORD)0x00000006)
#define PST_FAX ((DWORD)0x00000021)
#define PST_SCANNER ((DWORD)0x00000022)
#define PST_NETWORK_BRIDGE ((DWORD)0x00000100)
#define PST_LAT ((DWORD)0x00000101)
#define PST_TCPIP_TELNET ((DWORD)0x00000102)
#define PST_X25 ((DWORD)0x00000103)

TDateTimeの型変換

 TDateTimeの整数部は日付、小数部は時刻を表す。
 double型で初期化できる。
 しかし、式の中でdouble型と同等ではない。
 double型と混合計算すると、思わぬ結果になることがある。
 TDateTime演算結果の型は、定義しなければならない。
 
 次のソースコードでは、x と y は違った値になる。
 (1)
double s = 1.41;
TDateTime dt, dt1, dt2;
dt1 = dt.CurrentDateTime();
dt2 = floor( dt1 );
double x, y;
x = 100 * static_cast< double >( dt1 - dt2 ) / s; // (A)
y = 100 * ( dt1 - dt2 ) / s; //(B)

Edit1->Text = x;
Edit2->Text = y;
 結果はたとえば、x == 42.63...、y == 60になる。(時刻によって異なる)
 (B)の計算は、以下の通りと考えられる。
  1. ( dt1 - dt2 )を double で計算 → 0.599175
  2. 100 を乗算して整数化 → 60
  3. s を整数化して除算 → 60

 y を計算する式を少し簡単にする。
(2)
y = ( dt1 - dt2 ) / s;

 これにコンパイラは次のエラーを表示する。
(3)
[C++ エラー] Unit1.cpp(28): E2015 '_fastcall TDateTime::operator double() const' と '_fastcall TDateTime::operator int() const' の区別が曖昧

 次のように変更すると曖昧さはなくなり、エラーは出ず、期待した値を得る。
(4)
y = 100 * ( dt1.operator double() - dt2.operator double() ) / s;
 

(1)のソースコードについて

 (B)行にエラーは出ず、間違った結果を得る。
 注意が必要である。

 (A)行は期待する結果を得られたが、(4)の形に書き換えるか、各変数に対してキャストするのが良い。
 

BCB Ver.6対応

 Ver.5からVer.6.0 への変更に伴う、ソースファイルの変更点一覧。
 下記各機能を使っていれば、ヘッダーファイルを追加しなければならない。

機能 追加ヘッダー
vector #include <vector.h>
sort( v.begin(), v.end() ); #include <algorithm>
MAXPATH #include <dir.h>
TProgressBar #include <ComCtrls.hpp>

リンク 私が参考にしたWEBページ


以上 2005-2007