TStringGrid, künstlichen Scrollbalken erzeugen
-
- 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
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
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
- 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
Hi!
Rechnest Du viel mit den Daten oder sind die mehr readonly?
Im zweiten Fall würde ich einfach zwei StringGrids nehmen.
Winni
Rechnest Du viel mit den Daten oder sind die mehr readonly?
Im zweiten Fall würde ich einfach zwei StringGrids nehmen.
Winni
-
- 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
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
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
-
- Beiträge: 289
- 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
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...?
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...?
Re: TStringGrid, künstlichen Scrollbalken erzeugen
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.pjensen hat geschrieben: Di 21. Dez 2021, 19:07 Options.goRowSelect = True.
Ich habe eine blauen Scroll-Balken der jeweils ausgewählten Zeile.
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.
-
- 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
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...
...
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...
...
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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
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.
Man kann Selections zwar abfragen aber nicht verändern.
-
- 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
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
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
-
- Beiträge: 289
- 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
Mit PrepareCanvas ginge ganz grob zB so:
wobei FRowOffset der gewünschte Abstand der beiden Zeilen wäre. Und es sieht sogar 'richtig' aus...
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;
Zuletzt geändert von Sieben am Mi 22. Dez 2021, 10:34, insgesamt 2-mal geändert.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- 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
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.
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.
Re: TStringGrid, künstlichen Scrollbalken erzeugen
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) 76-mal heruntergeladen
-
- 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
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
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
-
- Beiträge: 289
- 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
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.
Re: TStringGrid, künstlichen Scrollbalken erzeugen
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.pjensen hat geschrieben: Do 23. Dez 2021, 15:14 Wofür ist das StringGrid1.Invalidate; in "StringGrid1Selection"?
Habe es auskommentiert: Keine Änderung erkennbar.
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.