私の質問は、チェックボックス項目を含むDelphi7のdbgridに列を設定する方法です。
前もって感謝します。
私がテストした最も簡単で完全な方法は次のとおりです。
ユニットのプライベートセクションで、グリッドオプションを保持するためのグローバルを宣言します。これは、チェックボックス列に入力しているときにテキスト編集を一時的に無効にした後の復元に使用されます。これは、delphi.about.comの記事に関してJordanBorisovinが言及した小さなエラーの1つである可能性があります。
private
GridOriginalOptions : TDBGridOptions;
OnCellClickイベントで、フィールドがブール値の場合、切り替えてデータベースに変更を投稿します
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;
グリッドのブールフィールドのチェックボックスを描画する
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState: array[Boolean] of integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED) ;
begin
if (Column.Field.DataType=ftBoolean) then
begin
DBGrid1.Canvas.FillRect(Rect) ;
if (VarIsNull(Column.Field.Value)) then
DrawFrameControl(DBGrid1.Canvas.Handle,Rect, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_INACTIVE)
else
DrawFrameControl(DBGrid1.Canvas.Handle,Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
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;
それでおしまい!
TClientDataset + TDatasetProvider + TDatasetを使用している場合は、clientdatasetに到達する前にデータ配列バリアントを操作し、更新不可能なブールフィールドを含めることができます。
完了したら、必要なのはOnDrawColumnCellイベントを使用してグリッド上に描画することだけです。ここでは、チェックボックスを使用せず、ビットマップのみを使用しました(ユーザーがクリックすると、選択済み/未選択に変わります)。
これを回答として投稿してすみません。コメントを追加するという評判はまだ50ありません。
Mihai MATEIの答えは、バグがあるユースケースを除いて、(実際に機能しているように)まれなソリューションに非常に近いものです。
グリッドでのユーザーの最初のアクションがチェックボックスをクリックすることである場合は常に、最初のクリックは機能しますが、2番目のクリックは基礎となるDBGridエディターを表示します。
これは、「GridOriginalOptionsmechan」メカニズムを初期化する必要があるために発生します。これを行うには、グリッドのOnEnterイベントに次のコードを追加するだけです。
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
DBGrid1ColEnter(Sender);
end;
それでおしまい!
OK私 は自分の問題のためにこの記事を使用しました。OKしかし、問題は、それが正常に機能していなかったことです。そこで、コードのロジックを変更します。そして、dbgridから選択した行をリストに保存することで実装します。