3

行ごとに異なるデータ型を持つ可能性のあるデータの db グリッドで表示および編集できるように、Delphi グリッドを作成しようとしています。データ タイプごとに特定のコントロールを表示したいと考えています。たとえば、データ タイプが DateTime の場合、日付を入力したりカレンダーをポップアップしたりできるカスタム編集コントロールを表示したいと考えています。

データは次のようになります。

Name   DataType   DateValue   StringValue   BooleanValue     
---------------------------------------------------------
A      Date       1/1/2007 
B      String                 asdf
C      Boolean                              True

...そしてデータベースでは、このテーブルには値の可能なタイプごとに列があります。などのBooleanValue列があります。DateValue

私がしたいのは、その行の「DataType」に応じて適切な編集コントロールを表示するグリッドに単一の「値」列を表示することです。したがって、グリッドは次のようになります。

Name   DataType   Value     
---------------------------
A      Date       1/1/2007 
B      String     asdf
C      Boolean    True

Value列の値に基づいて、行ごとに動的に異なる編集コントロールを表示する必要があるようです (ユーザーが列を編集できるようにするため) DataType。この種の問題を処理する、より高度なグリッドがあることは知っていますが、その能力では、Delphi ですぐに使用できるもの以外は許可されません。

このようなものを作る方法についてのアイデアはありますか?

4

3 に答える 3

4

TDBGrid個人的には、この場合、テーブルは DB 正規化されていないため (実際には使用しません)、直接編集するつもりはありません。計算フィールドを使用してグリッドに目的の値を表示TDBxxxEditし、各フィールド タイプのフォームに を動的に作成します (TDBTreeEditたとえば、独自のTDBRichEdit、または DB 画像ピックアップ エディターなど...? )。

で独自のコントロールを使用し、デフォルトのエディターTDBGridを置き換えたい場合は、次の記事を参照してください: DBGridにコンポーネントを追加する および関連記事: Delphi の TDBGrid で MEMO フィールドを表示および編集するTInplaceEdit

于 2012-04-09T20:33:42.273 に答える
3

すべてのデータを同じ列に表示するのは非常に簡単です。計算された文字列フィールドを追加するだけで、その行に格納する内容に応じて値を変更できます。

編集はかなり複雑です。インプレース エディターが必要な場合は、大変な苦労を強いられます。値を編​​集するダイアログを表示したい場合は、はるかに簡単です。列オブジェクトをグリッドに追加し、計算フィールドにアタッチした列を設定してボタンを表示できます。ボタンをクリックすると、その行に必要な編集ダイアログが表示され、ダイアログが閉じられたときに編集がコミットされます。

他にも方法はありますが、上記の方法が最短だと思います。他の方法には、データを 1 つの列に表示するためのカスタム描画イベント、独自のエディターを作成するためのクリックのインターセプトなどが含まれる場合があります。

于 2012-04-09T22:00:33.763 に答える
0

計算フィールドを追加した後。
サンプル:

procedure OnCalculate(DataSet:TDataSet);
begin
  case IndexText(DataSet['ValueType'],['Date','String','Boolean']) of 

    0:DataSet['DateValue']:=StrToDateTime(DataSet['Value']); // also converting
    1:DataSet['StringValue']:=DataSet['Value'];
    2:DataSet['BooleanValue']:= MatchText(DataSet['Value'],['1','True','T','Y','Yes']);
{etc datatypes}
   end;
end;
于 2012-04-10T05:15:19.427 に答える