Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TGrid multiselect? (https://www.delphipraxis.net/211224-tgrid-multiselect.html)

softtouch 17. Aug 2022 12:59

TGrid multiselect?
 
Ich kann einfach keine Eigenschaft des TGrid finde, welche multiselect von rows erlaubt, wie es eben mit dem VCL Grid und fast jedem 3rd. Party Grid möglich ist.
Wird das etwa gar nicht vom FNMX TGrid unterstützt?

Harry Stahl 17. Aug 2022 22:52

AW: TGrid multiselect?
 
Nein, da gibt es tatsächlich keine mitgelieferte Option.

Du könntest aber z.B. eine TCheckColumn verwenden, um eine Zeile auszuwählen.

Zusätzlich könnte man noch bei Bedarf in den OnPaint-Events selber etwas farblich hervorheben (da wo eine Zeile gecheckt ist).

softtouch 18. Aug 2022 05:58

AW: TGrid multiselect?
 
Zitat:

Zitat von Harry Stahl (Beitrag 1510257)
Nein, da gibt es tatsächlich keine mitgelieferte Option.

Du könntest aber z.B. eine TCheckColumn verwenden, um eine Zeile auszuwählen.

Zusätzlich könnte man noch bei Bedarf in den OnPaint-Events selber etwas farblich hervorheben (da wo eine Zeile gecheckt ist).

Danke, ich denke, dann wird mir wohl nichts anderes übrig bleiben, als doch wieder die TMS Komponenten zu nutzen. Ich wollte eigentlich alles diesmal komplett ohne 3rd. Party Komponenten erstellen.

Wie kann EMBA denn so eine wichtige Standard Funktion nicht einbauen.... unglaublich.

Edelfix 18. Aug 2022 07:17

AW: TGrid multiselect?
 
Bei uns wird per Doppelklick Multiselekt angeboten. Eventuell hilfreich.

Delphi-Quellcode:
procedure TSuchForm.GridDblClick(Sender: TObject);
begin
  if Grid.CellFont[0,Grid.Row].Style=[] then begin
     Grid.CellFont[0,Grid.Row].Style:=[fsBold];
     Grid.CellFont[0,Grid.Row].Color:=clRed;
     Grid.CellFont[0,Grid.Row].Size :=10;
  end else begin
     Grid.CellFont[0,Grid.Row].Style:=[];
     Grid.CellFont[0,Grid.Row].Color:=clBlack;
     Grid.CellFont[0,Grid.Row].Size :=10;
  end;
end;

TurboMagic 18. Aug 2022 21:38

AW: TGrid multiselect?
 
[QUOTE=softtouch;1510258]
Zitat:

Zitat von Harry Stahl (Beitrag 1510257)

Wie kann EMBA denn so eine wichtige Standard Funktion nicht einbauen.... unglaublich.

Schon mal geschaut, ob es dafür schon einen Feature Request in QP https://quality.embarcadero.comgibt?
Falls es keinen gibt bitte einen erfassen.

Grüße und Danke vorab

TurboMagic

Harry Stahl 19. Aug 2022 23:20

AW: TGrid multiselect?
 
Liste der Anhänge anzeigen (Anzahl: 2)
@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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz