2012-04-09 12 views
3

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

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

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

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

私がしたいのは、その行の 'DataType'に応じて適切なエディットコントロールを表示するグリッドに単一の 'Value'列を表示することです。だから、グリッドは次のようになります。

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

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

この作品の作成方法については、どのようなアイデアですか?

+0

それはあなたが、これは無意味であるためボックスソリューションのうちまたはサードパーティ製のコントロールを見つけようと、あなたのグリッドの「OnDraw」イベント – paulsm4

+2

に過負荷をかけることになるだろうように聞こえます。あなたが言っていることは、データテーブルの概念に収まらない。 –

+0

データベースのフィールドはどのようなタイプですか?文字列? –

答えて

4

個人的には、テーブルがDB正規化されていないため、私は直接TDBGridの内部で編集するつもりはありません(実際には使用しません)。私はに計算されたフィールドを使用していましたグリッド内の希望の値を動的に各フィールドタイプのフォームにTDBxxxEditを作成しました(自分のTDBTreeEditの場合はTDBRichEdit、DB Image pickupエディタ、等...?)。

あなたは以下の記事参照することができ、TDBGridに独自のコントロールを使用すると、デフォルトTInplaceEditエディタを置き換えない場合:Adding components to a DBGrid、および関連記事を:内のすべてのデータを表示するDisplaying and editing MEMO fiels in Delphi's TDBGrid

3

同じ列は非常に簡単です。計算された文字列フィールドを追加して、その行に格納している値に応じて値を変更することができます。

編集はかなり複雑です。あなたがインプレースエディタを使いたいのであれば、あなたは傷ついている世界のためにいるのです...私はそれをしました、それは痛みであり、多くの時間がかかります。値を編​​集するダイアログを表示したい場合は、はるかに簡単です。グリッドに列オブジェクトを追加することができます。また、計算フィールドに添付した列を設定してボタンを表示することもできます。ボタンをクリックすると、その行に必要な編集ダイアログが表示され、ダイアログが閉じられると編集がコミットされます。

これを行うには他にも方法がありますが、私は上記が最短の方法であると言います。他の方法では、カスタム描画イベントを使用してデータを1つの列に表示したり、クリックをインターセプトして独自のエディタなどを作成したりすることができます。

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; 
関連する問題