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
StringGrid.Objects[Spalte, Zeile] := Pointer(1);
Jetzt ist da kein Objekt drinne - also nicht darauf zugreifen, aber daß interessiert Delphi nicht
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
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
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;
...
...
P.S.: Anbei noch ein ScreenShot