Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi StringGrid mit spezieller Auswahlmöglichkeit (https://www.delphipraxis.net/25173-stringgrid-mit-spezieller-auswahlmoeglichkeit.html)

sakura 2. Jul 2004 08:30


StringGrid mit spezieller Auswahlmöglichkeit
 
Liste der Anhänge anzeigen (Anzahl: 2)
Entstanden als Antwort auf diesen Thread: http://www.delphipraxis.net/internal...ct.php?t=28965

So, nun zur "schnellen Lösung", auch wenn diese nicht unbedingt die schönste ist. (Geht nur unter Win16/Win32, nicht .NET!)

Das StringGrid bietet uns für jede Zelle zwei Eigenschaften. Einmal den Text, welcher darzustellen ist (StringGrid.Cells[Spalte, Zeile]) und einmal dürfen wir für jede Zelle ein verbundenes Objekt [StringGrid.Objects[Spalte, Zeile] definieren.

Die hier vorgestellte Lösung bindet sich an die verbundenen Objekte an und geht davon aus, daß diese noch nicht anderweitig genutzt sind! Solltest Du die schon genutzt haben, dann mußt Du die Lösung entsprechend anpassen.

Wird eine Zelle markiert, so setze ich den Pointer für den entsprechenden Objekteintrag einfach auf 1
Delphi-Quellcode:
StringGrid.Objects[Spalte, Zeile] := Pointer(1);
Jetzt ist da kein Objekt drinne - also nicht darauf zugreifen, aber daß interessiert Delphi nicht :mrgreen: Wird die Zelle wieder abgewählt, so setzen wir den Objekteintrag auf nil. Nicht freigeben, da ja kein echtes Objekt vorliegt. Sonst führt das zu einer AV :?

Jetzt müssen wir uns nur noch um die Darstellung kümmern. Dieses geht am einfachsten, indem wir das OnDrawCell Ereignis abfangen und selbst zeichnen. Jetzt müssen wir nur noch testen, ob die Zeile markiert ist
Delphi-Quellcode:
if StringGrid.Objects[Spalte, Zeile] <> nil then
oder nicht und die entsprechenden Farben auswählen. Anschließend wird der Text noch dargestellt und alles sollte laufen :firejump:

Anbei das Demo-Projekt zu dieser Theorie mit allen nötigen Sourcen.

Die wichtigsten Code-Ausschnitte:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  [...]
  with Sender as TStringGrid do
  begin
    [...]
    // select color
    if Objects[ACol, ARow] = nil then
    begin
      // cell not selected
      Canvas.Brush.Color := clWindow;
      Canvas.Font.Color := clWindowText;
    end else begin
      [...]
    end;
    // draw cell
    Canvas.TextRect(Rect, Rect.Left, Rect.Top, Cells[ACol, ARow]);
  end;
end;

procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  [...]
  with Sender as TStringGrid do
    if Key = VK_SPACE then
      if Objects[Col, Row] = nil then
        Objects[Col, Row] := Pointer(1)
      else
        Objects[Col, Row] := nil;
end;
...:cat:...

P.S.: Anbei noch ein ScreenShot :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 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