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 Check-Box in ein StringGrid (https://www.delphipraxis.net/2108-check-box-ein-stringgrid.html)

VizeTE 7. Jan 2003 13:50


Check-Box in ein StringGrid
 
Hallo alle zusammen.

Wie Ihr schon aus der Überschrift entnehmen könnt möchte ich gern eine Spalte mit Check-Boxen (heißt das wirklich so, sieht komisch aus ;o) anlegen. Dazu habe ich mir gedacht, dass ich mir je eine Liste mit boolschen Variablen anlegen kann deren Anzahl der Felder in dem Grid entspricht.
Dann kann ich in der OnDraw-Methode des Grids selbst einen Haken reinzeichnen, oder auch nicht.

Gesagt, getan...
Hat auch alles schön funktioniert bis die Liste dann größer wurde und man vertikal scrollen kann. Sowie ich dann mindestens ein Eintrag heruntergescrollt habe kam es zu recht komischen Fehlern die ich noch nicht recht eingrenzen konnte.
Wie Zum Beispiel: ein darunterliegendes Feld wird markiert, ein Feld welches vorher angeklickt wurde wird markiert, es passier nichts.

Hier mal der Quellcode:

Delphi-Quellcode:
procedure TBewegungenFormular.BewegungStringGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ARect : TRect;
begin
  if FList.Count > 0 then
  begin

    if (BewegungStringGrid.Col = 0) and
       (BewegungStringGrid.Row > 0) then
    begin
      TItem(FList.Items[Pred(BewegungStringGrid.Row)]).Checked                  :=not TItem(FList.Items[Pre(BewegungStringGrid.Row)]).Checked;

      ARect.Left  := 0;
      ARect.Top   :=     BewegungStringGrid.Row*BewegungStringGrid.DefaultRowHeight;
      ARect.Right := BewegungStringGrid.ColWidths[0];
      ARect.Bottom := ARect.Top + BewegungStringGrid.DefaultRowHeight;

      BewegungStringGridDrawCell(Sender, BewegungStringGrid.Col, BewegungStringGrid.Row, ARect, [gdSelected]);
      Application.ProcessMessages;
    end;

  end;
end;
Sorry für die komische Formatierung, ich bekomms nicht besser hin.

Ciao und schon mal schönen Dank.

[edit=Sakura]CODE in DELPHI-Tags umbenannt; Häckchen bei BBCode in diesem Beitrag deaktivieren entfernt[/edit]

sakura 7. Jan 2003 14:07

Das Zeichnen der Häckchen solltest Du generell im OnDrawCell (o.ä.) bzw. OnAdvancedDrawCell Ereigniss erledigen. Dann sollte es auch klappen.

...:cat:...

eddy 7. Jan 2003 14:17

Hallo VizeTE,

ich wollte mich ein wenig mit Deinem Problem befassen, da ich unter Umständen so etwas ähnliches für ein DBGrid gebrauchen könnte. Allerdings reicht mir da der Quelltext-Schnipsel nicht aus.

Wie wurden FList, TItem und OnDrawCell von Dir deklariert?

mfg
eddy

VizeTE 7. Jan 2003 15:04

Hallo nochmal.

@sakura

Also das eingetliche Zeichnen läuft natürlich in der OnDraw-Cell-Methode ab (wie in dem Eröffnungsbeitrag beschrieben). Diese funktion wird ja auch am Ende das abgebildeten Quellcodes aufgerufen. Diese Methode an sich werde ich im Anschluß gleich nochmal mitschicken.

@eddy

Die FList (Variable vom Typ List) und TItem (selbstdefinierter Typ) sind eigentlich nicht notwendig. Da sie aber noch ne Menge Informationen beinhalten die speziell für meine Verwendung interessant sind habe ich diese beiden Komponenten genutzt. Im Grunde kannst Du Dir das wie ein Array vorstellen, der boolsche Variablen enthält ob das entsprechende Feld angehalt ist oder nicht. Die OnDraw-Methode kommt im Anschluß.

Code:

procedure TBewegungenFormular.BewegungStringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  AOffSet     : TPoint;
  AHaken1      : TPoint;
  AHaken2      : TPoint;
  AHaken3      : TPoint;
  ARect       : TRect;
begin

  with BewegungStringGrid.Canvas do
  begin

    if Rect.Top = 0 then
    begin
      Brush.Color := clBtnFace;
      FillRect(Rect);
      Pen.Color  := clWhite;
      Rectangle(Rect);
      TextOut(Rect.Left, Rect.Top, BewegungStringGrid.Cells[ACol, ARow]);
      Exit;
    end;

    Brush.Color := clWhite;
    FillRect(Rect);

    if (ARow > 0) and
       (ACol = 0) then
    begin
      //Kasten zeichnen
      AOffSet.X := (Rect.Right - Rect.Left - 11) div 2;
      AOffSet.Y := (Rect.Bottom - Rect.Top - 11) div 2;

      ARect.Left  := AOffSet.X + Rect.Left;
      ARect.Top   := AOffSet.Y + Rect.Top;
      ARect.Right := AOffSet.X + Rect.Left + 11;
      ARect.Bottom := AOffSet.Y + Rect.Top + 11;

      Pen.Color := clGray;
      Rectangle(ARect);

      if TItem(FList.Items[Pred(ARow)]).Checked then
      begin
        //Haken zeichnen
        AHaken1.X := ARect.Left + 2;
        AHaken1.Y := ARect.Top + 6;
        AHaken2.X := ARect.Left + 4;
        AHaken2.Y := ARect.Top + 8;
        AHaken3.X := ARect.Left + 9;
        AHaken3.Y := ARect.Top + 3;

        Pen.Color := clGreen;

        MoveTo(AHaken1.X, AHaken1.Y - 0);
        LineTo(AHaken2.X, AHaken2.Y - 0);
        LineTo(AHaken3.X, AHaken3.Y - 0);

        MoveTo(AHaken1.X, AHaken1.Y - 1);
        LineTo(AHaken2.X, AHaken2.Y - 1);
        LineTo(AHaken3.X, AHaken3.Y - 1);

        MoveTo(AHaken1.X, AHaken1.Y - 2);
        LineTo(AHaken2.X, AHaken2.Y - 2);
        LineTo(AHaken3.X, AHaken3.Y - 2);
      end;

    end;

    TextOut(Rect.Left, Rect.Top, BewegungStringGrid.Cells[ACol, ARow]);
  end;

end;
Ich hoffe jetzt sind alle notwendigen Informationen vorhanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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 by Thomas Breitkreuz