Zwei TstringGrids parallel scrollen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
photor
Beiträge: 533
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Zwei TstringGrids parallel scrollen

Beitrag von photor »

Hallo Forum,

Ich brauche mal etwas Input zu TStringGrids.

Ich habe ein StringGrid "Grid_1", das neben der Titelzeile einige Zeilen mit Dateinamen enthält. Die Spalten (ca. 8) enthalten dann zugehörige Parameter, die zusammen verarbeitet werden sollen. Die Anzahl der Zeilen wird so typischerweise bei einigen wenigen bis ca. 50 betragen. Die Einträge von "Grid_2" kann ich aus einem File laden. Soweit so gut; das funktioniert soweit..

Um speziell einen Parameter (= Spalte) in verschiedenen Variationen rechnen zu können, wollte ich jetzt ein zweites StringGrid "Grid_2" mit der gleichen Anzahl an Zeilen (daneben) definieren, in dem verschiedene Sätze dieses Parameters definiert werden können. Die Anzahl der Zeilen sollte also der von "Grid_1" entsprechen; die Anzahl der Spalten variiert. Generell lässt sich "Grid_2" genauso definieren wie "Grid_1" auch (incl. laden des Inhalts aus einen File).

Um leichter den Überblick zu behalten, würde ich jetzt gerne beide Grids koppeln: wenn man das eine scrollt, sollte sich das andere parallel mitbewegen, so dass die zueinander gehörenden sichtbaren Zeilen jeweils auf gleicher Höhe stehen.

Ist das mit "Hausmitteln" (also ohne spezielle Komponenten) möglich? Wenn ja, wie könnte man das am einfachsten realisieren?

Für Ideen (oder auch Links) wäre ich dankbar.

Ciao,
Photor

Benutzeravatar
theo
Beiträge: 10997
Registriert: Mo 11. Sep 2006, 19:01

Re: Zwei TstringGrids parallel scrollen

Beitrag von theo »

Code: Alles auswählen

procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
 StringGrid2.TopRow:=StringGrid1.TopRow;
end;  
Tipp: Ohne Atemmaske bekommt das Gehirn mehr Sauerstoff... :lol:

Benutzeravatar
photor
Beiträge: 533
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Zwei TstringGrids parallel scrollen

Beitrag von photor »

Danke,

für den Code-Vorschlag. Werde ich mal probieren.

Ciao,
Photor

Mathias
Beiträge: 7012
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zwei TstringGrids parallel scrollen

Beitrag von Mathias »

Ich habe es gerade ausprobiert, was mich dabei verwundert, das dies nicht in eine rekursive Falle geratet.
Ich hatte mal was ähnliches mit ScrollBars gemacht, da musste ich vor dem umstellen OnScroll kurz auf nil stellen.

Code: Alles auswählen

procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
  WriteLn('change 1');
  StringGrid2.TopRow := StringGrid1.TopRow;
  StringGrid2.LeftCol := StringGrid1.LeftCol;
end;

procedure TForm1.StringGrid2TopLeftChanged(Sender: TObject);
begin
  WriteLn('change 2');
  StringGrid1.TopRow := StringGrid2.TopRow;
  StringGrid1.LeftCol := StringGrid2.LeftCol;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  y, x: int64;
begin
  y := Random(20);
  x := Random(20);
  WriteLn('Pos: ', x, 'x', y);
  StringGrid1.LeftCol := x;
  StringGrid1.TopRow := y;
end;   
Noch ein Schönheitsfehler hat es, die Scrollbar Position wird nicht exakt synchronisiert. TopRow und LeftCol bezieht sich nur auf ganze Kästchen und nicht auf einzelne Scrollpixel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Zwei TstringGrids parallel scrollen

Beitrag von fliegermichl »

Das mit dem Scrollen per Code ist wohl gar nicht so einfach.
Da wird ziemlich viel über Messages gemacht. Man kann allerdings die Scrollposition von Stringgrid1 ermitteln und diese in Stringgrid2 entsprechend anpassen.
Das hab ich hier mal über einen Button gemacht (Mangels eines Ereignisses über die Veränderung der Scrollposition).

Code: Alles auswählen

uses lclintf, lcltype, lmessages;

procedure TForm1.Button1Click(Sender : TObject);
var i : integer;
begin
  I:= GetScrollPos(StringGrid1.Handle, sb_Vert);				// Scrollposition von Stringgrid1 ermitteln
  SetScrollPos(StringGrid2.Handle, sb_Vert, i, true);				// Scrollposition von Stringgrid2 anpassen
  SendMessage(StringGrid2.Handle, LM_VScroll,MakeLong(SB_ThumbPosition,I),0);	// Inhalt von Stringgrid2 entsprechend der Scrollposition setzen
end;

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

Re: Zwei TstringGrids parallel scrollen

Beitrag von wp_xyz »

Warum müssen das überhaupt zwei Grids sein? Wenn die beiden synchron verlaufen sollen, dann wäre doch das Naheliegende, beide Datensätze im selben Grid darzustellen.

Sieben
Beiträge: 296
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: Zwei TstringGrids parallel scrollen

Beitrag von Sieben »

Mangels eines Ereignisses über die Veränderung der Scrollposition
Man könnte sich in den Message-Handler für WMVScroll einklinken.

Benutzeravatar
Ally
Beiträge: 288
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Zwei TstringGrids parallel scrollen

Beitrag von Ally »

Und hier noch ein Lösungsvorschlag:
Dateianhänge
project1.zip
(5.33 KiB) 89-mal heruntergeladen

Benutzeravatar
photor
Beiträge: 533
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Zwei TstringGrids parallel scrollen

Beitrag von photor »

wp_xyz hat geschrieben: So 31. Aug 2025, 13:27 Warum müssen das überhaupt zwei Grids sein? Wenn die beiden synchron verlaufen sollen, dann wäre doch das Naheliegende, beide Datensätze im selben Grid darzustellen.
Weil beide thematisch nur lose gekoppelt sind. Genau genommen ist das zweite nur eine Zusatzfunktion, die ich nur für den "Advanced User" zuschalten möchte (sonst nicht sichtbar). Und weil im zweiten quasi verschiedene Versionen für genau eine Spalte im ersten Grid gespeichert wird, die dann jeweils "ausgetauscht" wird. Das ist die Idee.

Ciao,
Photor

Benutzeravatar
Bullykiffer
Beiträge: 18
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

Re: Zwei TstringGrids parallel scrollen

Beitrag von Bullykiffer »

Hallo.
Ich kann mir jetzt unter "Lose gekoppelt" nicht so richtig was vorstellen,
aber ich hatte mal ein (eventuell) ähnliches Problem.
Letztendlich habe ich alles in einem TStringgrid untergebracht und habe dann je nach bedarf
dann die entsprechene (zusatz) Column entweder .visible:=true oder .visible:=false geschaltet.
Kann aber sein,das deine Anforderungen noch ganz andere sind,als es die meinen waren ;)

Cya Bullykiffer

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

Re: Zwei TstringGrids parallel scrollen

Beitrag von wp_xyz »

Genau. Oder du kannst je nach anzuzeigender Zusatzinformation das Grid neu aufbauen; die im ersten Beitrag genannten 50 Zeilen sollten keine Geschwindigkeitsbremse darstellen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6928
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zwei TstringGrids parallel scrollen

Beitrag von af0815 »

Der Knackpunkt ist das Laden der Dateien, das natürlich nur mit zwei Grids einfach geht. Macht man das in einem Grid, muss man es im Code erledigen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten