Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TGrid multiselect?

  Alt 19. Aug 2022, 23:20
@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] = 'falsethen 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] = 'falsethen 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;
Miniaturansicht angehängter Grafiken
griddemo.jpg  
Angehängte Dateien
Dateityp: zip GridDemo.zip (93,9 KB, 4x aufgerufen)

Geändert von Harry Stahl (20. Aug 2022 um 12:03 Uhr)
  Mit Zitat antworten Zitat