Einzelnen Beitrag anzeigen

blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#1

dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 09:37
Datenbank: Firebird • Version: 2.1 • Zugriff über: interbase
Hallo

Über Checkboxen in DbGrids wurde schon viel geschrieben. Mein Quelltext bezieht sich auf den Tip bei about.com.
Nur meine Umsetzung funktioniert nicht.
Delphi-Quellcode:
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    Active:=False;
    SQL.Clear;
    SQL.Add('Select * from Tabelle ');
    Active:=True;
  end;
end;

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

 //explained later in the article
 DBCheckBox1.ValueChecked := 'true';
 DBCheckBox1.ValueUnChecked := 'false';
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.
Es handelt sich um eine dreifeldrige Datentabelle, in welcher das erste Feld (Feld, siehe Quelltext) aus true und false besteht.

Ziel ist es: für jeden Datensatz eine editierbare vorbelegte Checkbox in dieses 'Feld' zu zeichnen.
Die zu editierenden Datensätze sollen aus Abfragen der Datentabelle erzeugt werden und bei veränderung von true oder false über UPDATE zurückgeschrieben werden.

Die DBCheckbox ist grau, zeigt aber den Zustand jeder Datenzeile (true mit Haken, false ohne Haken) an.

Woran liegt es, daß keine Checkboxen in dem DBGrid gezeichnet werden?

Danke.
  Mit Zitat antworten Zitat