TStringGrid, künstlichen Scrollbalken erzeugen

Rund um die LCL und andere Komponenten
Antworten
pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von pjensen »

Hallo,


ich lese 2 verschiedene Dateien mit jeweils 6 Daten-Zeilen nacheinander in ein Stringgrid wie folgt ein:

Zeile 1...6: Datei 1.
Zeile 7 + 8: leer
Zeile 9...14: Datei 2
Zeile 15: Leer
Zeile 16: Ergebniszeile.

Soweit funktioniert das. Wenn ich auf Zeile 1 bin, wird Zeile 1 mit Zeile 9 verglichen und das Ergebnis wird in Zeile 16 eingetragen (oder wenn ich auf Zeile 2 bin, wird Zeile 2 mit Zeile 10 verglichen und das Ergebnis wird in Zeile 16 eingetragen, usw.).

Options.goRowSelect = True.
Ich habe eine blauen Scroll-Balken der jeweils ausgewählten Zeile.


Im OnAfterSelection-Event
- begrenze das Scrollen auf die ersten 6 Zeilen.
- berechen ich die Ergebnis und trage es in Zeile 16 ein.

Meine Frage: Wie erstelle ich einen zweiten Scrollbalken?

Wenn der Originlal-Scrollbalken auf Zeile 1 steht, soll ein zweiter Scroll-Balken auf Zeile 9 stehen.
Wenn der Originlal-Scrollbalken auf Zeile 2 steht, soll ein zweiter Scroll-Balken auf Zeile 10 stehen.
usw.


Gruß,
Peter

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von Winni »

Hi!

Rechnest Du viel mit den Daten oder sind die mehr readonly?

Im zweiten Fall würde ich einfach zwei StringGrids nehmen.

Winni

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von pjensen »

Das Rechnen ist eigentlich trivial, nur die 4 Grundrechenarten.
2 Grids ginge natürlich auch, aber da müsste ich dann den Scrollbalken des 2.ten Grids mit dem Scrollbalken des ersten grids mitführen.

Ist es so kompliziert, einen künstlichen "Scrollbalken" zu erzeugen? Ich denke, dass es eher einfach ist und ich nur nicht drauf komme...

Gruß,
Peter

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von Sieben »

Schau dir mal TCustomGrid.DrawRow und TCustomDrawGrid.DrawFocusRect an, so ganz trivial ist das nicht. Da scheint es mir weit einfacher, zwei Grids zu synchronisieren.

Edith meint, vielleicht könntest du auch OnPrepareCanvas wie hier beschrieben nutzen, um zB die Schrift oder den Hintergund der Zellen in der zweiten hervorzuhebenden Zeile einzufärben. Ob das dann aber so aussieht, wie du dir das vorstellst...?

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von wp_xyz »

pjensen hat geschrieben:
Di 21. Dez 2021, 19:07
Options.goRowSelect = True.
Ich habe eine blauen Scroll-Balken der jeweils ausgewählten Zeile.
Scroll-Balken? Solche Wörter tragen zur Verwirrung bei: Scrollbalken (= Scrollbar) ist für mich der Balken rechts und/oder unten mit dem Greifer, so dass man durch eine lange/breite Tabelle scrollen kann.
Was du mit goRowSelect einstellst, ist die Markierung der Zeile mit dem aktuellen Cursor.

Wenn du den RangeSelectMode des Grid auf rsmMulti stellst (und die Option goRowSelect aktiv hast), dann kannst du mit CTRL+Click mehrere Zeilen zusätzlich markieren. Geht aber, wenn ich mich recht erinnere, nur mit der Maus.

Wenn du die Zeilen ohne Maus, nur per Code, hervorheben willst, dann nimm das OnPrepareCanvas-Event. Das wird kurz vor der Ausgabe einer Zelle aufgerufen, und du kannst der Paint-Routine hier noch andere Zeichenparameter unterjubeln.

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von pjensen »

Stimmt, Scroll-Balken/Bar ist verwirrend.

Wenn z.B. alle Zellen in Zeile 1 higlighted sind, dann sollen alle Zellen in Zeile 9 auch highlighted sein.
Oder wenn alle Zellen in Zeile 2 higlighted sind, dann sollen alle Zellen in Zeile 10 auch highlighted sein.

Ich versuche das seit geraumer Zeit im OnPrepareCanvas-Event hinzubekommen. Irgendwie stehe ich auf dem Schlauch...

...

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von fliegermichl »

Ich hab das grad mal durchgespielt. Die Selections lassen sich tatsächlich nicht per Code anpassen.

Man kann Selections zwar abfragen aber nicht verändern.

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von pjensen »

Geht nicht so einfach. Aha!!

Habs jetzt eben mal mit 2 Grids ausprobiert. Die Lösung ist lächerlich einfach:

Im OnAfterSelection bei Grid1 einfach:
SGrid2.row:=Sgrid1.Row;

Und vice versa im Grid2.

Funktioniert auf Anhieb!

Danke Euch Allen!!

Gruß,
Peter

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von Sieben »

Mit PrepareCanvas ginge ganz grob zB so:

Code: Alles auswählen

procedure TfrmMain.StringGrid1PrepareCanvas(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState);
begin
  if (aRow = StringGrid1.Row + FRowOffset) and (aCol >= StringGrid1.FixedCols) then
    StringGrid1.Canvas.Brush.Color := clHighLight;
end; 

procedure TfrmMain.StringGrid1AfterSelection(Sender: TObject; aCol, aRow: Integer);
begin
  StringGrid1.Invalidate;
end;
wobei FRowOffset der gewünschte Abstand der beiden Zeilen wäre. Und es sieht sogar 'richtig' aus...
Zuletzt geändert von Sieben am Mi 22. Dez 2021, 10:34, insgesamt 2-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von fliegermichl »

Ja EINE Zeile selektieren geht per Code und auch mehrere, da man per Selection ein Rectangle übergeben kann.

Was nicht per Code geht ist, Zeile 1 und Zeile 10 zu selektieren. Mit der Maus geht es.

Edit: Man kann sich eine abgeleitete Klasse definieren und die Methode AddSelection public machen.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von wp_xyz »

Auch wenn du eine Lösung mit zwei Grids gefunden hast, will ich auf deine ursprüngliche Anfrage mit zwei Markierungsbalken im selben Grid zurückkommen, weil du mit dem OnPrepareCanvas-Event nicht klargekommen bist. Im Anhang findest du dazu eine Lösung.
Dateianhänge
sum_of_rows.zip
(2.35 KiB) 59-mal heruntergeladen

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von pjensen »

Hallo,

Programm läuft jetzt mit 2 Stringgrids, alles OK.

@wp_xyz
Vielen Dank für das Beispiel. Jetzt hab ich das verstanden...

Wofür ist das StringGrid1.Invalidate; in "StringGrid1Selection"?
Habe es auskommentiert: Keine Änderung erkennbar.

Gruß,
Peter

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von Sieben »

Das kommt immer ein bisschen auf das OS bzw das Widgetset an - mit Gtk2 hat's das bei mir gebraucht, mit zB Windows evendöll nicht.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringGrid, künstlichen Scrollbalken erzeugen

Beitrag von wp_xyz »

pjensen hat geschrieben:
Do 23. Dez 2021, 15:14
Wofür ist das StringGrid1.Invalidate; in "StringGrid1Selection"?
Habe es auskommentiert: Keine Änderung erkennbar.
StringGrid.Invalidate ist ähnlich wie Repaint und bewirkt ein Neuzeichnen des Grid, allerdings nicht sofort, sondern es wird der Befehl zum Neuzeichnen in der Warteschlange abgelegt. Hat den Vorteil, dass wenn mehrere solche Aufforderungen nacheinander durchgeführt werden sollen, dies nur einmal ausgeführt wird.

Du hast recht: eigentlich kann man auf das Invalidate hier verzichten. Ich habe aber gesehen, dass wenn ich in einer Zeile die Maus längere Zeit gedrückt habe, die entsprechende Zeile in dem anderen Block nicht sofort aktualisiert wird, was ich irritierend fand. Ist zumindest bei Windows so.

Antworten