名前付けの重要性

独習データベース設計』を読んで勉強中です。

独習データベース設計』の第8章は「ネーミング標準」。
名前付けに1つの章を割いて説明しています。
名前づけの重要性を再確認しました。

一口に「顧客」といっても人によって意味が違ってきます。
製造の人は仕入れ先を、営業の人は取引先を顧客と呼んでいるかもしれません。
適切な名前を付けることは、しっかりしたデータベース設計には重要なことです。

ユニークな名前を付けることで、プログラムの変更する時の影響範囲を測定することも容易になります。

データベース設計では、概念モデルのキーはできるだけナチュラルキーを使う。

独習データベース設計』を読んで勉強中です。

データベース設計では、概念モデルのキーはできるだけナチュラルキーを使う。
概念モデルでは人工キーを設定しない。

ナチュラルキーの例

予約

顧客番号
予約年月日時刻

人工キーの例

予約

予約ID(意味なし連番)
予約番号

概念モデルから人工キーを使うと、本来何を持って一意に定まるのかがわからなくなってしまう。
概念設計段階では、意味的に分かりやすいナチュラルキーを使用する。

なお、実装する時は必要に応じてサロゲートキーを使う。

他人のブログを見ていると、概念設計や論理設計と物理設計を区別せずに、ナチュラルキーとサロゲートキーを論じているものがあるので注意が必要すること。

C++Builder XEでリモートマシンでデバッグする

C++Builder XEを使って、リモートマシンでデバッグを行う方法。

■リモートマシンへデバッガをインストールする

C:\Program Files\Embarcadero\RAD Studio\8.0\binにインストールされている次のファイルをリモートマシンにコピーします。

bccide.dll
bordbk150.dll
bordbk150N.dll
comp32x.dll
dcc150.dll
rmtdbg150.exe

このファイルをリモートマシンの「C:\remotedebug\」にコピーします。

リモートマシンでregsvr32.exeを実行し、bordbk150.dllとbordbk150n.dllを登録します。

C:\Windows\System32\regsvr32.exe bordbk150.dll
C:\Windows\System32\regsvr32.exe bordbk150n.dll

■リモートデバッグサーバーを起動する

次のコマンドを実行して、リモートデバッグサーバーを起動します。

rmtdbg150.exe -listen

タスクトレイに「Embarcadero Remote Debugger Listener」のアイコンが表示されます。

リモートデバッグサーバーを終了する時は、このアイコンを右クリックして「Exit」を選択します。

■プロジェクトのファイルをコピーする

ローカルマシンで新しいプロジェクトを作成します。

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  UnicodeString ver = L"Win32MajorVersion = " + IntToStr(Win32MajorVersion) +
                      L"\nWin32MinorVersion = " + IntToStr(Win32MinorVersion) +
                      L"\nWin32BuildNumber = " + IntToStr(Win32BuildNumber) +
                      L"\nWin32CSDVersion = " + Win32CSDVersion +
                      L"\nWin32Platform = " + IntToStr(Win32Platform);
  Memo1->Lines->Text = ver;
}

実行環境のバージョンを表示するプログラムです。
変数の意味は「Windowsのバージョンを取得する – C++Builder Tips」をご覧ください。

プロジェクトを実行して、動作することを確認します。

実行可能ファイルとシンボルファイルをリモートマシンにコピーします。
Debugフォルダー中のファイルをすべてコピーしておけば問題ないと思います。

■リモートマシンに接続する

RAD Studioのメニューから「実行」→「プロセスにアタッチ」を選択します。

リモートマシンのホスト名またはTCP/IP アドレスを指定して、「更新」ボタンを押します。

リモートマシンで実行中のプロセスの一覧が表示されたら接続に成功しています。

RAD Studioで、「実行」→「プロセスのロード」を選択します。

「リモート」を選択します。

「リモートパス」欄にリモートマシンにコピーした実行可能ファイルの場所を指定します。

「リモートホスト」欄にリモートマシンのホスト名またはTCP/IPアドレスを指定します。

「読み込み」ボタンを押します。リモートマシンのデバッガに接続されます。

リモートマシン側ではアプリケーションが起動しています。

デバッガの情報には、リモートマシンの情報が表示されています。

ITaskbarListによるタスクバーへのウィンドウの登録・削除

■ITaskbarListによるタスクバーへのウィンドウの登録・削除を行う関数

タスクバーにウィンドウを登録する関数

/**
 * タスクバーにウィンドウを登録する
 * @param hnd ウィンドウハンドル
 */
void AddTaskBarBtn(HWND hnd)
{
  ITaskbarList* TaskbarList;
  CoCreateInstance(CLSID_TaskbarList,
    0, 
    CLSCTX_INPROC_SERVER,
    IID_ITaskbarList,
    (void**)&TaskbarList);
  //タスクバーリストオブジェクトを初期化する
  TaskbarList->HrInit();
  //タスクバーにウィンドウを登録する
  TaskbarList->AddTab(hnd);
  //アクティブにする
  TaskbarList->ActivateTab(hnd);
}

タスクバーからウィンドウを削除する関数

/**
 * タスクバーからウィンドウを削除する
 * @param hnd ウィンドウハンドル
 */
void DelTaskBarBtn(HWND hnd)
{
  ITaskbarList* TaskbarList;
  CoCreateInstance(CLSID_TaskbarList,
    0, 
    CLSCTX_INPROC_SERVER,
    IID_ITaskbarList,
    (void**)&TaskbarList);
  //タスクバーリストオブジェクトを初期化する
  TaskbarList->HrInit();
  //タスクバーから項目を削除する
  TaskbarList->DeleteTab(hnd);
}

■サンプルプログラム

メインフォームでサブウィンドウを表示するようにします。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  (new TForm2(this))->Show();
}

サブフォームのOnActiveOnイベントでAddTaskBarBtn関数を実行すると、サブウィンドウをタスクバーに表示することができます。

static int i = 2;
__fastcall TForm2::TForm2(TComponent* Owner)
  : TForm(Owner)
{
  Caption = IntToStr(i++);
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caFree;
}
void __fastcall TForm2::FormActivate(TObject *Sender)
{
  AddTaskBarBtn(this->Handle);
}

さらにOnDeactivateイベントでDelTaskBarBtn関数を実行すると、サブウィンドウの中でアクティブなウィンドウだけをタスクバーに表示できます。

static int i = 2;
__fastcall TForm2::TForm2(TComponent* Owner)
  : TForm(Owner)
{
  Caption = IntToStr(i++);
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caFree;
}
void __fastcall TForm2::FormActivate(TObject *Sender)
{
  AddTaskBarBtn(this->Handle);
}
void __fastcall TForm2::FormDeactivate(TObject *Sender)
{
  DelTaskBarBtn(this->Handle);
}