AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken dbCheckbox und dbGrid mit Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

dbCheckbox und dbGrid mit Abfrage

Ein Thema von blutigerAnfänger · begonnen am 2. Aug 2014 · letzter Beitrag vom 3. Okt 2014
Antwort Antwort
Seite 1 von 2  1 2      
blutigerAnfänger

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

dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 08: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.291 Beiträge
 
Delphi 12 Athens
 
#2

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 08:55
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 Query1.Active := True; oder einem Query1.Open; )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Aug 2014 um 08:59 Uhr)
  Mit Zitat antworten Zitat
blutigerAnfänger

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

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 09:40
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 Query1.Active := True; oder einem Query1.Open; )
Dbgriddrawcolumncell wurde selbstverständlich zgewiesen.

Die dbcheckbox liegt derzeit neben dem Grid. Werde ich gleich ändern.
Danke.
  Mit Zitat antworten Zitat
blutigerAnfänger

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

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 10:44
Die Checkbox liegt mittlerweile auf dem Dbgrid. Beim Click auf einen Datensatz wird die Checkbox, wie vorher, aktualisiert. Ansonsten keine Änderung.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 14:05
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.
Angehängte Grafiken
Dateityp: jpg TjvDBGridChecks.jpg (55,3 KB, 30x aufgerufen)
  Mit Zitat antworten Zitat
blutigerAnfänger

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

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 18:49
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?
  Mit Zitat antworten Zitat
blutigerAnfänger

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

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 30. Aug 2014, 16:59
Ich dachte ich hätte es geschafft.

Ziel ist es: 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.

Delphi-Quellcode:
procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin

DBGrid1.Columns[0].ReadOnly :=False;

  if DBCheckBox1.Checked = true then
    begin
     DBCheckBox1.Checked := False;
    end ;

{if DBCheckBox1.Checked = False then
    begin
    DBCheckBox1.Checked := True;
    end ;
}

end;
Die Veränderung von true auf false und false auf true funktioniert nicht. Ich kann zwar eine Checkbox mit Haken auf false setzen, aber die Änderung wird nicht übernommen. Das Löschen der geschweiften Klammern erzeugt auch noch einen Stack Überlauf.

Für die Übernahme der Änderung in die Datenbank habe ich folgenden Code:
Delphi-Quellcode:
procedure TForm1.inDBspeichernClick(Sender: TObject);
begin

  with Query1 do
  begin
    Active:=False;
    SQL.Clear;
    SQL.Add('Update Tabelle set FELD ');
    Active:=True;
  end;

end;
Auch da funktioniert was nicht, FELD wird gar nicht gefunden! ? Obwohl es in der AbfrageProzedur läuft.

Mittlerweile bin ich wieder auf Hilfe angewiesen. Danke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.291 Beiträge
 
Delphi 12 Athens
 
#8

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 30. Aug 2014, 17:12
Das Löschen der geschweiften Klammern erzeugt auch noch einen Stack Überlauf.
Rate mal, welches Ereignis ausgelöst wird, wenn sich der Wert einer CheckBox ändert? Egal ob durch den Benutzer oder vom Programm.
OnClick

Aber das hätte man durch Debuggen rausbekommen können (das Zuweisen DBCheckBox1.Checked := True; im Einzelschritt durchgehen),
bzw. durch einen Blick in den Stacktrace, nach der Exception. (wer, wo und warum die Funktionen aufrief)

Die CheckBox ändert selber ihren Status, wenn man sie anklickt, also du brauchst das Checked hier eigentlich nicht zu manipulieren.

Delphi-Quellcode:
if DBCheckBox1.Checked then // if DBCheckBox1.Checked = True then
  DBCheckBox1.Checked := False;
if not DBCheckBox1.Checked then // if DBCheckBox1.Checked = False then
  DBCheckBox1.Checked := True;
Sowas ist natürlich auch "sinnlos", denn nach dem ersten IF ist Checked immer False (entweder es war schon False und blieb unverändert, oder es wurde auf False geändert)
und beim zweiten IF wird es dadurch natürlich gleich wieder auf True gesetzt, womit es am Ende immer True wäre.
Delphi-Quellcode:
if DBCheckBox1.Checked then
  DBCheckBox1.Checked := False
else
  DBCheckBox1.Checked := True;
Aber, wie gesagt, brauchst du an dem Checked, in der OnChangeOnClick-Methode, eigentlich garnicht dran rumspielen, da es bereits von der VCL umgeschaltet wird.



Zitat:
Update Tabelle set FELD
"FELD" ist ein Feld in der Tabelle "Tabelle"?

Auf was soll FELD eigentlich gesetzt werden?

Und welcher Datensatz soll eigentlich geändert werden? (bei dir alle Datensätze der Tabelle)

Beispiel: UPDATE tabelle SET feld = neuerWert WHERE bedingung




Tipp: Besser nicht mit False und vorallem nicht mit True vergleichen.
Außerdem ist das nicht nötig, da der Boolean für's IF eh schon vorhanden ist.
Delphi-Quellcode:
if DBCheckBox1.Checked = True then
if DBCheckBox1.Checked = False then

if DBCheckBox1.Checked then
if not DBCheckBox1.Checked then
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Aug 2014 um 17:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.549 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 30. Aug 2014, 17:38
Abgesehen von der Sinnlosigkeit hätte in diesem Fall auch ein einfaches Negieren genügt:
DBCheckBox1.Checked := not DBCheckBox1.Checked; ,was in der Langform nicht anderes heißt als
Delphi-Quellcode:
if DBCheckBox1.Checked then
  DBCheckBox1.Checked := false
else
  DBCheckBox1.Checked := true;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
blutigerAnfänger

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

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 30. Aug 2014, 17:59
@ himitsu
Den Inhalt der geschweiften Klammer hab ich gelöscht, soweit verstehe ich das auch. Dennoch bleibt die Veränderung des Datensatzes (also das Abklicken eines Häkchens) nicht erhalten. Das Anklicken einer Checkbox geht auch nicht (weil ja nicht programmiert?).



"FELD" ist ein Feld in der Tabelle "Tabelle"?

Auf was soll FELD eigentlich gesetzt werden?

Und welcher Datensatz soll eigentlich geändert werden? (bei dir alle Datensätze der Tabelle)

Beispiel: UPDATE tabelle SET feld = neuerWert WHERE bedingung
FELD ist das allererste Feld in der Tabelle "Tabelle".
Geändert werden soll nur der An- oder Abgeklickte Datensatz, welcher mit Select... ermittelt wird.
Zur Vereinfachung wird hier die komplette Tabelle angezeigt, da im Anwendungsfall es auch mehrere Antwortdatensätze geben wird. Wie ich nun die Bedingung definieren soll, damit nur der An-oder Abgeklickte Datensatz gespeichert wird ist mir im Moment noch unklar.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
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