Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [erledigt] CheckBox in Stringgrid (https://www.delphipraxis.net/60831-%5Berledigt%5D-checkbox-stringgrid.html)

Hansa 12. Jan 2006 21:30


[erledigt] CheckBox in Stringgrid
 
Hi,

ich habe in eine Spalte eines Stringgrids Checkboxen eingebaut. Im OnDrawCell übergebe ich hierzu die Koordinaten der Stringgrid Zellen (Rect) an die Checkboxen, damit sie genau reinpassen. Nun werden sie allerdings immer wieder neu gezeichnet => flackern. Allerdings habe ich in dem Grid ganz andere Sachen drin (in Abhängigkeit des Zellinhalts umfärben, rechtsbündige Darstellung bei Zahlen, Nachkommastellen usw.) und da flackert nichts. Was ist da falsch ?

Hier noch Teil vom OnDrawCell :
Delphi-Quellcode:
        if ACol in BoolCols then begin
          sgCheckBox.Left := Rect.Left + sg.Left + 2;
          sgCheckBox.Top := Rect.Top + sg.top + 2;
          sgCheckBox.Width := Rect.Right - Rect.Left;
          sgCheckBox.Height := Rect.Bottom - Rect.Top;
          sgCheckBox.Visible := True;

Lannes 12. Jan 2006 22:09

Re: CheckBox in Stringgrid
 
Hallo,

mal eine Frage dazu,
spendierst Du jeder betreffenden Zelle eine eigene CheckBox?

kiar 13. Jan 2006 00:07

Re: CheckBox in Stringgrid
 
moin hansa,

wie wäre es mit der Suche :mrgreen:

CheckBox im Stringgrid .... gibt es genau einem Eintrag :shock:

raik

Hansa 13. Jan 2006 00:10

Re: CheckBox in Stringgrid
 
Auf der Form ist eine einzige Checkbox. Und die wird allerdings immer wieder mit veränderten Koordinaten angezeigt.

@roter Kasten Schlaumeier :mrgreen: bei mir ist da nicht.

kiar 13. Jan 2006 00:16

Re: CheckBox in Stringgrid
 
http://www.delphipraxis.net/internal...box+stringgrid

Lannes 13. Jan 2006 07:12

Re: CheckBox in Stringgrid
 
Hallo,
Zitat:

Zitat von Hansa
Auf der Form ist eine einzige Checkbox. Und die wird allerdings immer wieder mit veränderten Koordinaten angezeigt.

dann muss das flackern.
Durch das Verschieben der CheckBox von einer Zelle in eine andere,
wird die Zelle aus der die Checkbox entfernt wurde auch neu gezeichnet,
das Zeichnen verschiebt die Checkbox dann wieder usw. usw.
Dein Code fordert für jede Zelle in der Spalte die Checkbox-Verschiebung,
daraus entsteht dann eine Endlosschleife, folglich flackert es.
Dein Code in OnDrawCell muss das behandeln.

PseudoCode:
Code:
if ACol in CheckBoxSpalte then
  if SollCheckBox then
    CheckBoxNachHierVerschieben
    else
      LeereZelleZeichnen

Hansa 13. Jan 2006 10:49

Re: CheckBox in Stringgrid
 
Oh je. Das wird noch komplizierter. Habe das jetzt so gemacht :
Delphi-Quellcode:
        if ACol in BoolCols then begin
          DrawRect:=Rect;
          InflateRect(DrawRect,-1,-1);
          DrawState := ISChecked[StrToInt (sg.Cells [ACol,ARow]) = 1];
          sg.Canvas.FillRect(Rect);
          DrawFrameControl(sgArtNr.Canvas.Handle, DrawRect,DFC_BUTTON, DrawState);
Wenn ich das richtig dehe, dann sind die Checkboxen lediglich zu sehen und haben keine Funktion, oder ? Muß ich da jetzt noch mit MouseMove im SelectCell usw. hantieren ? :shock:

Helmi 13. Jan 2006 10:54

Re: CheckBox in Stringgrid
 
Hallo

vielleicht hilft dir ja das weiter :link.

Das ist zwar eine ComboBox in einer StringGrid, aber das kann man ja umbauen.

ibp 13. Jan 2006 11:30

Re: CheckBox in Stringgrid
 
und noch einer sdc der klappt sehr gut, du musst natürlich das control austauschen!

Hansa 13. Jan 2006 12:00

Re: CheckBox in Stringgrid
 
Das habe ich doch alles schon gesehen. :-D Die Checkbox ist anders ! Aber egal. Gezeichnet war sie ja vorher sowieso richtig. Habe es jetzt so gemacht :

Delphi-Quellcode:
procedure Tfrm.sgClick(Sender: TObject);
begin
  inherited;
  if sg.Col in BoolCols then begin
    if StrVorhanden (sg.Cells [sg.Col,sg.Row]) then begin
      if StrToInt (sg.Cells [sg.Col,sg.Row]) = 1 then
        sgr.Cells [sg.Col,sgArtNr.Row] := '0'
      else
        sg.Cells [sg.Col,sg.Row] := '1';
    end;
  end;
end;
Ist auch besser für nicht so zielsichere. Die brauchen dann nur die richtige Zelle zu treffen und nicht die CheckBox selber. :mrgreen: Tja, da sieht man mal wieder, wie man mit einem simplen Trick Delphi veranlaßt, genau das gewünschte zu machen. Und der Trick besteht darin, daß hinter der CheckBox in Wirklichkeit 1 oder 0 steht. 8)

Helmutf 14. Mär 2006 12:47

Re: [erledigt] CheckBox in Stringgrid
 
Hallo,

ich versuche gerade eine CheckBox im Stringgrid zu simulieren.
Ich kann das Beispiel aber nicht nachbauen (Delphi 5).

Fehlermeldungen:

1) Undefinierter Bezeichner "IsChecked"

2) Bei DrawFrameControl: Inkompatible Typen: 'Cardinal' und 'TGridDrawState'

Wo ist DrawRect und DrawState deklariert ?

Wird die CheckBox 'sgCheckBox' (befindet sich auf Formular) auf hidden gesetzt ?


Danke

Helmutf 16. Mär 2006 15:39

Re: [erledigt] CheckBox in Stringgrid
 
Lieber Hansa!

Dein Beispiel würde mich interessieren.
Hiezu würde ich jedoch noch obige Angaben benötigen.

Danke.

Hansa 16. Mär 2006 17:50

Re: [erledigt] CheckBox in Stringgrid
 
Jo, das Beispiel ist wirklich zu mager. So ungefähr muß es aber aussehen. Das ist die Stelle, die bei Dir wohl Ärger macht :

Delphi-Quellcode:
procedure Tfrm.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const IsChecked : array[Boolean] of Integer =
      (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var DrawState: Integer;
    DrawRect: TRect;
begin
  inherited;
Wenn das alleine nicht reicht, dann poste bitte den eigenen Quelltext. Die komplette Prozedur hat ca. 200 Zeilen und würde wohl nichts nützen, weil zu speziell. Außerdem ist es OOP-mäßig strukturiert, d.h. einige Eigenschaften sind eventuell bereits bei einem Vorfahren deklariert.

Hansa 17. Mär 2006 21:16

Re: [erledigt] CheckBox in Stringgrid
 
Stop, der Kopf ist zu wenig. Da gibts noch lästige Hürden. Hier ist das wichtige (aus OnDrawCell !) :

Delphi-Quellcode:
        if ACol in CheckBoxCols then begin
          if StrToInt (sg.Cells [ACol,ARow]) = 1 then begin
            DrawRect:=Rect;
            InflateRect(DrawRect,-1,-1);
            DrawState := ISChecked[StrToInt (sg.Cells [ACol,ARow]) = 1];
// ^ die 0/1, die aus dem DB-Original in sg steht beeinflusst, ob die
// CheckBox gecheckt ist ! D.h. sie wird im OnDrawCell je nach Wert gezeichnet !
            sg.Canvas.FillRect(Rect); // hinter Cells liegende 0/1 nicht anz.
            DrawFrameControl(sgNr.Canvas.Handle,DrawRect,DFC_BUTTON,DrawState);
          end
          else begin  // unchecked : Checkbox ausblenden
            DrawRect:=Rect;
            InflateRect(DrawRect,-1,-1);
            Canvas.FillRect(DrawRect); // unchecked-0 überdecken
//            canvas.TextOut(rect.Left,rect.bottom-canvas.Textheight('X')-1,' ');
          end;
        end
Damit dürfte das jetzt aber hinzukriegen sein. CheckBoxCols ist dabei ein eigenes SET OF byte um entscheiden zu können, um welche Spalten es geht (habe da einige). Und Achtung : das Beispiel zeigt so nur gecheckte Boxen an ! Außerdem muß noch das OnMouseClick ausgewertet werden, damit die DheckBox wie erwartet funktioniert.

Helmutf 18. Mär 2006 12:07

Re: [erledigt] CheckBox in Stringgrid
 
Danke bisher.

Ich bin derzeit anderweitig beschäftigt.
Komme noch mal darauf zurück und werde das Beispiel aufbauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz