Delphiを使用してデータベースアプリケーションを開発すると、テーブルコントロールを使用してレポートを作成します。テーブルコントロールのOndrawcellイベントを柔軟に使用すると、いくつかの特殊効果の表示を完了し、ユーザーのニーズをよりよく満たすことができます。この記事では、Ondrawcellイベントを柔軟に使用するための3つのヒントを紹介します。
テーブルの行の色を動的に更新します
レポートでテーブルの行の色を動的に更新する必要がある場合があります。たとえば、サプライヤーリストでは、優先供給のサプライヤーが緑色で表示され、他のサプライヤーは赤で表示されます。この時点で、次のコードを使用して、Ondrawcellイベントに実装できます。
表1.fieldbyname( 'custno')。asinteger> 1500 thenの場合
dbgrid1.canvas.font.color:= clred;
dbgrid1.defaultdrawcolumncell(rect、datacol、
列、状態)
上記のコードは、アプリケーションのニーズに応じて拡張できます。たとえば、太字で表示する必要がある場合は、対応する行を次のように変更するだけです。
dbgrid1.canvas.font.style:= [fsbold];
テーブルに他の視覚コントロールを挿入します
データベースプログラミングでは、外部キーの制約は、データベース内のデータがユーザーの要件に従って保存されるようにするための効果的な方法です。たとえば、注文処理環境では、注文テーブルと顧客テーブルの間に外部のキーの制約があります。つまり、注文テーブルの各レコードには、顧客テーブルに対応するアイテムが必要です。このようにして、注文フォームに記入するとき、ユーザーが入力フォーカスで選択するために顧客リストが提供される場合、データの正しさは効果的に保証されます。
dbgridコントロールとstringgridコントロールの両方は、dbgridコントロールがデータを入力できるtcustomgridから派生しています。 dbgrid処理のためのDelphiの内部メカニズムは、グリッド上にdbeditコントロールを浮かせることです。フォーカスと入力データを取得できるグリッドは、実際にはフォーカスが転送されると、編集ボックスのテキストが取得されない場所とStingGridの違いはありません。そのため、テーブルにデータが入力されます。したがって、他の視覚コントロールをテーブルに挿入する方法は、グリッド上の視覚コントロールを浮かせることです。したがって、原則として、すべてのコントロールをテーブルに挿入できます。この記事では、テーブルにドロップダウンボックスを挿入して、グリッドに他のコントロールを挿入するための特定の手順を導入する例を紹介します。
1。プロパティを設定します
クライアントリストのアイテムプロパティをドロップダウンボックスに読み取ります。
2。 OnDrawCellイベントのセットアップ
テーブルのセルを描くときに、オンドローセルイベントが発射されます。フォーカスを取得するセルに対応するフィールドがドロップダウンボックスに対応するフィールドと一致する場合、ドロップダウンボックスをグリッドに移動してフォーカスを取得し、ドロップダウンボックスを表示し、それにより表示する機能を実現します。テーブルの指定された列のドロップダウンボックス。テーブルを設定するためのオンドローセルイベントは次のとおりです。
if(gdfocused in state)then
始める
//対応するフィールドが一貫している場合は、実行します
if(grid.cells [acol、0] = 'company')then
始める
//ドロップダウンボックスを指定された位置に移動します
combobox1.left:= rect.left+ grid.left;
combobox1.top:= rect.top + grid.top;
combobox1.width:= rect.right-rect.left;
combobox1.height:= rect.bottom-rect.top;
//ドロップダウンボックスを表示し、フォーカスを獲得します
combobox1.visible:= true;
combobox1.setfocus;
終わり;
終わり;
3。オンクリックイベントのセットアップ
フォーカスを取得するセルに対応するフィールドが、ドロップダウンボックスに対応するフィールドと一致しない場合、ドロップダウンボックスは表示されません。これを行うには、次のようにテーブルのオンクリックイベントを設定します。
if(grid.cells [grid.col、0] <> 'company')then
始める
combobox1.visible:= false;
終わり;
4。 Onchangeイベントのセットアップ
Ondrawcellイベントでは、セルを描画してドロップダウンボックスを表示する作業のみが完了し、テーブルにデータを入力することはできません。これを行うには、次のようにドロップダウンボックスのオンチェンジイベントを設定します。
grid.cells [grid.col、grid.row]:= combobox1。
items [combox1.itemindex];
これにより、テーブルにドロップダウンボックスを挿入する作業が完了します。
表にグラフィックフィールドを表示します
プログラム開発では、レポートに表示される必要がある場合があります。たとえば、部品検査レポートの検査項目フィールドには、部品の機械加工の粗さや耐性の機械加工などの型破りな文字が含まれています。この問題を解決する一般的なアイデアは、これらの型破りな文字をSQL Serverデータベースの画像フィールドなどのグラフィカルフィールドとして保存することです。ただし、StringGridコントロールであろうとdbgridコントロールであろうと、テーブルコントロールにグラフィックフィールドを表示する方法の問題を作成する文字列のみを直接表示できます。
一見すると、この問題は、上記の方法を使用してdbimageコントロールをテーブルに挿入することで解決できます。ただし、これにはレコードと同じ数のコントロールを挿入する必要があります。 、しかし、グラフィックスフィールドでも明らかになります。より良い解決策は、データベースに接続するときにdbimageコントロールを動的に作成し、それを使用してデータベースの画像フィールドを読み取り、一時ファイルとしてクライアントハードディスクに保存することです。テーブルのOndrawcellイベントで一時的なファイルを読み、クライアントが終了すると描画作業が削除されます。テーブルにグラフフィールドを表示するための具体的な手順を以下に示します。
1。画像フィールドを保存します
クエリを実行するときにすべての画像フィールドを読み取り、クライアントハードディスクに保存します。
始める
... //クエリステートメントを省略します
filename:= 'd:emp'; //一時ファイルパスを初期化します
mydbimage:= tdbimage.create(self); // dbimageを作成します
mydbimage.parent:= self;
mydbimage.datasource:= dataSource1;
mydbimage .datafield:= 'description'; //「説明」フィールドとして指定します
インデックス:= 1;
clientData.eofではありませんが//データベースを読み取ります
s:= inttostr(index);
filename1:= filename+s;
filename1:= filename1+'。bmp';
//一時ファイルを保存します
mydbimage .picture .bitmap .savetofile(filename1);
grid.cells [1、index]:= '';
//フォームに記入します
grid.cells [2、index]:= clientdata.fieldbyname( '測定データ')。asstring;
clientData.Next;
インデックス:=インデックス+1;
終わり;
mydbimage.destroy();
終わり;
2。グラフィックをコピーします
OnDrawCellイベントを設定し、一時ファイルを読み、グラフィックを指定したテーブルの列にコピーします。
((acol = 1)および(arow> 0)and(grid.colcount> 2))の場合、開始します
//テーブルには少なくとも2つの列が必要です
ファイル名:= 'd:emp';
s:= inttostr(arow);
ファイル名:= filename+s;
filename:= filename+'。bmp';
myimage:= timage.create(self); //画像制御を作成します
myimage.parent:= self;
//一時ファイルを読み取ります
myimage.picture.bitmap.loadfromfile(filename);
//グラフィックをコピーします
grid.canvas.draw(rect.left、rect.top、myimage。
picture.graphic);
myimage.destroy();
終わり;