DB Engine 再探求 PJ #1


スケルトン:サンプル


/////////////////////////////////////////////////////////////////////
//DBスケルトンサンプル        06/25/98

#include "lxapi.h"        // NKIT
#include "dbapi.h"        // for DB Engine


//    文字列

char far  *msgAppName     = "DB-0";
char far  *msgQuit        = "Quit";
char far  *msgOK         = "OK";
char far  *msgNull        = "";

char far  **StringTable[] = {
    &msgAppName, &msgQuit, &msgOK, 
};


//    グローバル変数

LHAPIBLOCK  LhapiData;
EVENT_NORM  app_event;
BOOL        Done;

#define    MAX_CARD_WNDS    16
char far  *SysMgrPtrs[MAX_CARD_WNDS + 27];  // シスマネ管理 far_pointer_table


//    関数プロトタイプ

void far DoQuit(void);
int far MainHandler(PLHWINDOW Wnd, WORD Message, WORD Data, WORD Extra,...);


/////////////////////////////////////////////////////////////////////
//    以下、DBエンジン関連

DBBLOCK dblk;        // DBブロック構造体
char    db_filename[50] =    "c:\\_dat\\phone.pdb";      // DBファイル名
char    filetype        =    'D';                        // タイプ == GDB
char    paswd[]         =    "";                         // パスワード

int DB_open_and_setvpt(void);

/////////////////////////////////////////////////////////////////////


//        ファンクションキー定義

LHFKEY MainFkeys[] = {
    { (PLHRES)&msgQuit,    (PLHFUNC)DoQuit,    1, 0 },
    { (PLHRES)&msgOK,    (PLHFUNC)CMD_DONE,    10+FKEY_LAST, FKEY_SENDMSG }
};


//        メニュー定義

LHMENU MainMenu[] = {
  { (PLHRES)&msgQuit,    (PLHFUNC)DoQuit, 0, 0, NO_HELP },
  { 0, 0, 0, 0}
};


//        WINDOW 定義

LHWINDOW TDateTime = {
    DateTime, 0, 0, 0, 0,
    0, 0, 0, STYLE_DATETIME | STYLE_NOFOCUS,
    NULL, NO_FKEYS, NO_MENU, NO_HELP
};

LHWINDOW MainTitle = {
    TitleBar, 0, 0, 0, 0,
    (PLHRES)&msgAppName, 0, 0, STYLE_NOFOCUS,
    NULL, NO_FKEYS, (PLHMENU)&TDateTime, NO_HELP
};


LHWINDOW MainView = {
    (PLHCLASS)MainHandler, 0, 0, 640, 200,
    (PLHRES)&msgNull, 0, 0, 0,
    NULL, MainFkeys, MainMenu, NO_HELP
};


//    ハンドラー

int far MainHandler( PLHWINDOW Wnd, WORD Message, WORD Data, WORD Extra,...)
{
    // ここへアプリケーションの動作が入る

    return SubclassMsg(Object, Wnd, Message, Data, Extra);
}


void far DoQuit(void)
{
    Done = TRUE;
}


int DB_open_and_setvpt(void)    //DBオープン,と View_Pointer_Table セット
{
    if (DB_Open(&dblk, db_filename, filetype, NULL, paswd, 0, 0) < 0)
        return FALSE;

    if (DB_SetCurrentViewpt(&dblk, 0) < 0) {    //View_Ptr_Table を 0 に選択
        DB_Close(&dblk);
        return FALSE;
    }
    return TRUE;        // ... エラー処理等はもっとマジメにした方が良い(^^;
}


void FixupFarPtrs(void)
{
    int    i;

    for (i = 0; i < countof(StringTable); i++)
        *((int *)StringTable[i] + 1) = _DS;        // MS_C, LSI_C では修正必要
}


//    メイン

void main(void)
{
    InitializeLHAPI(&LhapiData);
    m_init_app(SYSTEM_MANAGER_VERSION);
    m_reg_app_name(msgAppName);

    m_reg_far(&SysMgrPtrs, countof(SysMgrPtrs), 4);    // far_pointer_Table 登録    m_flush_kb();

    SetDefaultFont(FONT_NORMAL);
    SetMenuFont(FONT_NORMAL);

    DB_Init();                    //DBの初期化
    DB_open_and_setvpt();        //DBオープン,と View_Pointer_Table セット


    SendMsg(&MainTitle, CREATE, CREATE_NORMAL, 0);
    SendMsg(&MainView, CREATE, CREATE_FOCUS,  0);

    Done = FALSE;

    while (!Done)                    //以下イベントループ
    {
        DB_FlushFile(&dblk);        //DB(バッファ内)データ書き込み

        app_event.do_event = DO_EVENT;
        m_action(&app_event);

        switch (app_event.kind)
        {
            case E_ACTIV:
            case E_REFRESH:
                FixupFarPtrs();
                DB_Reactivate(&dblk);            //DB再アクティブ化
                ReactivateLHAPI(&LhapiData);
                break;
            case E_DEACT:
                DB_Deactivate(&dblk);            //DB非アクティブ化
                DeactivateLHAPI();
                break;
            case E_TERM:
            case E_BREAK:
                FixupFarPtrs();
                Done = TRUE;
                break;
            case E_NONE:
                SendMsg(&TDateTime, DRAW, DRAW_ALL, 0);
                break;
            case E_KEY:
                SendFocusMsg(KEYSTROKE, app_event.data, app_event.scan);
                break;
        }
    }
    DB_Close(&dblk);            //DBクローズ

    app_event.do_event = DO_FINI;
    m_action(&app_event);
}

/////////////////////////////////////////////////////////////////////

Count (03/27/1999) ->

update 03/27/1999, since 06/25/1998(original)
Copyright (c) 1999
by guel. All rights reserved.