AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Checkboxen in Stringgrid

Ein Thema von michael.cohrs · begonnen am 16. Mai 2016 · letzter Beitrag vom 18. Mai 2016
Antwort Antwort
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#1

Checkboxen in Stringgrid

  Alt 16. Mai 2016, 07:48
Guten morgen zusammen,

ich habe in eine Stringgrid mit folgender Methode Checkboxen in Column 0 gezeichnet:

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  function CheckBox(Value: String): Cardinal;
  begin
    result:= DFCS_INACTIVE; // no Entry
    if Value = 'truethen // Checked
      result:= DFCS_BUTTONCHECK or DFCS_CHECKED
     else if Value = 'falsethen // not Checked
      result:= DFCS_BUTTONCHECK;
    if not Editing then
      result:= result or DFCS_MONO; // no Editing
  end;

begin
  with TStringGrid(Sender) do
    if (ACol in CheckBoxCols) and not (gdFixed in State) then begin
      Canvas.FillRect(Rect);
      InflateRect(Rect, -4, -4);
      DrawFrameControl(Canvas.Handle, Rect,DFC_Button,
                       CheckBox(Trim(Cells[ACol, ARow])));
    end; // if gdFixed in State
end;
Das MouseDown Event sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var iCol, iRow: Integer;
begin
  with TStringGrid(Sender) do
    if (Button = mbLeft) and Editing then begin
      MouseToCell(x, y, iCol, iRow);
      if (iCol > 0) and (iRow > 0) then begin
        if Cells[iCol, iRow] = '1then // Checked
          Cells[iCol, iRow]:= '0'
         else if Cells[iCol, iRow] = 'falsethen // not Checked
          Cells[iCol, iRow]:= 'true';
      end;
    end;
end;
soweit klappt alles hervoragend, mein Problem ist folgendes: Ich möchte beim Aufbau des Programms und beim Einlesen aus einer Datenbank die Checkboxen entstprechend des gelesenen Wertes entweder Checken oder halt nicht. Das gelingt mir leider nicht, nach dem Einlesen und setzen des Wertes reagieren die Checkboxen nicht mehr auf den Click, soll heissen der neue Wert wird nicht gezeichnet. Hat vielleicht jemand einen Lösungsansatz?

(Die beiden Methoden stammen nicht von mir!!)

Vielen Dank

Michael
Michael Cohrs
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#2

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 09:36
Guten morgen zusammen,

Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var iCol, iRow: Integer;
begin
  with TStringGrid(Sender) do
    if (Button = mbLeft) and Editing then begin
      MouseToCell(x, y, iCol, iRow);
      if (iCol > 0) and (iRow > 0) then begin
        if Cells[iCol, iRow] = '1then // Checked
          Cells[iCol, iRow]:= '0'
         else if Cells[iCol, iRow] = 'falsethen // not Checked
          Cells[iCol, iRow]:= 'true';
      end;
    end;
end;
Wo setzt Du denn hier wieder von 'not Cheched' auf 'Checked' zurück, wenn der Wert '0' ist?
Und umgekehrt wenn der Wert 'true' ist ?

Also entweder nur mit '0' und '1' oder 'fasle' und 'true' arbeiten und dann auch bei jedem Click 'umschalten'
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#3

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 12:41
Hallo HolgerX,

es wird doch in dem MouseDown Event geprüft welcher Wert gerade gesetzt
wurde und dann entprechend umgekehrt gsetzt.

(Oder mache ich hier grundliegend etwas falsch????)
Michael Cohrs
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#4

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 12:50
Sorry, Copy-Paste Fehler , hier der richtige Source:

Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var iCol, iRow: Integer;
begin
  with TStringGrid(Sender) do
    if (Button = mbLeft) and Editing then
    begin
      MouseToCell(x, y, iCol, iRow);
      if (iCol > 0) and (iRow > 0) then
      begin
        if Cells[iCol, iRow] = '1then // Checked
          Cells[iCol, iRow]:= '0'
         else if Cells[iCol, iRow] = '0then // not Checked
          Cells[iCol, iRow]:= '1';
      end;
    end;
end;
Michael Cohrs
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#5

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 13:51
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  function CheckBox(Value: String): Cardinal;
  begin
    result:= DFCS_INACTIVE; // no Entry
    if Value = 'truethen // Checked
      result:= DFCS_BUTTONCHECK or DFCS_CHECKED
     else if Value = 'falsethen // not Checked
      result:= DFCS_BUTTONCHECK;
    if not Editing then
      result:= result or DFCS_MONO; // no Editing
  end;

begin
  with TStringGrid(Sender) do
    if (ACol in CheckBoxCols) and not (gdFixed in State) then begin
      Canvas.FillRect(Rect);
      InflateRect(Rect, -4, -4);
      DrawFrameControl(Canvas.Handle, Rect,DFC_Button,
                       CheckBox(Trim(Cells[ACol, ARow])));
    end; // if gdFixed in State
end;
OK, dann hier nur noch 'true' und 'false' gegen '1' und '0' tauschen, da dort nur die Zahl drinnen steht und nicht der Text.


oder

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

  function CheckBox(Value: boolean): Cardinal;
  begin
    result:= DFCS_INACTIVE; // no Entry
    if Value then // Checked
      result:= DFCS_BUTTONCHECK or DFCS_CHECKED
    else // not Checked
      result:= DFCS_BUTTONCHECK;
    if not Editing then
    result:= result or DFCS_MONO; // no Editing
  end;
  
var
  b : boolean;
begin
  try
    with TStringGrid(Sender) do
      if (ACol {in CheckBoxCols)} =1) and not (gdFixed in State) then begin
        b := StrToBool(Trim(Cells[ACol, ARow]));
        Canvas.FillRect(Rect);
        InflateRect(Rect, -4, -4);
        DrawFrameControl(Canvas.Handle, Rect,DFC_Button,CheckBox(b));
      end; // if gdFixed in State
  except
  end;
end;
Dann ist es egal, ob '0' und '1' oder 'true' und 'false', da StrToBoll beides konvertieren kann..
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#6

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 14:00
Danke, soweit habe ich alles umgesetzt, das Problem nun ist folgendes: wenn ich beim laden aus der Datenbank die eine Checkbox als Checked setze, reagieren die Boxen beim Click nicht mehr, soll heissen ich kann in keins der Boxen den Haken mehr setzen
Michael Cohrs
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#7

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 16:07
Zeige doch mal, wie du den Wert (True/false) in das Stringgrid reinschreibst..

Wird da '0' und '1' verwendet oder doch was anderes?
  Mit Zitat antworten Zitat
michael.cohrs

Registriert seit: 11. Nov 2005
Ort: Hamburg
130 Beiträge
 
#8

AW: Checkboxen in Stringgrid

  Alt 16. Mai 2016, 18:25
Hallo,
so schreibe ich die Werte in das Grid:

Delphi-Quellcode:

procedure TFAuftragsDruckliste.BuildCheckListView;
Var
    oPrintOBJ : TPrintObj;
    i : Integer;
    sTemp : String;
begin

  Dbg_Auftragsauswahl_new.RowCount := FPrint_lst.Count + 1;
  for I := 0 to FPrint_lst.Count - 1 do
  Begin
    oPrintOBJ := FPrint_lst[i] As TPrintObj;
    if oPrintOBJ <> nil then
    Begin
      if oPrintOBJ.APASW then
        sTemp := '1'
      else
        sTemp := '0';

      with Dbg_Auftragsauswahl_new do
      Begin
        Objects[8,i+1] := oPrintOBJ;
        Cells[0, i+1] := sTemp;
      end;
    end;
  end;
end;
Michael Cohrs
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#9

AW: Checkboxen in Stringgrid

  Alt 18. Mai 2016, 04:31
Hmm..


Sorry, Copy-Paste Fehler , hier der richtige Source:

Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var iCol, iRow: Integer;
begin
  with TStringGrid(Sender) do
    if (Button = mbLeft) and Editing then
    begin
      MouseToCell(x, y, iCol, iRow);
      if (iCol > 0) and (iRow > 0) then
      begin
        if Cells[iCol, iRow] = '1then // Checked
          Cells[iCol, iRow]:= '0'
         else if Cells[iCol, iRow] = '0then // not Checked
          Cells[iCol, iRow]:= '1';
      end;
    end;
end;


Hier wird auf (iCol > 0) abgefragt, aber deine Column bei



Zitat:
Delphi-Quellcode:
procedure TFAuftragsDruckliste.BuildCheckListView;
Var
    oPrintOBJ : TPrintObj;
    i : Integer;
    sTemp : String;
begin

  Dbg_Auftragsauswahl_new.RowCount := FPrint_lst.Count + 1;
  for I := 0 to FPrint_lst.Count - 1 do
  Begin
    oPrintOBJ := FPrint_lst[i] As TPrintObj;
    if oPrintOBJ <> nil then
    Begin
      if oPrintOBJ.APASW then
        sTemp := '1'
      else
        sTemp := '0';

      with Dbg_Auftragsauswahl_new do
      Begin
        Objects[8,i+1] := oPrintOBJ;
        Cells[0, i+1] := sTemp;
      end;
    end;
  end;
end;

ist doch gleich 0! Somit aus (iCol > 0) ein (iCol >= 0) machen und dann sollte es gehen....

Ansonsten zeige nochmal alle beiden Funktionen, um Copy-Fehler aus zu schließen...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:43 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