Wie setzt man die Selected Row einer TStringgrid richtig ? [Gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Wie setzt man die Selected Row einer TStringgrid richtig ? [Gelöst]

Beitrag von corpsman »

Hallo Zusammen,

Inspiriert durch Joh's beitrag unter: viewtopic.php?f=18&t=15278 habe ich meine Anwendung erweitert und sortiere mein TStringgrid nach einer neu Befüllung wieder gleich.

Dann dachte ich mir, wieso nur neu sortieren, wäre es nicht Cool, wenn der Code auch gleich den Datensatz anwählt, welcher vorher angewählt war (insofern es ihn noch gibt)...

Und nun wird es strange hier erst mal mein (sehr vereinfachter) Code, der das selbe verhalten aufweist:

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Var
  j, i: Integer;
  p: String;
Begin
  j := StringGrid1.SortColumn;
  // Spalte 1 hat nur Primärschlüssel, also reicht es sich diesen Wert zu speichern
  p := '';
  If StringGrid1.Selection.Top <> -1 Then Begin
    p := StringGrid1.Cells[1, StringGrid1.Selection.Top];
  End;
  StringGrid1.RowCount := 10;
  RandSeed := 0;
  For i := 0 To 1000 Do Begin
    StringGrid1.Cells[random(100) Mod StringGrid1.ColCount, random(100) Mod StringGrid1.RowCount] := inttostr(random(100));
  End;
  If j <> -1 Then Begin
    StringGrid1.SortColRow(true, j);
  End;
  // Suchen ob der Primärschlüssel im Stringgrid noch vorhanden ist und diesen dann erneut auswählen.
  If p <> '' Then Begin
    For j := 1 To StringGrid1.RowCount - 1 Do Begin
      If StringGrid1.cells[1, j] = p Then Begin
        StringGrid1.Selection := rect(0, j, StringGrid1.ColCount - 1, j);
        break;
      End;
    End;
  End;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  Button1Click(Nil);
End
Um das Verhalten nach stellen zu können, die im Anhang befindliche Demo.zip laden und starten.
Dann einmal auf "Path" klicken um das Stringgrid nach der Spalte Path zu sortieren, dann selektiert man mit der Maus die Zeile mit der 44 in Path. Ein Klick auf den Recreate Button löst nun den Fehler aus:
Error.png
Error.png (34.19 KiB) 4062 mal betrachtet
Wie man sehen kann, wird die Zeile mit der 44 korrekt angewählt, aber die 66 als einzelne "Zelle" eben auch, woran liegt das ? es sind auch immer unterschiedliche Zellen.

=> Ich vermute, wie beim letzten mal auch, dass mein Code hier nicht so ist wie die Entwickler der LCL das geplant haben. Doch es gibt keine Routine "SelectRow" oder sowas, ..

Wie würdet ihr das lösen ? Hat jemand eine Variante die im Obigen Szenario funktioniert ?
Dateianhänge
Demo.zip
(2.36 KiB) 53-mal heruntergeladen
Zuletzt geändert von corpsman am So 7. Jan 2024, 12:36, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie setzt man die Selected Row einer TStringgrid richtig ?

Beitrag von corpsman »

Oh man, hätte ich mal besser gegoogelt. Die Lösung ist denkbar einfach

Code: Alles auswählen


Procedure TForm1.Button1Click(Sender: TObject);
Var
  j, i: Integer;
  p: String;
Begin
  j := StringGrid1.SortColumn;
  // Spalte 1 hat nur Primärschlüssel, also reicht es sich diesen Wert zu speichern
  p := '';
  If StringGrid1.Selection.Top <> -1 Then Begin
    p := StringGrid1.Cells[1, StringGrid1.Selection.Top];
  End;
  StringGrid1.RowCount := 10;
  RandSeed := 0;
  For i := 0 To 1000 Do Begin
    StringGrid1.Cells[random(100) Mod StringGrid1.ColCount, random(100) Mod StringGrid1.RowCount] := inttostr(random(100));
  End;
  If j <> -1 Then Begin
    StringGrid1.SortColRow(true, j);
  End;
  // Suchen ob der Primärschlüssel im Stringgrid noch vorhanden ist und diesen dann erneut auswählen.
  If p <> '' Then Begin
    For j := 1 To StringGrid1.RowCount - 1 Do Begin
      If StringGrid1.cells[1, j] = p Then Begin
//        StringGrid1.Selection := rect(0, j, StringGrid1.ColCount - 1, j);
          StringGrid1.Row := j;              // So gehts richtig
        break;
      End;
    End;
  End;
End;
--
Just try it

Antworten