True DB Gridの研究

初めに

あれは去年だったかな。True DB Grid 5発売時、な、なんと、"True DBGrid v4.0J"が無料配布されたのでした(LEADTOOLとかもやらないかな〜(笑))。試用版とかではなく、れっきとした製品。太っ腹にも程が有る、って感じで、私が即申し込んだのは言うまでも有りませんでしたがこれって実はVC++では動作保証してなくて、ヘルプも全てVBが対象だったので中々使いこなせませんでした。っていうか、全然使って無かったです。

そろそろ使おうと思います。で、判った事はこうしてHTMLに記述しておく、と。
別にインターネットにまで置く必要は無いんだけど、いちいち分けるとまたファイルを見失うのでま〜一緒にしときます。
ところで、TrueDBGridを母艦にケーブル接続したLiblettoにインストールしようとしてもなんかインストーラー動かないんだけど…。ん〜む、会社帰りの電車の中で開発計画が…。自宅ではお絵描きしたいんだけどなぁ。

目次

所で、TrueDBGridを使う時の資料は結局マニュアルとオンラインヘルプしかないのですが、さすが太っ腹の文化オリエント社もマニュアルまで無料配布はありませんでした。
で、TrueDBGrid Pro Ver4.0J のオンラインヘルプは分かり難いので、TrueDBGrid Pro Ver5.0の試用版の入手をお勧めします。オンラインヘルプはかなり改良されてまして、Ver4.0に比べると遥かに分かり易くなっています。Ver5はVer4のスーパーセットですから、使いまわしが効くのです。

目的

タイムシートを入力するとそれに従って画像ファイルを読みこみ、映像ファイルを出力するアプリケーションを作るのに使おうと思います。 昔、FM-TOWNSでこれをやろうとしたら、グリッドを表示するだけでエライ騒ぎで、結局、コマンドモードのアプリケーションにした覚えがあります。
この目的の下、TrueDBGridって標準のFlexGridより何がいいか、て言うと、

です。なんか使い方は普通のFlexGridのほうが簡単に見えますが…まぁがんばりますです。しかし、そもそもVB使うのって初めてだったり…
それにしても最大の特徴の「データベースと連携」が使われてないなぁ…

準備

Visual Basic Ver5の場合

ツールボックス上で右クリック。するとコンポーネント追加ダイアログが出ます
コントロール追加
この画面で追加する。一覧に無いときは、参照ボタンを押して自分でOCXを探す。
ファイル参照
すると、パネルに何やら牛の頭みたいなのが追加される。後は他のコントロールと同じ。

Visual C++ Ver5の場合

ファイルメニューのプロジェクト→プロジェクトへ追加→コンポーネント及びコントロールを選択すると
コントロール追加
この画面になったら、当然ActiveX Controlを選択する。
コントロール追加
ここで、TrueDBGrid Controlを選択する。

画面に大きさを合わせる

とりあえずSDI画面に貼りつけたTrue DB Gridの大きさを常に画面に対応した大きさにする。

Visual Basic Ver5の場合

VBは初めてですがおそらく、 でいい筈。…だけど、嗚呼、イベントハンドラの作り方が判らん…と思ったら、自分でエディターに書くらしい。クラスウィザードみたいに関数だけ自動で用意してくれる機能があると思ったんだけど… Private Sub Form_Resize() ' MsgBox "サイズ変更" TDBGrid1.Width = Width - 295 TDBGrid1.Height = Height - 1485 End Sub これでOKでした。Width,HeightをForm.Widthとかすると、宣言されてませんエラーとなるのが謎。メンバー変数は省略必須なのか…
ウィンドウのサイズに合わせてグリッドの大きさが変わる
とりあえず分かった事は、VBプログラムの冒頭に Option Explicit は何が何でも付けるべしって事でした。付けないと変数の宣言チェックをしてくれないのだ。

Visual C++ Ver5の場合

VC++の場合は、私やり方知ってましたので簡単でした。

///////////////////////////////////////////////////////////////////////////// // CTrueDBGridCtrl ラップ クラス class CTrueDBGridCtrl : public CWnd {  …

サイズ変更は当然、ビュークラスのOnSize()で行います。

void CTdbgridView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください int sx,sy,wx,wy; CTrueDBGridCtrl *tdb=(CTrueDBGridCtrl *)GetDlgItem(IDC_TDBGRID1); if(tdb!=NULL){ // グリッドの左上位置と幅を求める sx = 10 ; sy = 30 ; wx = cx-20; wy = cy-40; Invalidate(); tdb->MoveWindow(sx,sy,wx,wy); tdb->Refresh(); //グリッドの中身も描きなおす必要がある。 } } でOKでした。普通のコントロールと同じですね。
ウィンドウのサイズに合わせてグリッドの大きさが変わる

アンバウンドモードを使ってみる

・アンバウンドモード(拡張)
・アプリケーションモード
があるそうですが、先ずはアンバウンドモード(拡張)=データモード2 を使って、 以下の構造体の10*10の配列を表示する。 typedef struct { int sel_no; int alpha; int mode; int move_x; int move_y; int size_x; int size_y; int rotate; int focus; }PIC; PIC m_doc[10][10];

Visual C++ Ver5の場合

イベントは 色々有るけど、先ず最低限、
UnboundReadDataEx
のイベントハンドラを記述すれば、最低限表示は出来そう。

データを編集するとなると、
UnboundWriteData
UnboundAddData
UnboundDeleteRow
も必要らしい。

要は、 BEGIN_EVENTSINK_MAP(CTdbgridView, CFormView) //{{AFX_EVENTSINK_MAP(CTdbgridView) ON_EVENT(CTdbgridView, IDC_TDBGRID1, 41 /* UnboundReadDataEx */, OnUnboundReadDataExTdbgrid1, VTS_DISPATCH VTS_PVARIANT VTS_I4 VTS_PI4) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() void CTdbgridView::OnUnboundReadDataExTdbgrid1(LPDISPATCH RowBuf, VARIANT FAR* StartLocation, long OffSet, long FAR* ApproximatePosition) { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください }

ビュークラスのこの関数内で、RowBufに然るべきデータをセットすれば良いんですね。
で、途中までコーディングしたんですが…VC++で、Columnsオブジェクトのメンバーにはどうやってアクセスするんだろ〜?? 謎〜。
…と思ったら、GetColumns()ってのがあった。多分Column型?オブジェクトを作って、これに代入して操作するんだと思う。リストビューコントロールにも同じ名前のメンバー関数があった。この辺からたどって行けるかも。リストビューを使ったサンプルを探すべし。
VBを真面目に会得するべきか、ここから調査して行くべきか…悩む所です。2兎を追う者1兎も得ず…

アプリケーションモードを使ってみる

どうも、セル毎にイベントが発生するこちらのモードの方が向いてるみたいなので、方針を変更。

Visual Basic Ver5の場合

で、どうもC++で行おうとすると、COMの勉強が必要らしい。COM VS BASIC学び易いのはどっちだ?と聞かれたら、どう考えてもBASICの方が10000倍楽なので、VBに決定。インターフェース部分はBASICで作り、MMXとかでかっ飛ばす部分はVC++にしようと思う。思えば昔はBASIC+マシン語だったっけ。

以下の構造体の10*10の配列を表示する。サンプルがあるから簡単に出来る筈。

typedef struct { char *filename; int x; int y; int alpha; }PIC; PIC m_doc[10][10]; とりあえずヘルプで言う“ブックマーク”が良く分からない。どうも各行を識別する数値らしいけど、行番号とは違うのだろうか。と、思ったら、配列を表示する時は行番号をブックマークとして使用できますと書いてあった。 UnboundGetRelativeBookmarkコントロールがブックマークを取得する必要があるときに発生
ClassicReadコントロールが、アンバウンド時に表示に必要なデータを要求したときに発生
のイベントハンドラを記述すれば、最低限表示は出来そう。

データを編集するとなると、
ClassicWriteData
ClassicAddData
ClassicDeleteRow
も必要らしい。どうもClassicって付くのが気に入らない。

現在(99/4/17)の不明点

Visual Basic 5.0

Visual C++ 5.0


何となく、VBの方がありがちな不明点で、解決し易そうな気がするが…。グリッド使用例のサンプルも皆VBだし。ただ、私はC++の経験はあるけど、BASICはN88とかFの時代のしか知らないので覚えるのが大変そうかも。行番号無いし小文字の量が多いし変数のスコープは有るしちっともBASICに見えない(笑)。やっぱBASICと言えば、 10 PRINT "BAKA" 20 GOTO 10 じゃ無きゃやだい。
フリーソフトウェアへ戻る
ホームページへ戻る
お手紙はnekora@mapletown.netまで☆