DBGrid und Checkbox
Hallo allerseits,
ich beschäftige mich mit der Frage , wie man Boolean-Feldwerte in einem DBGrid darstellen kann. Ich verwende DBISAM und D7. Ich habe eine DBISAMQuery mit div Datenfeldern, 3 davon sind Boolean. Feldwerte wie "True" oder "False", "ja" oder "nein" in einem DBGrid anzuzeigen, finde ich nicht benutzerfreundlich. Anstelle dessen würde ich gerne eine Checkbox in das DBGrid integrieren. Leider bin ich noch nicht dahinter gekommen, wie das gehen könnte. Alternativ könnte ich ja auch die Information aus den 3 Boolean-Feldern zu jedem Datensatz mit Checkboxen neben dem DBGrid darstellen. Dies ist nur (bislang) insofern problematisch, da der user gerne mal auf eine Checkbox klickt und sich damit der Wert in der zugrunde liegenden DBISAMTable ändern müsste - was er nicht (bislang) nicht tut. Hat jemand eine Idee, wie man mit Boolean-Werten im DBGrid am besten umgeht? Ich freue mich auf Eure Beiträge Tschau Emilio |
Re: DBGrid und Checkbox
1. Variante: Felder, die nicht direkt vom User geändert werden sollen
Code:
2. Variante: Checkboxen für vom User zu beeinflussende Werte
hier bietet sich zum Darstellen der unterschiedlichen Zustände die Nutzung von Wingdings als Font für die betreffende Spalte an, da dieser auf nehezu jedem Windowssystem verfügbar ist. Dazu muß man dem entsprechenden Feld im Objektispektor als DisplayValues die entsprechenden 2 Zeichen durch Semikolon getrennt angeben (z.B.: ü;U für Aktuell/Veraltet) und im DBGrid für die entsprechende Spalte den Font auf Wingdings setzen.
Code:
Code:
dazu ist es hilfreich, das normale DB-Grid um das Ereignes "OnSelectCell" zu erweitern (äquivalent zu TStringGrid) und somit die Möglichkeit zu schaffen, auf das Wechseln in die entsprechende Spalte zu reagieren (indem man z.B. die Checkbox anzeigt:
Code:
Verwendung:
TLsDbGrid = class(TDBGrid)
private FOnDrawCell: TDrawCellEvent; FOnSelectCell: TSelectCellEvent; protected function SelectCell(ACol, ARow: Longint): Boolean; override; public function CellRect(ACol, ARow: Longint): TRect; published property OnSelectCell: TSelectCellEvent read FOnSelectCell write FOnSelectCell; end; implementation function TLsDbGrid.CellRect(ACol, ARow: Integer): TRect; begin Result := inherited CellRect(ACol, ARow); end; function TLsDbGrid.SelectCell(ACol, ARow: Integer): Boolean; begin Result := True; if Assigned(FOnSelectCell) then FOnSelectCell(Self, ACol, ARow, Result); end;
Code:
soweit mein Vorschlag
procedure TForm1.LsDbGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var R: TRect; begin DbCheckBox1.Visible := False; case ACol of 1: begin R := LsDbGrid1.CellRect(ACol, ARow); R.Left := R.Left + LsDbGrid1.Left; R.Right := R.Right + LsDbGrid1.Left; R.Top := R.Top + LsDbGrid1.Top; R.Bottom := R.Bottom + LsDbGrid1.Top; DbCheckBox1.Left := R.Left-1; // Position der Checkbox anpassen DbCheckBox1.Top := R.Top-1; DbCheckBox1.Width := R.Right-R.Left+2 DbCheckBox1.Visible := True; // Checkbox anzeigen CanSelect := False; // selection der Zelle des DBGrid verhindern DbCheckBox1.SetFocus; end; end; // case end; Gruß |
Re: DBGrid und Checkbox
Wow,
danke für die umfangreiche Antwort. Den ersten Weg habe ich ausprobiert - klappt! Ich habe vor, auf dem Form1 das DBISAMDBgrid nur zum "ansehen" zu präsentieren. Von daher ist der erste Vorschlag prima. Deinen 2. Vorschlag konnte ich noch nicht ausprobieren, schaut aber mächtig aus. Von der Vorgehensweise herdachte ich, es wäre sinnvoll, unter Einsatz von Buttons (NEU, BEARBEITEN und LÖSCHEN) entsprechende Forms aufzurufen. Hier stellt sich jedoch erneut die Frage, wie "binde" ich die Checkboxen an die Datenbank an? Z.B. bei der Neueingabe eines Datensatzes soll der User 3 Fragen gestellt bekommen, die er mit Ja oder Nein beantworten soll, in dem er jeweils eine Checkbox klickt (oder es lässt). Leider habe ich noch keinen Hinweis inder OH oder einer NG gefunden, wie man am besten solche Werte in die Table bekommt. Viele Grüße Emilio |
Re: DBGrid und Checkbox
Hi Leuselator,
habe Deinen 2. Vorschlag "integriert". Ich erhalte nun die Fehlermeldung: Methode 'SelectCell" nicht in Basisklasse gefunden :wiejetzt: Tschau Emilio |
Re: DBGrid und Checkbox
Hi Leuselator,
Ich Laie habe jetzt Deinen Code richtig verarbeitet und er ist jetzt ohne Fehler kompilierbar. Bis auf den Hinweis, dass FOnDrawCell deklariert - aber nie verwendet wurde, funktioniert das Programm. Aber, vielleicht bin ich mal wieder auf dem Holzweg, was sollte denn Dein 2. Vorschlag bewirken? - Bislang passiert überhaupt nichts anders, als ohne Deinen Code auch - sollte ich da irgendeine Kleinigkeit übersehen haben? :wiejetzt: Viele Grüße Emilio |
Re: DBGrid und Checkbox
Liste der Anhänge anzeigen (Anzahl: 2)
Du mußt die Komponente registrieren.
Im Anhang findest Du ein zip-file, dieses in das Borland\Delphi-Verzeichnes entpacken (sollte dort neues Verzeichnis "AddOn" und darin ein Verzeichnis "LeuselSoft" erstellen bei mir z.B.: "C:\Programme\Borland\Delphi5\AddOn\LeuselSoft "). Dann die Datei LsDbGrd.dpk in Delphi öffnen, kompilieren und installieren (siehe Bild "howto.jpg" im Anhang) Danach kannst Du das Package wieder schließen. Du solltest nun in der Pallete "Datensteuerung" ein neues Icon finden, welches auf die neue Komponente verweist. wenn Du sie auf ein leeres Formular ziehst, erscheint ein DB-Grid (wer hätte das gedacht?). Der Unterschied zum normalen DB-Grid von Delphi findet sich im Objektinspektor auf der Ereignis-Seite. Dort findest Du ein neues Ereignis Namens "OnSelectCell". Du kannst in diesem Ereignis auf die Auswahl einer Zelle reagieren und z.B. eine Kombobox "über" das DBGrid legen (wie im 1. Beitrag von mir unter Verwendung gezeigt). Das ist schon alles. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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