AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid und Checkbox

Ein Thema von Emilio · begonnen am 27. Dez 2003 · letzter Beitrag vom 30. Dez 2003
Antwort Antwort
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#1

DBGrid und Checkbox

  Alt 27. Dez 2003, 11:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: DBGrid und Checkbox

  Alt 27. Dez 2003, 12:19
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ß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#3

Re: DBGrid und Checkbox

  Alt 28. Dez 2003, 14:24
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
  Mit Zitat antworten Zitat
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#4

Re: DBGrid und Checkbox

  Alt 28. Dez 2003, 14:45
Hi Leuselator,

habe Deinen 2. Vorschlag "integriert".

Ich erhalte nun die Fehlermeldung:

Methode 'SelectCell" nicht in Basisklasse gefunden



Tschau

Emilio
  Mit Zitat antworten Zitat
Emilio

Registriert seit: 14. Dez 2003
65 Beiträge
 
#5

Re: DBGrid und Checkbox

  Alt 28. Dez 2003, 16:12
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?




Viele Grüße

Emilio
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#6

Re: DBGrid und Checkbox

  Alt 30. Dez 2003, 16:58
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ß
Miniaturansicht angehängter Grafiken
howto.jpg  
Angehängte Dateien
Dateityp: zip addon.zip (7,5 KB, 73x aufgerufen)
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:04 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