@Edelfix: Was für ein Grid verwendest Du da? Wohl kein FMX TGrid, denn die Eigenschaft Cellfont sagt mir nichts. Davon abgesehen würde ich bei einem Doppelklick eher eine Ausführung einer Aktion erwarten und nicht eine Selektion, das ist eher ungewöhnlich.
Dann doch z.B. lieber mit Strg+Links Click eine Zeile an oder abwählen.
Kann man natürlich auch ohne die CheckColum machen. Das Boolsche Array muss man aber eben mitführen und der Anzahl der Zeilen anpassen.
Beim StringGrid kann man selber das Grid nehmen, um den Checkstatus zu managen.
Habe anliegend mal kurz ein Minidemo erstellt, das zeigt einmal für TGrid und TSTringGrid die Selektion per Checkbox und Alternativ mit Strg+Links-Click. Das könnte man bei Bedarf natürlich auch noch auf Shift+Links-Klick prüfen und erweitern, um Bereiche zu selektieren.
Ergänzender Hinweis: Um Strg+Shift in den Gridevents abfragen zu können, habe ich die OnMouseUp-Events manuell reingehängt.
Die Checkzeichen-Symbole im Header-Text sind einfach
Unicode-Zeichen.
Siehe anliegenden Screenshot und Demoprojekt (nur Source, keine Exe).
Nachtrag zum hochgeladenen Demo: Die Prüfung beim StringGrid-Demo, ob StrG+Klick und CellClick zusammentreffen (dann würden Sie sich gegenseitig aufheben) hätte ich nicht in de CellClick-Event machen müssen, sondern im sgMouseUp-Event.
Richtig sähen die beiden Events dann so aus:
Delphi-Quellcode:
procedure TF_Main.sGridCellClick(const Column: TColumn; const Row: Integer);
var
sg: TStringGrid; b: String;
begin
if Column.Parent.parent is TStringGrid then begin
sg := TStringGrid (Column.Parent.parent);
// To avoid same time use of clicking CheckColumn and using Strg+LeftKick
//if sg.Col = chk2.Index then exit; // nicht hier...
if Column is TCheckColumn then begin
if sg.cells[column.Index, Row] = 'false' then begin
sg.cells[column.Index, Row] := 'true';
end else begin
sg.cells[column.Index, Row] := 'false';
end;
end;
end;
sg.BeginUpdate;
sg.EndUpdate;
end;
procedure TF_Main.sGridMouseUp(Sender: TObject; Button: TMouseButton; shift: TShiftState; x, y: single);
var
sg: TSTringGrid;
begin
if ssCtrl in shift then begin
if Sender is TStringGrid then begin
sg := TStringGrid (Sender);
if sg.Col = chk2.Index then exit; // ... sondern hier
if sg.cells[chk2.Index, sg.row] = 'false' then begin
sg.cells[chk2.Index, sg.row] := 'true';
end else begin
sg.cells[chk2.Index, sg.row] := 'false';
end;
sg.BeginUpdate;
sg.EndUpdate;
end;
end;
end;