Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   TStringGrid -[goRowSelect] wird nicht visualisiert (https://www.delphipraxis.net/185645-tstringgrid-%5Bgorowselect%5D-wird-nicht-visualisiert.html)

hoika 26. Jun 2015 16:34

TStringGrid -[goRowSelect] wird nicht visualisiert
 
Hallo,

folgender Code schaltet goRowSelect ein oder aus (per CheckBox).
Problem:
wird RowSelect eingeschaltet, wird brav die ganze Zeile markiert,
wird es ausgeschaltet, bliebt die Zeile markiert, bis man in eine Zelle klickt.
Danach ist nur diese eine Zelle markiert, wie erwartet.
BeginUpdate/EndUpdate, Refresh, Repaint, nichts hilft.

Das sollte für das TMS-TAdvStringGrid sein, aber auch das normale TStringGrid reagiert so.

Hat jemand eine Lösung?

Danke

Delphi-Quellcode:
  if CheckBox1.Checked then
  begin
    AdvStringGrid1.Options := AdvStringGrid1.Options-[goRowSelect];
    StringGrid1.Options := StringGrid1.Options-[goRowSelect];
  end
  else
  begin
    AdvStringGrid1.Options := AdvStringGrid1.Options+[goRowSelect];
    StringGrid1.Options := StringGrid1.Options+[goRowSelect];
  end;

Harry Stahl 26. Jun 2015 21:46

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Ergänze nach dem Click einfach wie folgt:
Delphi-Quellcode:
 for L := AdvStringGrid1.ColCount-1 downto AdvStringGrid1.FixedCols
      do AdvStringGrid1.Col := L;
Das funktioniert sowohl mit dem StringGrid als auch mit dem TMS-AdvStringGrid

Volker Z. 26. Jun 2015 21:50

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Hallo,

geht das in Deine Richtung?

Delphi-Quellcode:
procedure TForm1.SetRowSelect (const Value : Boolean; const Grid : TDrawGrid);
var
  l, t : Integer;
begin
  l := Grid.Col;
  t := Grid.Row;

  Grid.Selection := TGridRect (Rect (l, t, l, t));
  if Value then
    Grid.Options := Grid.Options + [goRowSelect]
  else
    Grid.Options := Grid.Options - [goRowSelect]
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  SetRowSelect (CheckBox1.Checked, StringGrid1);
  SetRowSelect (CheckBox1.Checked, AdvStringGrid1);
end;
Gruß

[EDIT]Kein roter Kasten[/EDIT]

Captnemo 27. Jun 2015 11:51

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Zitat:

Zitat von Harry Stahl (Beitrag 1306788)
Ergänze nach dem Click einfach wie folgt:
Delphi-Quellcode:
 for L := AdvStringGrid1.ColCount-1 downto AdvStringGrid1.FixedCols
      do AdvStringGrid1.Col := L;
Das funktioniert sowohl mit dem StringGrid als auch mit dem TMS-AdvStringGrid

Würde da nicht einfach nur
Delphi-Quellcode:
AdvStringGrid1.Col := AdvStringGrid1.FixedCols
reichen?
Da FixedCols ja die Anzahl der fixierten Spalten ist, würde diese Zahl als Index verwendet immer die erste Zelle innerhalb der Zeile selektieren. Warum erst von größten Spalte runterzählen?

idefix2 27. Jun 2015 18:18

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Weil col eine Property ist, bei deren Zuweisung noch andere Dinge passieren (z.B. eben markieren/Markierung löschen, wie hier gefragt - falls die Lösung so funktioniert :) )

Captnemo 28. Jun 2015 16:04

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Zitat:

Zitat von idefix2 (Beitrag 1306891)
Weil col eine Property ist, bei deren Zuweisung noch andere Dinge passieren (z.B. eben markieren/Markierung löschen, wie hier gefragt - falls die Lösung so funktioniert :) )

Soll das eine Erklärung sein, warum man nacheinander von der größten col her selektieren soll?

hoika 29. Jun 2015 07:00

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Hallo,

der Code von Harry klappt, danke!

Das hier klappt nicht, warum auch immer.
AdvStringGrid1.Col := AdvStringGrid1.FixedCols


Heiko

idefix2 29. Jun 2015 07:25

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Zitat:

Zitat von Captnemo (Beitrag 1306952)
Soll das eine Erklärung sein, warum man nacheinander von der größten col her selektieren soll?

In der anderen Richtung, von links nach rechts, würde es genauso funktionieren. Aber dann wäre eben am Ende die Zelle in der äussersten rechten Spalte selektiert und nicht die erste. Allem Anschein nach wird erst beim Selektieren einer Zelle die Zelle, die vorher selektiert war, deselektiert.

Captnemo 29. Jun 2015 11:26

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Okay, das so nicht ganz korrekt.
col:= selectiert die Column wohl nur, wenn diese nicht bereits selectiert ist (was aber bei der Option goRowSelect bereit der fall ist). Darum funktioniert das auch nicht, wenn man goRowSelect wieder auf False setzt, weil sich die Selection dabei nicht verändert, also alle Zellen der Row noch selektiert bleiben. Ist aber vorher nur eine Zelle selektiert, selektiert col:= diese sofort.

Richtig (oder richtiger) wäre dann aber
Delphi-Quellcode:
strngrd1.Selection:=TGridRect(Rect(strngrd1.FixedCols,strngrd1.Row,strngrd1.FixedCols,strngrd1.Row));
womit eben die erste Zelle der aktuellen Zeile selektiert wäre.
Kommt zwar am Ende das gleich bei raus, aber man muss nicht jeder Zelle der Zeile rückwärts selektieren.

idefix2 29. Jun 2015 12:38

AW: TStringGrid -[goRowSelect] wird nicht visualisiert
 
Zitat:

Zitat von Captnemo (Beitrag 1307035)
Okay, das so nicht ganz korrekt.
col:= selectiert die Column wohl nur, wenn diese nicht bereits selectiert ist (was aber bei der Option goRowSelect bereit der fall ist).

Das Problem ist ja nicht das Selektieren einer Zelle, das funktioniert, sondern, dass die bisher selektierten Zellen nicht automatisch deselektiert werden (bzw. dieses Deselektieren in der Bildschirmdarstellung nicht erkennbar ist), wenn goRowSelect ausgeschaltet wird.

Zitat:

Zitat von Captnemo (Beitrag 1307035)
Kommt zwar am Ende das gleich bei raus, aber man muss nicht jeder Zelle der Zeile rückwärts selektieren.

Ich gehe davon aus, dass du das nicht ausprobiert hast, sonst hättest du gesehen, dass das nicht der Fall ist (vermute ich einmal, ausprobiert habe ich es auch nicht). Das "rückwärts selektieren" macht man ja nicht, damit die Zellen der Reihe nach selektiert werden, sondern damit sie der Reihe nach ERKENNBAR deselektiert werden, wenn die nächste Zelle (links davon) selektiert wird.

Möglicherweise würde auch ein grid.invalidate helfen, mit dem Neuzeichnen nach Veränderungen ist das Stringgrid generell recht zurückhaltend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.
Seite 1 von 2  1 2      

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