Wybieranie/zaznaczanie kilku rekordów w DBGrid

0

Witam.

Chciałem zapytać jak dodać do DBGrida możliwość zaznaczania kilku rekordów, dokładniej chodzi mi np. o wyświetlenie w dodatkowej kolumnie np. tzw. "ptaszka" , krzyżyka który będzie można zaznaczać i odznaczać. I jak odwołać się do tych rekordów zaznaczonych aby zapisać je do innej tabeli.

Do wyświetlenia danych na DBGridzie używam komponentu IBQuery w którym wpisane jest odpowiednie zapytanie Select wyświetlające dane z tabeli. W DBGrid udało mi się dodać nową kolumnę (Udzial) w której chce mieć właśnie ten komponent umożliwiający zaznaczanie.

Poniżej zamieszczam obrazek przedstawiający to jak bym chciał, aby wyglądał ten mój DBGrid:

przyklad.png

0

użyj SMDBGrid - on ma coś takiego w pakiecie i jest free

0
woolfik napisał(a):

http://delphi.about.com/od/usedbvcl/l/aa082003a.htm

Zastosowałem to rozwiązanie które podesłałeś mi w linku, z tego co chyba się dobrze domyśliłem to do swojej tabeli w bazie musiałem dodać kolumnę typu Boolean, ja dodałem kolumnę o nazwie TEST. Po kompilacji ładnie już to wyświetla, ale jak chcę kliknąć na pole do zaznaczenia, zostaje one przykryte jakby komórką DBGrida (rysunek poniżej).

przyklad2.png

Wrzucam też kod tego programu:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IBX.IBDatabase, Data.DB,
  IBX.IBCustomDataSet, IBX.IBQuery, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls, IBX.IBTable;

type
  TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBQuery1: TIBQuery;
    DataSource1: TDataSource;
    DBCheckBox1: TDBCheckBox;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid1ColExit(Sender: TObject);
    procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure DBCheckBox1Click(Sender: TObject);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
 DBCheckBox1.DataSource := DataSource1;
 DBCheckBox1.DataField  := 'TEST';
 DBCheckBox1.Visible    := False;
 DBCheckBox1.Color      := DBGrid1.Color;
 DBCheckBox1.Caption    := '';

 //explained later in the article
 DBCheckBox1.ValueChecked := 'Yes ';
 DBCheckBox1.ValueUnChecked := 'No ';
end;



procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const IsChecked : array[Boolean] of Integer =
      (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = DBCheckBox1.DataField) then
    begin
     DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 2;
     DBCheckBox1.Top := Rect.Top + DBGrid1.top + 2;
     DBCheckBox1.Width := Rect.Right - Rect.Left;
     DBCheckBox1.Height := Rect.Bottom - Rect.Top;

     DBCheckBox1.Visible := True;
    end
  end
  else
  begin
    if (Column.Field.FieldName = DBCheckBox1.DataField) then
    begin
      DrawRect:=Rect;
      InflateRect(DrawRect,-1,-1);

      DrawState := ISChecked[Column.Field.AsBoolean];

      DBGrid1.Canvas.FillRect(Rect);
      DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect,DFC_BUTTON, DrawState);
    end;
  end;
end;



procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
 if DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then
    DBCheckBox1.Visible := False
end;



procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if (key = Chr(9)) then Exit;

  if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) then
  begin
    DBCheckBox1.SetFocus;
    SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);
  end;
end;

procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin
  if DBCheckBox1.Checked then
     DBCheckBox1.Caption :=DBCheckBox1.ValueChecked
  else
     DBCheckBox1.Caption := DBCheckBox1.ValueUnChecked;
end;
end.
0

Bo moim zdaniem nie potrzebnie rysujesz tego checkboxa w warunku. Ja rysuję checkboxa bez szczególnych warunków (sprawdzam tylko czy wartość pola to 1 czy 0 i rysuję zaznaczony bądź nie) i wszystko jest ok. Ale ja z kolei nie edytuję danych bezpośrednio z grida. Bo uważam to za zło wcielone. Zaznaczanie/odznaczanie rekordów robię przez popup menu albo spację, czy nawet F2.

0

Ok, dzięki , sprawdziłem to rozwiązanie ale też to drugie z komponentem SMDBGrid który polecił mi użytkownik wyżej. I powiem, że używanie tego komponentu SMDBGrid jest bardzo wygodne i więcej możliwości domyślnie oferuje ten komponent

1 użytkowników online, w tym zalogowanych: 0, gości: 1