AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken dbCheckbox und dbGrid mit Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

dbCheckbox und dbGrid mit Abfrage

Ein Thema von blutigerAnfänger · begonnen am 2. Aug 2014 · letzter Beitrag vom 3. Okt 2014
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#1

dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 09:37
Datenbank: Firebird • Version: 2.1 • Zugriff über: interbase
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:
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.
Es handelt sich um eine dreifeldrige Datentabelle, in welcher das erste Feld (Feld, siehe Quelltext) aus true und false besteht.

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#2

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 09:55
Woran liegt es, daß keine Checkboxen in dem DBGrid gezeichnet werden?
Wurde dem OnDrawColumnCell des DBGrid1 auch das DBGrid1DrawColumnCell event zugewiesen?
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 Query1.Active := True; oder einem Query1.Open; )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Aug 2014 um 09:59 Uhr)
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#3

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 10:40
Wurde dem OnDrawColumnCell des DBGrid1 auch das DBGrid1DrawColumnCell event zugewiesen?
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 Query1.Active := True; oder einem Query1.Open; )
Dbgriddrawcolumncell wurde selbstverständlich zgewiesen.

Die dbcheckbox liegt derzeit neben dem Grid. Werde ich gleich ändern.
Danke.
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#4

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 11:44
Die Checkbox liegt mittlerweile auf dem Dbgrid. Beim Click auf einen Datensatz wird die Checkbox, wie vorher, aktualisiert. Ansonsten keine Änderung.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 15:05
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.
Miniaturansicht angehängter Grafiken
tjvdbgridchecks.jpg  
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#6

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 19:49
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.
Ich muß das Feld in den EditControls einbinden. Leider sind diese grau (inaktiv) obwohl die Option AlwaysShowEditor false ist.
Kannst du mir weiterhelfen?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 2. Aug 2014, 23:27
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:
  1. Mit welcher Delphi-IDE arbeitest du?
  2. Was bedeutet "Zugriff über Interbase" auf eine Firebird-DB?
  3. Welche DB-Komponenten setzt du ein?
  4. Verschiedene DB-Komponenten erwarten verschiedene Typen bei der Deklaration eines Firebird-"Booleans", den Firebird ja von Haus aus nicht mitbringt. Bei FibPlus genügte ein SmallInt, IbDac von Devart erwartet einen Integer, in dessen Typenbezeichnung das Wort "Boolean" vorkommt.
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#8

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 3. Aug 2014, 08:27
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
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 3. Aug 2014, 12:44
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:
Function FirebirdBooleanTest(Const BooleanField : TField) : Boolean;
Begin
  Result := BooleanField.AsBoolean;
End;
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: dbCheckbox und dbGrid mit Abfrage

  Alt 4. Aug 2014, 11:10
Früher hatte ich ein DB-Grid von Scalabium benutzt. Das SmDbGrid. Super einfach aufgebaut, hat auch BooleanAsCheckBox Unterstützung und noch einige andere Dinge wie AutoColumnResize usw. Mittlerweile benutze ich das Ding allerdings fast gar nicht mehr sondern baue fast alles mit dem VirtualTreeView auf. Damit hast du fast nur Vorteile. Klar das Ding brauch einiges an Eingewöhnungszeit und es dauert etwas länger bis man so ein "Grid" aufgebaut hat, aber du kannst den kompletten TreeView nach deinen Wünschen gestalten. Und der Vorteil ist, es ruckelt nix, es wird alles perfekt neu gezeichnet usw. Probiers einfach mal aus.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    


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 23:50 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