![]() |
StringGrid mit spezieller Auswahlmöglichkeit
Liste der Anhänge anzeigen (Anzahl: 2)
Entstanden als Antwort auf diesen Thread:
![]() 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:
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 :?
StringGrid.Objects[Spalte, Zeile] := Pointer(1);
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:
oder nicht und die entsprechenden Farben auswählen. Anschließend wird der Text noch dargestellt und alles sollte laufen :firejump:
if StringGrid.Objects[Spalte, Zeile] <> nil then
Anbei das Demo-Projekt zu dieser Theorie mit allen nötigen Sourcen. Die wichtigsten Code-Ausschnitte:
Delphi-Quellcode:
...:cat:...
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; P.S.: Anbei noch ein ScreenShot :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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-2025 by Thomas Breitkreuz