Delphi-PRAXiS
Seite 1 von 11  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   dbCheckbox und dbGrid mit Abfrage (https://www.delphipraxis.net/181286-dbcheckbox-und-dbgrid-mit-abfrage.html)

blutigerAnfänger 2. Aug 2014 08:37

Datenbank: Firebird • Version: 2.1 • Zugriff über: interbase

dbCheckbox und dbGrid mit Abfrage
 
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.

himitsu 2. Aug 2014 08:55

AW: dbCheckbox und dbGrid mit Abfrage
 
Zitat:

Zitat von blutigerAnfänger (Beitrag 1267332)
Woran liegt es, daß keine Checkboxen in dem DBGrid gezeichnet werden?

Wurde dem OnDrawColumnCell des DBGrid1 auch das DBGrid1DrawColumnCell event zugewiesen?
Oder anders gefragt: Wird deine DBGrid1DrawColumnCell-Methode eüberhaupt aufgerufen?

Ach ja, die DBCheckBox1 muß natürlich vor/über dem DB-Grid liegen (am Einfachsten danach erstellt, bzw. in die Form eingefügt), damit es sich nicht hinter dem Grid versteckt.


PS: Alles aus FormCreate kann auch direkt im OI zugewiesen werden, genauso wie das Meiste aus Button1Click. (abgesehn von dem
Delphi-Quellcode:
Query1.Active := True;
oder einem
Delphi-Quellcode:
Query1.Open;
)

blutigerAnfänger 2. Aug 2014 09:40

AW: dbCheckbox und dbGrid mit Abfrage
 
Zitat:

Zitat von himitsu (Beitrag 1267337)
Wurde dem OnDrawColumnCell des DBGrid1 auch das DBGrid1DrawColumnCell event zugewiesen?
Oder anders gefragt: Wird deine DBGrid1DrawColumnCell-Methode eüberhaupt aufgerufen?

Ach ja, die DBCheckBox1 muß natürlich vor/über dem DB-Grid liegen (am Einfachsten danach erstellt, bzw. in die Form eingefügt), damit es sich nicht hinter dem Grid versteckt.


PS: Alles aus FormCreate kann auch direkt im OI zugewiesen werden, genauso wie das Meiste aus Button1Click. (abgesehn von dem
Delphi-Quellcode:
Query1.Active := True;
oder einem
Delphi-Quellcode:
Query1.Open;
)

Dbgriddrawcolumncell wurde selbstverständlich zgewiesen.

Die dbcheckbox liegt derzeit neben dem Grid. Werde ich gleich ändern.
Danke.

blutigerAnfänger 2. Aug 2014 10:44

AW: dbCheckbox und dbGrid mit Abfrage
 
Die Checkbox liegt mittlerweile auf dem Dbgrid. Beim Click auf einen Datensatz wird die Checkbox, wie vorher, aktualisiert. Ansonsten keine Änderung.

Perlsau 2. Aug 2014 14:05

AW: dbCheckbox und dbGrid mit Abfrage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verwende für Datenbank-Anwendungen das TjvDBGrid aus den Jedi-Komponenten (Jvcl 3.48). Wenn dein zugrundeliegendes Dataset Boolean-Werte zuläßt, werden Boolean-Felder im TjvDBGrid stets wie gewünscht dargestellt: Als kleine Quadrate jeweils mit oder ohne Haken.

blutigerAnfänger 2. Aug 2014 18:49

AW: dbCheckbox und dbGrid mit Abfrage
 
Zitat:

Zitat von Perlsau (Beitrag 1267364)
Ich verwende für Datenbank-Anwendungen das TjvDBGrid aus den Jedi-Komponenten (Jvcl 3.48). Wenn dein zugrundeliegendes Dataset Boolean-Werte zuläßt, werden Boolean-Felder im TjvDBGrid stets wie gewünscht dargestellt: Als kleine Quadrate jeweils mit oder ohne Haken.

Ich muß das Feld in den EditControls einbinden. Leider sind diese grau (inaktiv) obwohl die Option AlwaysShowEditor false ist.
Kannst du mir weiterhelfen?

Perlsau 2. Aug 2014 22:27

AW: dbCheckbox und dbGrid mit Abfrage
 
Vermutlich wird der Boolean-Typ, den du (falls du einen) deklariert hast, nicht als solcher (an-)erkannt. Dazu müßte ich mehr über deine DB und dein Projekt wissen:
  1. Mit welcher Delphi-IDE arbeitest du?
  2. Was bedeutet "Zugriff über Interbase" auf eine Firebird-DB?
  3. Welche DB-Komponenten setzt du ein?
  4. Verschiedene DB-Komponenten erwarten verschiedene Typen bei der Deklaration eines Firebird-"Booleans", den Firebird ja von Haus aus nicht mitbringt. Bei FibPlus genügte ein SmallInt, IbDac von Devart erwartet einen Integer, in dessen Typenbezeichnung das Wort "Boolean" vorkommt.

blutigerAnfänger 3. Aug 2014 07:27

AW: dbCheckbox und dbGrid mit Abfrage
 
boolean Typ? Gibt es da mehrere Typen? Das ist doch nur wahr und falsch, 1 und 0 also etwas völlig gegensätzliches.

zu 1. Delphi 6 pro
zu 2. Interbase Komponenten
zu 3. Interbase Komponenten
zu 4. varChar

Perlsau 3. Aug 2014 11:44

AW: dbCheckbox und dbGrid mit Abfrage
 
Leider kann ich dir hier nicht weiterhelfen, da mir weder Delphi 6 pro noch die Interbase-Komponenten in der damaligen Ausführung geläufig sind. Um zu testen, ob deine Firebird-Boolean-Deklaration funktioniert, kannst du einfach folgendes probieren:
Delphi-Quellcode:
Function FirebirdBooleanTest(Const BooleanField : TField) : Boolean;
Begin
  Result := BooleanField.AsBoolean;
End;
Um in Zukunft zu vermeiden, daß dir Forenuser zu Hilfe eilen, die deine Delphi-Version nicht kennen, wäre es angebracht, in deinem Profil deine Delphi-Version einzutragen.

Aviator 4. Aug 2014 10:10

AW: dbCheckbox und dbGrid mit Abfrage
 
Früher hatte ich ein DB-Grid von Scalabium benutzt. Das SmDbGrid. Super einfach aufgebaut, hat auch BooleanAsCheckBox Unterstützung und noch einige andere Dinge wie AutoColumnResize usw. Mittlerweile benutze ich das Ding allerdings fast gar nicht mehr sondern baue fast alles mit dem VirtualTreeView auf. Damit hast du fast nur Vorteile. Klar das Ding brauch einiges an Eingewöhnungszeit und es dauert etwas länger bis man so ein "Grid" aufgebaut hat, aber du kannst den kompletten TreeView nach deinen Wünschen gestalten. Und der Vorteil ist, es ruckelt nix, es wird alles perfekt neu gezeichnet usw. Probiers einfach mal aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Seite 1 von 11  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz