Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid und Checkbox (https://www.delphipraxis.net/13804-dbgrid-und-checkbox.html)

Emilio 27. Dez 2003 10:37


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

Leuselator 27. Dez 2003 11:19

Re: DBGrid und Checkbox
 
1. Variante: Felder, die nicht direkt vom User geändert werden sollen
Code:
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.
2. Variante: Checkboxen für vom User zu beeinflussende Werte
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:
Code:
  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;
Verwendung:
Code:
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;
soweit mein Vorschlag
Gruß

Emilio 28. Dez 2003 13:24

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

Emilio 28. Dez 2003 13:45

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

Emilio 28. Dez 2003 15:12

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

Leuselator 30. Dez 2003 15:58

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