![]() |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Also ich hab jetzt die Datenbank erneuert, die Domain nach Vorschrift von Perlsau #16 mit IBExpert angelegt. Der Quelltext wurde rechtschreibmäßig (DBCheckbox.dataField := 'Feld' nach 'FELD') abgeändert. Und jetzt läuft gar nichts mehr. Fehlermeldung (ins Deutsche übersetzt): 'FELD' ist kein boolean Format.
Was jetzt? Muß die Domain aktiert werden? oder Wie bekomme ich nun ein boolean Feld, da Firebird keines mitliefert. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Wie heißen deine drei Felder/Spaltennamen? |
AW: dbCheckbox und dbGrid mit Abfrage
1.Feld FELD Typ Integer
2.Feld NAME Typ varchar(50) 3.Feld BEZEICHNUNG Typ varchar(250) |
AW: dbCheckbox und dbGrid mit Abfrage
Ok. Du musst lernen, Programme zu debuggen, also Breakpoints setzen, schrittweise durchlaufen etc. Dann wäre der Fehler sofort aufgefallen. Auch ist es wichtig, der IDE zu sagen, den integrierten Debugger zu verwenden und bei Exceptions anzuhalten (alles in den Debug-Optionen).
Also 1. 'FELD' statt 'Feld' (hast Du schon beobachtet) 2. Auf das Feld kann nicht per 'AsBoolean' zugegriffen werden, denn es ist ja kein Boolean-Feld. Ersetze also die eine Zeile, füge noch die fehlenden Events hinzu (dient dem Editieren) und dann sollte das Problem gelöst sein.
Delphi-Quellcode:
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.AsInteger = 1]; // <---- DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect, DFC_BUTTON, DrawState); end; end; end; |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Gut. Ich auch. Streiten/nicht einer Meinung sein ist eine Sache, aber das geht zu weit.
|
AW: dbCheckbox und dbGrid mit Abfrage
Es funktioniert !!:-D
Danke an alle. Zitat:
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Das war nur irgendein Vollpfosten, der hier rumgepöbelt hat. Seine Beiträge wurden dann entfernt.
|
AW: dbCheckbox und dbGrid mit Abfrage
Ich dachte ich hätte es geschafft.
Zitat:
Delphi-Quellcode:
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.
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; Für die Übernahme der Änderung in die Datenbank habe ich folgenden Code:
Delphi-Quellcode:
Auch da funktioniert was nicht, FELD wird gar nicht gefunden! ? Obwohl es in der AbfrageProzedur läuft.
procedure TForm1.inDBspeichernClick(Sender: TObject);
begin with Query1 do begin Active:=False; SQL.Clear; SQL.Add('Update Tabelle set FELD '); Active:=True; end; end; Mittlerweile bin ich wieder auf Hilfe angewiesen. Danke. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
OnClick :stupid: Aber das hätte man durch Debuggen rausbekommen können (das Zuweisen
Delphi-Quellcode:
im Einzelschritt durchgehen),
DBCheckBox1.Checked := True;
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:
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)
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; und beim zweiten IF wird es dadurch natürlich gleich wieder auf True gesetzt, womit es am Ende immer True wäre.
Delphi-Quellcode:
Aber, wie gesagt, brauchst du an dem Checked, in der OnChangeOnClick-Methode, eigentlich garnicht dran rumspielen, da es bereits von der VCL umgeschaltet wird.
if DBCheckBox1.Checked then
DBCheckBox1.Checked := False else DBCheckBox1.Checked := True; Zitat:
Auf was soll FELD eigentlich gesetzt werden? Und welcher Datensatz soll eigentlich geändert werden? (bei dir alle Datensätze der Tabelle) Beispiel:
SQL-Code:
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 |
AW: dbCheckbox und dbGrid mit Abfrage
Abgesehen von der Sinnlosigkeit hätte in diesem Fall auch ein einfaches Negieren genügt:
Delphi-Quellcode:
,was in der Langform nicht anderes heißt als
DBCheckBox1.Checked := not DBCheckBox1.Checked;
Delphi-Quellcode:
if DBCheckBox1.Checked then
DBCheckBox1.Checked := false else DBCheckBox1.Checked := true; |
AW: dbCheckbox und dbGrid mit Abfrage
@ 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?). Zitat:
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. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Gruß K-H |
AW: dbCheckbox und dbGrid mit Abfrage
Wobei eine DBCheckBox den Wert eigentlich selber ändern sollte, im verbundenen Feld des aktuellen Records der Query-Komponente (DataSet).
Und beim nächsten Post würden dann die Änderungen automatisch in die DB zurückgeschrieben. :stupid: :gruebel: Das ist ja grade ein Grund für die Existenz der DB-Komponenten (TDBCheckbox), also daß sie die Daten selber aus dem DataSet holen und auch Änderungen zurückscheiben. Wohingegen man das bei den nicht-datensensitiven Komponenten (TCheckBox) alles selber machen müsste. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Es bleibt immer noch die Nichtübernahme des "Häkchens" beim DBGrid zu lösen. Noch mal zur Verdeutlichung des Sinns dieser Sache: Der Anwender selektiert aus mehreren tausend Datensätzen einige wenige heraus. Der Datensatz welcher ihm letzlich zusagt soll (soweit nicht vorhanden) mit Häckchen markiert werden. Weiter nichts. Die Markierung (Häkchen) soll keine Aktion oder Ähnliches auslösen. |
AW: dbCheckbox und dbGrid mit Abfrage
'ner datenunabhängige ID ist oftmal von Vorteil.
Aber im Grunde kann man auch einen anderen "eingeutigen" Indikator verwenden. (ein oder mehrere Unique-Felder) |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
![]() Du könntest z.B. mal einen ScreenShot des Objektinspektors hochladen, der die Optionen deines Datasets zeigt ... Es gibt auch noch die Möglichkeit, ein berechnetes Feld in deiner Query-Komponente zu erstellen und in GetText je nach Feldinhalt den Wert True oder False zuzuweisen ... |
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 5)
Anbei die Screenshots der meisten Elemente: Ich hoffe sie sind aussagekräftig genug.
|
AW: dbCheckbox und dbGrid mit Abfrage
@Perlsau: Ich glaube, das ist gelöst. Die Datenbank liefert 0/1, aber das TDBCheckBox-Teil muss ja wissen, was 'True' und was 'False' ist. Das macht er, indem die Eigenschaften 'ValueChecked' und 'ValueUnchecked' zugewiesen werden, allerdings im Code. Lass dich also nicht von den Eigenschaften im OI verwirren, die TE hier gepostet hat.
Ich glaube, der Code im OnClick der TDBCheckbox-komponente ist überflüssig und falsch, denn er macht genau das wieder rückgängig, was die Komponente eh gemacht hätte. Also: Weg damit. Bei mir funktioniert es nämlich. Und ich habe FB extra installiert, um mir ganz sicher zu sein. Also: Das TDBCheckBox brauch kein OnClick-Event. Es benötigt gar nichts, nur die richtigen Eigenschaften. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
keine Änderung alles wie vorher:(:( |
AW: dbCheckbox und dbGrid mit Abfrage
Es funktioniert bei mir aber. Dein hier eingestelltes Projekt mit den angepassten 'ValueChecked' und 'ValueUnchecked' funktioniert, sofern der Feldname korrekt ist. 100% getestet, verifiziert.
|
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei mein komplettes fehlerhaftes Projekt mit Datenbank und .exe. Ich habe den Speicherteil entfernt. Ich werde das ganze Projekt noch einmal mit IB und einmal mit Jedi neu zusammenschreiben und mich dann wieder melden. Danke für eure bisherigen Bemühungen.
|
AW: dbCheckbox und dbGrid mit Abfrage
Was geht den dort genau nicht? Auf den ersten Blick scheint es ja zu funktionieren.
Wenn man diverse Unschönheiten übersieht: -Fester Pfad auf Datenbank -Datenbankverbindung zur Designtime aktiv! -Verwendung von with + überflüssigen Code
Delphi-Quellcode:
ist kürzer und ohne with;
procedure TForm1.AbfrageClick(Sender: TObject);
begin Query1.SQL.Text := 'Select * from Tabelle;'; Query1.Open; end; |
AW: dbCheckbox und dbGrid mit Abfrage
Delphi-Quellcode:
Es wurde schon ausführlich erklärt, dass die DBCheckBox in dieser Methode nicht gesetzt werden darf.
procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin { if DBCheckBox1.Checked then DBCheckBox1.Caption := DBCheckBox1.ValueChecked else DBCheckBox1.Caption := DBCheckBox1.ValueUnChecked; } DBGrid1.Columns[0].ReadOnly := False; if DBCheckBox1.Checked then begin DBCheckBox1.Checked := False; end ; end; So, wie der Source jetzt ist, wird die DBCheckBox immer False sein. Nochmal: Wenn DBCheckBox.Checked in dieser Methode gesetzt wird, wird die Methode automatisch wieder auf gerufen. Ergebnis-Prüfung: Fall 1: Die Box ist nicht gechecked. - Anwender setzt die Box auf Checked. - Die Methode wird dadurch aufgerufen. - Methode setzt die Box auf nicht gechecked und ruft sie ohne Auswirkung nochmal auf. Ergebnis: Die Box ist nicht gechecked. Fall 2: Die Box ist gechecked. - Anwender setzt die Box auf nicht Checked. - Die Methode wird dadurch aufgerufen. - Es passiert aber nichts weiter (außer ReadOnly-Einstellung). Ergebnis: Die Box ist nicht gechecked. Beide Fälle führen also dazu, dass DBCheckBox.Checked immer False sein wird, sobald der Anwender diese anklickt. Du kannst die Methode komplett entfernen. Ich sehe auch für das
Delphi-Quellcode:
keine Notwendigkeit.
ReadOnly := false
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
dann kann es doch im Quelltext stehen bleiben, oder nicht!?:? |
AW: dbCheckbox und dbGrid mit Abfrage
Wozu?
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Leider habe ich hier kein FB/IB zur Verfügung und kann deswegen nicht weiter testen. |
AW: dbCheckbox und dbGrid mit Abfrage
|
AW: dbCheckbox und dbGrid mit Abfrage
Ich habe das jetzt mal auf eine andere Datenbank umgesetzt.
Es funktioniert bei mir einwandfrei! Allerdings habe ich zur Sicherheit auch die Vergleiche der Feldnamen angepasst:
Delphi-Quellcode:
Einfach um sicher zu sein, dass nicht doch noch ein Buchstabe klein geschrieben ist. Natürlich muss die Änderung an allen relevanten Stellen durchgeführt werden.
if AnsiUpperCase(Column.Field.FieldName) = AnsiUpperCase(DBCheckBox1.DataField) then
Ich vermute aber, dass der Fehler an der falschen Stelle gesucht wird. Wie sieht es denn mit der IBTransaction aus? Wenn die nicht gebraucht wird, einfach mal rausschmeißen. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Mittlerweile habe ich Delphi neu installiert. Das Projekt neu programmiert, ohne OnClick Event. Dennoch bleibt alles beim Alten. Es funktioniert nicht.:( |
AW: dbCheckbox und dbGrid mit Abfrage
Nachdem wir uns hier die ganze Zeit mit der Darstellung beschäftigt hatten und das ja wohl fast perfekt funktioniert, sollte man sich nun darauf fokussieren, das die ganze Query nicht änderbar ist. Du kannst ja im Grid noch nicht einmal irgend einen Wert ändern, geschweige denn die Checkbox.
Wenn Du die TIBQuery durch ein TIBTable ersetzt, geht es nämlich. |
AW: dbCheckbox und dbGrid mit Abfrage
Oder ein Update-Skript im Updateobjekt hinterlegen
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Lege eine TIBUpdateSQL Komponente auf die Form/Datamodul. Hinterlege das Statement ( in diesem Fall .ModifySQL) und verbinde es mit der Eigenschaft .UpdateObject der Query-Komponente)
Oder man nimmt gleich ein TIBDataSet |
AW: dbCheckbox und dbGrid mit Abfrage
Ah.. Markus bringt Licht ins Dunkel. So geht das.
Zitat:
Aber in Anbetracht deiner nicht sonderlich komplexen Tabelle dachte ich mir, es ginge hier eh um einen proof-of-concept und da nun die Sichtbarkeit und sogar das Editieren prinzipiell funktioniert, sollte das doch schon reichen. Bitteschön übrigens für das Ausprobieren und Auflösen der Probleme. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Delphi-Quellcode:
Und nun ratet mal was beim Click auf die DBCheckbox passiert?
procedure TForm1.AbfrageClick(Sender: TObject);
begin { with Query1 do begin Active:=False; SQL.Clear; SQL.Add('Select * from Tabelle '); Active:=True; end;} with IBDataSet1 do begin Close; SelectSQL.Clear; SelectSQL.Text :=('Select * from Tabelle '); Open; end; end; Richtig geraten: nichts, keine Änderung, kein Abklicken oder Anklicken eines Datensatzes. Also alles beim Alten. Mein "fehlerhaftes Projekt" wurde 4x heruntergeladen. Ich möchte gerne wissen, ob der Fehler bei Anderen ebenfalls auftritt, oder nicht. Nach einer DelphiNeuinstallation habe ich immer noch diesen Fehler. Woran kann es dann noch liegen, daß die Checkbox nicht reagiert. |
AW: dbCheckbox und dbGrid mit Abfrage
Wie sieht dein ModifySQL-Statement aus?
|
AW: dbCheckbox und dbGrid mit Abfrage
Modify Statement ist leer. Kann eine SQL Anweisung dieses Problem lösen? Ich glaube nicht. Offenbar verstehe ich deinen Gedankengang nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz