Okay, das so nicht ganz korrekt.
col:= selectiert die Column wohl nur, wenn diese nicht bereits selectiert ist (was aber bei der Option goRowSelect bereit der fall ist).
Das Problem ist ja nicht das Selektieren einer Zelle, das funktioniert, sondern, dass die bisher selektierten Zellen nicht automatisch deselektiert werden (bzw. dieses Deselektieren in der Bildschirmdarstellung nicht erkennbar ist), wenn goRowSelect ausgeschaltet wird.
Dann probier das doch mal aus.
Denn
Delphi-Quellcode:
strngrd1.Options:=strngrd1.Options-[goRowSelect];
strngrd1.Col:=1;
führt dazu, das nach wie vor alle Zellen der Zeile selektiert sind. Lediglich die Darstellung verändert sich ein wenig. Während bei einem
goRowSelect alle Zellen mit 1 gemeinsamen Rahmen versehen sind, nach diesen beiden Zeilen alle Zellen mit einem eigenen Rahmen versehen. Sind aber noch alle markiert.
Kommt zwar am Ende das gleich bei raus, aber man muss nicht jeder Zelle der Zeile rückwärts selektieren.
Ich gehe davon aus, dass du das nicht ausprobiert hast, sonst hättest du gesehen, dass das nicht der Fall ist. Das "rückwärts selektieren" macht man ja nicht, damit die Zellen der Reihe nach selektiert werden, sondern damit sie der Reihe nach ERKENNBAR deselektiert werden, wenn die nächste Zelle (links davon) selektiert wird.
Ich habe das sehr wohl ausprobiert. Aber von einem "ERKENNBAREM" delektieren ist im Ausgangspost vom TE nicht die Rede. Ihm ging es darum, dass wenn man im Code
goRowSelect wieder aus den Optionen entfernt, nicht automatisch nur noch eine Zelle markiert ist, auch nicht, wenn man der Eigenschaft Col eine neuen Wert zuweist.
Hier, mach dir mal ne Form mit einen StringGrid und 4 Buttons und probier das mal aus.
Delphi-Quellcode:
unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.Grids;
type
TForm1 =
class(TForm)
strngrd1: TStringGrid;
btn1: TButton;
btn2: TButton;
btn3: TButton;
btn4: TButton;
procedure btn4Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
strngrd1.Options:=strngrd1.Options-[goRowSelect];
strngrd1.Col:=1;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
strngrd1.Options:=strngrd1.Options-[goRowSelect];
strngrd1.Col:=2;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
strngrd1.Options:=strngrd1.Options-[goRowSelect];
strngrd1.Col:=3;
strngrd1.Selection:=TGridRect(Rect(strngrd1.FixedCols,strngrd1.Row,strngrd1.FixedCols,strngrd1.Row));
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
strngrd1.Options:=strngrd1.Options+[goRowSelect];
end;
procedure TForm1.FormShow(Sender: TObject);
begin
btn4Click(self);
end;
end.
Du wirst feststellen, dass beim Klick auf btn1 außer der visuellen Veränderung, wie ich oben geschrieben habe, nicht viel passiert. Auch nicht, wenn man noch mal drauf klickt. Erst wenn man danach mal auf btn2 klickt, wird tatsächlich die 2 Zelle auch selektiert.
Wohingegen ein klick auf btn3 immer funktioniert.
btn4 selektiert dann wieder die ganze Zeile.
PS: Die visuelle Veränderung, die ich oben erwähne, kann aber bei einer anderen
OS- oder Delphiversion möglichweise sich anders darstellen.