naja, wenn ich dir den code jetzt reinstelle, wird dir das aber auch nicht wirklich was bringen
der code ist aus einem meiner projekte, ich mußte was rausnehmen, er sollte aber funktionieren. Es können auch mehrere Splaten/Zeilen nicht selektierbar sein, das ist egal, es wird immer die nächste zelle selektiert. Die nicht selektierbare spalte darf aber nicht die letzte spalte des grids sein ... sonst gibts ne
av. und shift+tab geht auch nicht.
Delphi-Quellcode:
type
TForm1 = class(TForm)
....
private
{ Private-Deklarationen }
Stgrid_key:boolean; //Zelle wurde per tastatur ausgewählt
stgrid_lastkey:char; //letzte gedrückte Taste
...
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
//Selektion per tastatur, letzte taste merken
Stgrid_key:=true;
stgrid_lastkey:=char(key);
end;
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//Selektion per mouse
Stgrid_key:=false;
stgrid_lastkey:=' ';
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
with (sender as Tstringgrid) do
begin
//spalte 4 immer überspringen
CanSelect:=Not (ACol=4);
//wenn Zelle durch key aktiviert wird-> nächste mögliche Zelle aktivieren, dann wird wieder selectCell aufgerufen und so weiter
if (Stgrid_key=true) and (canselect=false) then
begin
if (stgrid_lastkey=chr(vk_down)) and (arow+1<rowcount) then row:=arow+1;
if (stgrid_lastkey=chr(vk_up)) and (arow>1) then row:=arow-1;
if (stgrid_lastkey=chr(vk_Right)) or (stgrid_lastkey=chr(vk_TAB)) then
begin
if acol>=colcount then
begin
if arow<rowcount then
begin
col:=2;
row:=row+1;
end;
end
else col:=acol+1;
end;
if stgrid_lastkey=chr(vk_left) then
if acol=2 then
begin
col:=colcount;
if row>1 then row:=row-1;
end
else col:=acol-1;
stgrid_lastkey:=' ';
end;
end;
end;