Scrollbars bei BeginUpdate und EndUpdate

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

Moin,

Ich habe 2 StringGrids (einmal 9x9 und einmal 1x3) welche beide mit Grafiken belegt werden.
Da hatte ich das Problem, dass sie flackern, wenn man die Maustaste loslässt. Gefixt habe ich das indem ich beim SelectCell StringGrid1.BeginUpdate drin habe, bei MouseUp StringGrid1.EndUpdate.

Nur habe ich jetzt (bei Scrollbars in den Eigenschaften ist bei beides ssNone eingestellt) rechts und unten eine Scrollbar die keinen Effekt hat. Sobald ich die Scrollbar einmal anklicke verschwindet sie. Die Größe des StringGrids ist auf die Anzahl der Zellen und deren Größe angepasst, es wird also alles gezeigt (bei dem 9x9 haben die Zellen Maße von 80x80 und das StringGrid ist insgesamt 720x720, das 1x3 StringGrid hat Zellen mit 50x50 und ist insgesamt 50x150).

Wäre gut, wenn hier jemand einen Tipp hat, entweder um das Flackern (genau genommen eine Bildaktualisierung bei der aber alle Zellen kurz weiß werden) loszuwerden oder damit die Scrollbars nicht erscheinen.

Hier mal noch der Quellcode für das 1x3 StringGrid

Code: Alles auswählen

procedure TForm2.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StringGrid1.EndUpdate;
  Timer3.Enabled:=true; //Markiert die ausgewählte Zelle farbig und färbt die anderen Zellen in der Ausgangsfarbe
end;

procedure TForm2.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
begin
  StringGrid1.BeginUpdate;
  Schwierigkeitsgrad:=aCol;
end;
Mfg

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von Aidex »

Moin!

Das BeginUpdate und EndUpdate in unterschiedlichen Ereignissen solltest du unbedingt loswerden,
denn wenn die Ereignisse unterschiedlich oft oder in falscher Reihenfolge feuern, stürzt es den Updating-Zähler ins Chaos.

Ich würde vermuten, dass das Flackern dadurch entsteht, dass die Zelle 2x oder 3x umgefärbt wird und vielleicht jedes Mal neu gezeichnet wird,
nämlich einmal beim Markieren, dann ggf. beim Umfärben in die Ausgangsfarbe, und zuletzt in "farbig".
Könntest du die "farbig"-Machung nicht schon in SelectCell() einbauen und auf Timer3 ganz verzichten?

Wenn du dann beim Umfärben mit Begin/EndUpdate arbeitest: EndUpdate hat einen Refresh-Parameter (default true),
den ich mal testweise auf .EndUpdate(false) setzen würde.

Grüße, Jörg

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

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von theo »

Hast du es mal mit der Eigenschaft "DoubleBuffered" probiert?
Oder mit einem DrawGrid?

ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

theo hat geschrieben:
Sa 30. Jan 2021, 11:15
Hast du es mal mit der Eigenschaft "DoubleBuffered" probiert?
Oder mit einem DrawGrid?
Noch nicht, ich probier es heute Abend (sofern ich dran denke) nochmal damit, aber ich hab eine Lösung gefunden. Die Scrollbars treten nur auf, wenn das BeginUpdate oder das EndUpdate bereits beim Laden der Form aktiviert wird. Ich hab jetzt das BeginUpdate in MouseDown drin und das EndUpdate in einem Timer der im SelectCell aktiviert wird drin. Da das, wieso auch immer, nicht durch das SelectCell beim Laden der Form aufgerufen wird, läuft es.

ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

Aidex hat geschrieben:
Sa 30. Jan 2021, 06:47
Moin!

Das BeginUpdate und EndUpdate in unterschiedlichen Ereignissen solltest du unbedingt loswerden,
denn wenn die Ereignisse unterschiedlich oft oder in falscher Reihenfolge feuern, stürzt es den Updating-Zähler ins Chaos.

Ich würde vermuten, dass das Flackern dadurch entsteht, dass die Zelle 2x oder 3x umgefärbt wird und vielleicht jedes Mal neu gezeichnet wird,
nämlich einmal beim Markieren, dann ggf. beim Umfärben in die Ausgangsfarbe, und zuletzt in "farbig".
Könntest du die "farbig"-Machung nicht schon in SelectCell() einbauen und auf Timer3 ganz verzichten?

Wenn du dann beim Umfärben mit Begin/EndUpdate arbeitest: EndUpdate hat einen Refresh-Parameter (default true),
den ich mal testweise auf .EndUpdate(false) setzen würde.

Grüße, Jörg
Ich schau später nochmal drüber ob die überhaupt unterschiedlich oft getriggert werden können. Das Programm an sich ist ein Abklatsch von CandyCrush, daher ist die Bedienung des StringGrids nur auf Zellen klicken. Da glaub ich eher weniger dass das unterschiedlich oft aufgerufen werden kann. Das flackern entsteht dadurch, dass das StringGrid komplett neu gezeichnet wird (hab ich aber auch erst gesehen als ich eine SlowMotion Aufnahme vom Monitor in 960 FPS gemacht habe). Ich schau aber auch nochmal ob die Parameteränderung was bewirkt. Vielen Dank aufjedenfall, auch wenn ich inzwischen (in der anderen Antwort kurz erklärt) den Fehler und eine Lösung gefunden habe.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von m.fuchs »

ProfiNoob hat geschrieben:
Sa 30. Jan 2021, 14:46
Das Programm an sich ist ein Abklatsch von CandyCrush, daher ist die Bedienung des StringGrids nur auf Zellen klicken.
Dann wäre das DrawGrid wohl sicherlich besser als das StringGrid.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

m.fuchs hat geschrieben:
Sa 30. Jan 2021, 15:25
ProfiNoob hat geschrieben:
Sa 30. Jan 2021, 14:46
Das Programm an sich ist ein Abklatsch von CandyCrush, daher ist die Bedienung des StringGrids nur auf Zellen klicken.
Dann wäre das DrawGrid wohl sicherlich besser als das StringGrid.
An sich ja, aber wir haben ein StringGrid mit Zahlen befüllt um die anderen Funktionen zu ermöglichen (also löschen von 3 gleichen benachbarten Zellen und so). Ich weiß jetzt nicht ob es mit einem DrawGrid funktioniert hätte, außerdem basieren die Grundlagen von dem Programm komplett aus den Sachen aus dem Unterricht und da hatten wir nicht sonderlich viel.

ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

theo hat geschrieben:
Sa 30. Jan 2021, 11:15
Hast du es mal mit der Eigenschaft "DoubleBuffered" probiert?
Oder mit einem DrawGrid?
Also, das DoubleBuffered ändert leider nichts. Und auf ein DrawGrid umstellen wäre jetzt etwas aufwendig. Zudem ist das 9x9 StringGrid genau genommen in 2 unterteilt, das eine gibt die Zahlen die verarbeitet werden vor, das andere besitzt die Grafiken. Damit es läuft hab ich lange gebraucht, da will ich nichts riskieren.

ProfiNoob
Beiträge: 9
Registriert: So 10. Jan 2021, 21:31

Re: Scrollbars bei BeginUpdate und EndUpdate

Beitrag von ProfiNoob »

Aidex hat geschrieben:
Sa 30. Jan 2021, 06:47
Moin!

Das BeginUpdate und EndUpdate in unterschiedlichen Ereignissen solltest du unbedingt loswerden,
denn wenn die Ereignisse unterschiedlich oft oder in falscher Reihenfolge feuern, stürzt es den Updating-Zähler ins Chaos.

Ich würde vermuten, dass das Flackern dadurch entsteht, dass die Zelle 2x oder 3x umgefärbt wird und vielleicht jedes Mal neu gezeichnet wird,
nämlich einmal beim Markieren, dann ggf. beim Umfärben in die Ausgangsfarbe, und zuletzt in "farbig".
Könntest du die "farbig"-Machung nicht schon in SelectCell() einbauen und auf Timer3 ganz verzichten?

Wenn du dann beim Umfärben mit Begin/EndUpdate arbeitest: EndUpdate hat einen Refresh-Parameter (default true),
den ich mal testweise auf .EndUpdate(false) setzen würde.

Grüße, Jörg
So, sie können in der einen Form mit dem 9x9 StringGrid unterschiedlich oft getriggert werden, wenn ich es aber ändere sodass ein begonnes Update immer beendet wird, flackert wieder alles. In der anderen können sie nicht unterschiedlich oft getriggert werden, wird dort also keine Probleme geben. Was du mit dem umfärben und dem "farbig"-Machen in SelectCell meinst, verstehe ich nicht, dafür reichen meine Kentnisse über Lazarus nicht. Somit bringen mir die Parameter für EndUpdate leider auch nichts.

Antworten