6

私の質問は、チェックボックス項目を含むDelphi7のdbgridに列を設定する方法です。

前もって感謝します。

4

4 に答える 4

14

私がテストした最も簡単で完全な方法は次のとおりです。

ユニットのプライベートセクションで、グリッドオプションを保持するためのグローバルを宣言します。これは、チェックボックス列に入力しているときにテキスト編集を一時的に無効にした後の復元に使用されます。これは、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;

それでおしまい!

于 2013-09-22T11:36:56.223 に答える
1

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

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

于 2012-01-27T18:48:19.823 に答える
1

これを回答として投稿してすみません。コメントを追加するという評判はまだ50ありません。

Mihai MATEIの答えは、バグがあるユースケースを除いて、(実際に機能しているように)まれなソリューションに非常に近いものです。

グリッドでのユーザーの最初のアクションがチェックボックスをクリックすることである場合は常に、最初のクリックは機能しますが、2番目のクリックは基礎となるDBGridエディターを表示します。

これは、「GridOriginalOptionsmechan」メカニズムを初期化する必要があるために発生します。これを行うには、グリッドのOnEnterイベントに次のコードを追加するだけです。

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

それでおしまい!

于 2014-01-03T11:01:29.663 に答える
-3

OK私 は自分の問題のためにこの記事を使用しました。OKしかし、問題は、それが正常に機能していなかったことです。そこで、コードのロジックを変更します。そして、dbgridから選択した行をリストに保存することで実装します。

于 2012-01-27T18:06:02.960 に答える