2012-01-26 50 views
4

私の質問は、チェックボックスの項目を持つDelphi 7のdbgridに列を設定する方法です。DBGridのCheckBox

ありがとうございます。

+10

こんにちは、あなたはあなたに従ってみましたか? ['this'](http://delphi.about.com/od/usedbvcl/l/aa082003a.htm)チュートリアル? – TLama

+2

@TLama、答えとしてあなたのコメントを投稿すれば、私は投票するだろう。 –

+2

@traama、完璧なリンク(それは答えにしないと良い選択です)。 PA、他のコンテンツを持たない外部サイトへのリンク(または外部リンクが動作しない場合は無意味なコンテンツ)は、ここでは受け入れられない答えです。アンサーはスタンドアロンで、他のコンテンツなしで有用なままでなければなりません。 TLamaは完璧な決断を下しました。外部リンクのみの回答は、通常、すぐにフラグが立てられ、削除されます。 –

答えて

0

OK 私の問題はthisです。 OKしかし問題は、それがどのようにすべきかを理解していないということです。だから私はコード内の私のロジックを変更します。また、リスト内のdbgridから選択した行を保存することで実装します。

+1

IMHO、これは答えにはなりませんが、主題に関する編集です。たぶんあなたは、あなたが物事をどのようにしているかを啓発するためのいくつかのコードを含めるといいでしょう... –

1

TClientDataset + TDatasetProvider + TDatasetを使用している場合は、クライアント配列に到達する前にデータ配列バリアントを操作し、更新不可能なブール値フィールドを含めることができます。

完了したら、OnDrawColumnCellイベントを使用してグリッドに描画するだけで済みます。ここでは、CheckBoxを使用せず、ビットマップのみを使用します(ユーザーがクリックすると、選択/選択解除に変わります)。

9

次のように私がテストしたとして、最も簡単で最も完全な方法がある:あなたのユニットのプライベートセクションで

、グリッドオプションを保持するためのグローバルを宣言します。これは、チェックボックス列を入力中に、一時的な無効化テキスト編集後に復元するために使用されます - これは多分delphi.about.comの記事OnCellClickで

private  
    GridOriginalOptions : TDBGridOptions; 

に関するヨルダンBorisovinで述べた小さなエラーのいずれかであるとして、データベースグリッド

0123のブールフィールドのチェックボックスを描く

procedure TForm1.DBGrid1CellClick(Column: TColumn); 
begin 
    if (Column.Field.DataType=ftBoolean) then 
    begin  
    Column.Grid.DataSource.DataSet.Edit; 
    Column.Field.Value:= not Column.Field.AsBoolean; 
    Column.Grid.DataSource.DataSet.Post; 
    end; 
end; 

にイベント、フィールドがブール値である場合、トグル、ポスト変更

新しい部分では、ブール値の列にある間にセルの編集を無効にします。 OnColEnterとOnColExitイベントの場合:さらに

procedure TForm1.DBGrid1ColEnter(Sender: TObject); 
begin 
    if Self.DBGrid1.SelectedField.DataType = ftBoolean then 
    begin 
    Self.GridOriginalOptions := Self.DBGrid1.Options; 
    Self.DBGrid1.Options := Self.DBGrid1.Options - [dgEditing]; 
    end; 
end; 

procedure TForm1.DBGrid1ColExit(Sender: TObject); 
begin 
    if Self.DBGrid1.SelectedField.DataType = ftBoolean then 
    Self.DBGrid1.Options := Self.GridOriginalOptions; 
end; 

、それのチェックボックス

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    if ((Self.DBGrid1.SelectedField.DataType = ftBoolean) and (key = VK_SPACE)) then 
    begin 
    Self.DBGrid1.DataSource.DataSet.Edit; 
    Self.DBGrid1.SelectedField.Value:= not Self.DBGrid1.SelectedField.AsBoolean; 
    Self.DBGrid1.DataSource.DataSet.Post; 
    end;  
end; 

を切り替えるためのスペースキーを扱います!

0

私は答えとしてこれを投稿していただきありがとうございます。私はまだコメントを追加する評判はありません。

Mihai MATEIの回答は、バグのあるユースケースを除いて、まれな(実際に働く)ソリューションに非常に近いです。

グリッド上のユーザーの最初の操作でチェックボックスをクリックすると、最初のクリックは機能しますが、2番目のクリックは基になるDBGridエディタを表示します。

これは、「GridOriginalOptionsmechan」メカニズムを初期化する必要があるためです。 は、そのためには、単にグリッドのフォーカス取得時イベントに次のコードを追加します。それ

procedure TForm1.DBGrid1Enter(Sender: TObject); 
begin 
    DBGrid1ColEnter(Sender); 
end; 

だそれ!