![]() |
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:
Es handelt sich um eine dreifeldrige Datentabelle, in welcher das erste Feld (Feld, siehe Quelltext) aus true und false besteht.
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. 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. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
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:
oder einem
Query1.Active := True;
Delphi-Quellcode:
)
Query1.Open;
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Die dbcheckbox liegt derzeit neben dem Grid. Werde ich gleich ändern. Danke. |
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.
|
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.
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Kannst du mir weiterhelfen? |
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:
|
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 |
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:
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.
Function FirebirdBooleanTest(Const BooleanField : TField) : Boolean;
Begin Result := BooleanField.AsBoolean; End; |
AW: dbCheckbox und dbGrid mit Abfrage
Früher hatte ich ein DB-Grid von Scalabium benutzt. Das
![]() ![]() |
AW: dbCheckbox und dbGrid mit Abfrage
Ich würde vorschlagen, den gewünschten Lösungsansatz zu verfolgen. Perlsau ist schon auf dem richtigen Weg, der vom TE gepostete Code funktioniert (bei einem TdxMemdata Dataset), ergo würde ich mal annehmen, es liegt an der Tatsache, dass das FB/Interbase kein Boolean kennt, und man sich irgendwie behelfen muss.
Ich kann ja mal später das Problem reproduzieren, indem ich in meinem memdata aus dem boolean ein varchar feld mache. Vermutlich steht in der tabelle 0/1, aber das DBCheckBox-Feld versteht nur Bahnhof, da es 'True'/'False' erwartet. Irgendwie so jedenfalls. |
AW: dbCheckbox und dbGrid mit Abfrage
TDBCheckBox besitzt die Eigenschaften ValueChecked bzw. ValueUnchecked, in denen man die entsprechenden Werte in der Datenbanktabelle festrlegen kann.
|
AW: dbCheckbox und dbGrid mit Abfrage
Siehe Quellcode im Eingangspost. Alles da, nur muss er das noch richtig angeben.
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Leider ist das Projekt auf einem anderen Rechner. Ich stelle es heite noch in den Thread. |
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist das komplette Projekt. Die Datenbank (dreifeld.fdb) muß nach c:\DB. Das große DBGrid ist Standard. Das kleine Grid ist Jedi.
Edit. Das Tabellenfeld 'Feld' ist mittlerweile smallint statt wie früher varchar. Sein Inhalt von true/false auf 0/1 umgestellt. |
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Code:
Diesem Boolean-Typ liegt ein Integer zugrunde. Du stellst, wenn du bei der Tabellendefinition einen Boolean benötigst, den Typ auf Integer und wählst als Domäne deinen selbsterstellten Boolean aus. Manche (ältere) DB-Komponenten begnügen sich auch mit einem SmallInt, ich würde aber bei Integer bleiben. Natürlich könntest du als Values auch "Wahr" und "Falsch" bzw. "True" und "False" verwenden, wärst dann aber nicht mehr kompatibel zu deinen DB-Komponenten. Lies vor allem mal in der Doku zu deinen DB-Komponenten nach, was dort als Voraussetzung für die Verarbeitung von Boolean-Variablen geschrieben steht.
CREATE DOMAIN INTBOOLEAN AS
INTEGER NOT NULL CHECK (VALUE IN (0,1)); COMMENT ON DOMAIN INTBOOLEAN IS 'Boolean False oder True'; |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Delphi-Quellcode:
Oder ist das Quatsch? Denn ein 'richtiger' Boolean wird das doch auch nicht, sondern nur ein INTEGER-Feld mit CHECK-Constraint, oder?
// Vorher 'true' / 'false'
// DBCheckBox1.ValueChecked := 'true'; // DBCheckBox1.ValueUnChecked := 'false'; // Jetzt 0/1 DBCheckBox1.ValueChecked := 0; // oder mit Gänsefüßen, weiss ich jetzt nicht DBCheckBox1.ValueUnChecked := 1; |
AW: dbCheckbox und dbGrid mit Abfrage
@Perlsau
Die Domain habe ich mit IbExpert Personal erzeugt, aber keine Veränderung in der Anzeige. |
AW: dbCheckbox und dbGrid mit Abfrage
Hast Du den Quelltext angepasst?
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
@Perlsau
Alles überprüft, keine Änderung. |
AW: dbCheckbox und dbGrid mit Abfrage
Hast Du den Code angepasst?
|
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Er zeichnet nur keine checkboxen in die Spalte. Der Code von about.com funktioniert doch bei anderen, warum bei mir nicht? |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Woher soll denn die Checkbox wissen, das eine bei einer Eins das Häkchen gesetzt werden soll und bei einer Null nicht? Um die Frage zu beantworten, warum das bei Dir nicht funktioniert: Ich habe das getestet, aber mit einem 'boolean' Feld, d.h. ich kann in meiner Datenbank ein Feld als 'Boolean' (bzw. 'Bit') deklarieren, das kommt dann als True/False im Programm auch an und die Checkbox versteht das. Lies dir einfach auch den Teil durch, den die Perlsau als Quatsch abgetan hat. Vielleicht ist es ja keiner. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Bei der Veränderung des Datensatzes zeigt die Checkbox ja auch ein Häkchen bzw. kein Häkchen. Das Problem ist nach wie vor : In der Spalte 'Feld' stehen Nullen und Einsen, nur KEINE Checkboxen (beachte Mehrzahl) mit oder ohne Häkchen. |
AW: dbCheckbox und dbGrid mit Abfrage
Das hört sich nach 'kurz vor dem Ziel' an. Hast Du die entsprechenden Events zugewiesen?
Den Events OnDrawColumnCell, OnKeyPress, OnColExit des DBGrid müssen die Methoden DBGrid1DrawColumnCell, DBGrid1KeyPress und DBGrid1ColExit zugewiesenw werden. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Um die Checkbox der fokussierten Zeile anzuzeigen (und zu editieren),wird die TDBCheckBox einfach dorthin 'verpflanzt'. Wenn man dort nichts sieht (nur in der fokussierten Zeile), dann liegt die Checkbox 'hinter' der DBGrid.
Alle anderen Zeilen werden direkt auf den Canvas des TDBGrid gezeichnet. Mach mal einen Screenshot deines Problems und pack den Code hier rein. Das muss gehen, ich habs neulich doch erst probiert. |
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei der gewünschte (hoffentlich aussagekräftige) Screenshot.
|
AW: dbCheckbox und dbGrid mit Abfrage
Entweder:
Das OnDrawColumnCell-Event ist nicht gesetzt. Da wird nix gezeichnet. Oder Der Feldname der TDBCheckbox ist ungleich dem Feldnamen der 1.Spalte. Wo bleibt der Quelltext? Am besten das Projekt als ZIP-Datei mit Dpr, pas und dfm einstellen. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Preisfrage: Woher soll das Grid wissen, welches Feld durch eine Checkbox dargestellt werden soll? ;-)
|
AW: dbCheckbox und dbGrid mit Abfrage
Na im DrawColumnCell!!
Ich steh auf dem Schlauch?! |
AW: dbCheckbox und dbGrid mit Abfrage
Wie geil ist das denn, da schreibt hier jemand... mit einem 'SMDB-Grid' wird alles schön, und Du packst das einfach in die Uses?
Außerdem, wenn man testen soll, wäre es gut, wenn man testen könnte. Ich kann das nicht. |
AW: dbCheckbox und dbGrid mit Abfrage
versteh das ganze im moment nicht so... Du packst da auf die Grids im 'normalen' Grid eine DBCheckbox und aufs Jedi Grid eine JvDBCheckBox.. diese versuchst du zusätzlich zum Grid mit Daten zu füllen, aller
Delphi-Quellcode:
Schön finde ich auch das Array of Boolean Gedöns.
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 := '1'; DBCheckBox1.ValueUnChecked := '0'; end; Warum bindest Du nicht einfach das Grid an Deine ver*****ene Firebird Tabelle. Verstehe hier nur noch Bahnhof. Gruß A.C. |
AW: dbCheckbox und dbGrid mit Abfrage
Zitat:
Zitat:
Zitat:
Und was du mit Zitat:
|
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Mit dem Testen meine ich folgendes:
Weder die von Dir kompilierte Exe noch mit dem Quelltext oder mit IBExpert komme ich auf die Datenbank: |
AW: dbCheckbox und dbGrid mit Abfrage
Na Firebird mußt du schon installiert haben.
Die Kennwörter sysdba und masterkey werden dir wohl auch bekannt sein. |
AW: dbCheckbox und dbGrid mit Abfrage
Ich habe Firebird am Laufen. Und bei mir werden Booleans auch als solche angezeigt, wenn ich möchte.
Mal nur so als Unterschied! Ich habe aber kein WIN1254 hier am laufen, auch die ganzen CASTS in Deiner DDL nerven mich. Aus meiner Sicht haste den Komponenten für Firebird halt nicht 'gescheit gesagt', was ein Boolean ist. Die kennen das schon, wenn man mit den vernünftig umgeht. Ich habe hier mal im Anhang zusätzlich zu Deinen Gedöns, was hier gar nicht lief, mal mit IBDAC und Co. (Jedi Ultimate Grid und DevX Grid), halt was ich so habe, das versucht nachzustellen. Bei allen TOTAL richtigen Einstellung bekomme ich trotzdem nur 0/1 angezeigt!. Aber, ich bin da raus... so einen komischen Kram (wie in der DDL) mach ich nicht mit. |
AW: dbCheckbox und dbGrid mit Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, Bild vergessen....
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz