Hallo
Eine Möglichkeit wäre folgende (nur für die Zeilen implementiert, analog funktioniert's beim Verschieben einer Spalte):
1. goRowMoving nur dann aktivieren, falls sich der Maus über Row > 1 befindet.
2. falls zur Row 1 verschoben wird, Operation wieder rückgängig machen.
Delphi-Quellcode:
// Zugriff auf protected MoveColumn, MoveRow verschaffen
type
TMyGrid = class(TStringGrid)
public
procedure MoveColumn(FromIndex, ToIndex: Longint);
procedure MoveRow(FromIndex, ToIndex: Longint);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TMyGrid.MoveColumn(FromIndex, ToIndex: Integer);
begin
inherited;
end;
procedure TMyGrid.MoveRow(FromIndex, ToIndex: Integer);
begin
inherited;
end;
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
ACol, ARow: Integer;
begin
// goRowMoving nur dann aktivieren, falls sich der Maus über Row > 1 befindet.
with Sender as TStringGrid do
begin
MouseToCell(X,Y, ACol, ARow);
if (ARow > 1) then
Options := Options + [goRowMoving, goColMoving]
else
Options := Options - [goRowMoving, goColMoving];
end;
end;
procedure TForm1.StringGrid1RowMoved(Sender: TObject; FromIndex,
ToIndex: Integer);
begin
// falls zur Row 1 verschoben wird, Operation wieder rückgängig machen.
if ToIndex = 1 then
TMyGrid(StringGrid1).MoveRow(ToIndex, FromIndex);
end;
(Ist zwar etwas unschön aber funktioniert)