ScrollBox Absturz in der Designphase

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ScrollBox Absturz in der Designphase

Beitrag von wp_xyz »

siro hat geschrieben:
Mi 24. Aug 2022, 04:11
InflateRect(R, GridSizeX, GridSizeY);
vergrössert nach "beiden" Seiten, wir benötigen nur eine Seite (rechts und unten)
tut aber keinem weh, ergibt lediglich einen unsichtbaren GridPoint mehr.

habe es erfolgreich ausprobiert mit:
inc(r.Right ,GridSizeX);
inc(r.Bottom,GridSizeY);
Ja, ich wollte mit den Code-Zeilen knausern... Aber sehr kompakt wäre auch das Folgende:

Code: Alles auswählen

    // paint points
    if ShowGrid then
    begin
      ADDC.Canvas.Pen.Color := GridColor;
      ADDC.Canvas.Pen.Width := 1;
      ADDC.Canvas.Pen.Style := psSolid;
      P := TWinControlAccess(AWinControl).GetClientScrollOffset;
      R := TWinControlAccess(AWinControl).ClientRect;
      R.BottomRight := R.BottomRight + Point(GridSizeX, GridSizeY);
      OffsetRect(R, P.X div GridSizeX * GridSizeX, P.Y div GridSizeY * GridSizeY); 
      DrawGrid(ADDC.Canvas.Handle, R, GridSizeX, GridSizeY);
    end;
Interessant wäre noch die Frage, was alles von der Änderung betroffen ist. Aber eine Suche über dem ganzen Lazarus-Verzeichnis, wo überall diese DrawGrid-Prozedur aufgerufen wird, liefert nur das TScrollingWinControl, also den Vorfahren von TScrollbox, T(Custom)Frame und T(Custom)Form. GetLogicalClientRect wird intern von TWinControl und einigen Sparta-Units verwendet - aber das haben wir ja gar nicht verändert, kann also kein Problem machen. Daher bin ich ziemlich zuversichtlich, dass die Änderung in Ordnung ist.

Ich schreibe mal einen Bug-Report, um das alles zu dokumentieren, und lade dann die Änderung ins Repository, falls nicht doch noch Überraschungen kommen.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ScrollBox Absturz in der Designphase

Beitrag von siro »

gefällt mir gut, das kannte ich auch noch nicht:

R.BottomRight := R.BottomRight + Point(GridSizeX, GridSizeY);

Ich denke auch langsam, dass es keine Nebeneffekte geben dürfte.

Übrigens hab ich das Suchen in mehreren Dateien und Unterordnern mit NotePad++ gemacht,
ich wuste bis eben garnicht, das so etwas in Lazarus integriert ist :oops:
Im Menü "Suchen" in Dateien suchen :lol:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: ScrollBox Absturz in der Designphase

Beitrag von wp_xyz »

siro hat geschrieben:
Mi 24. Aug 2022, 10:50
das kannte ich auch noch nicht:
R.BottomRight := R.BottomRight + Point(GridSizeX, GridSizeY);
Habe selbst erst vor kurzem gelernt, dass eine Menge Operatoren für TPoint überladen werden, darunter eben auch das "plus":

Code: Alles auswählen

type 
  TPoint = record
       ...
       class operator = (const apt1, apt2 : TPoint) : Boolean;
       class operator <> (const apt1, apt2 : TPoint): Boolean;
       class operator + (const apt1, apt2 : TPoint): TPoint;
       class operator - (const apt1, apt2 : TPoint): TPoint;
       class operator := (const aspt : TSmallPoint) : TPoint;
       ...
   end; 
siro hat geschrieben:
Mi 24. Aug 2022, 10:50
Ich denke auch langsam, dass es keine Nebeneffekte geben dürfte.
Habe gerade mit älteren Versionen gespielt, und siehe da: Unter Laz 1.4.4 gab es den Fehler noch nicht; und da steht auch im TDesigner.PaintClientGrid beim Aufruf von DrawGrid als Argument "ClientRect" (nicht das "TWinControlAccess(AWinControl).GetLogicalClientRect" von heute). Ich habe dann alle SVN-Commit-Notes durchgesehen und bin auf den Eintrag vom 13.7.2015 gestoßen: "Bug fix for DrawGrid. Use LogicalClientRect instead of ClientRect. r49385 from free-sparta branch by Maciej Izak.", und hier wird auch das AWinControl.ClientRect durch das TWinControlAccess(AWinControl).GetLogicalClientRect ausgetauscht.

Maciej Izak hat damals die Sparta-Units (SpartaDockedFormEditor) ins Projekt gebracht. Ich verwende das nicht, aber angeblich ist heute der SpartaDockedFormEditor ziemlich buggy, nachdem sich Maciej zurückgezogen hat, und wird allmählich durch Michl's DockedFormEditor ersetzt. Dennoch wäre die Frage: Haben unsere Änderungen einen Einfluss auf den SpartaDockedFormEditor?

[EDIT]
Habe eben den SpartaDockedFormEditor vorübergehend installiert, es ist mir nichts negatives aufgefallen, was mit dem DrawGrid zusammenhängen könnte.
Zuletzt geändert von wp_xyz am Do 25. Aug 2022, 09:25, insgesamt 3-mal geändert.

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

Re: ScrollBox Absturz in der Designphase

Beitrag von wp_xyz »

Als Alternativlösung hatte ich noch die Idee, mit Clipping zu arbeiten (IntersectClipRect), aber das bringst nichts (oder nicht viel), weil zumindest die Punkte, die dann letztendlich nicht gezeichnet werden dürfen, dennoch berechnet werden müssen.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ScrollBox Absturz in der Designphase

Beitrag von siro »

Hallo wp_xyz,
hast ja wirklich noch mal viel Zeit in die Problematik gesteckt, das finde ich bewundernswert.
Mir geht das auber auch meist so, wenn etwas nicht korrekt läuft, möchte ich auch die Ursache finden.

Welche Funktion nun wirklich das "korrekte" ClientRect liefert ist irgendwie nicht ganz eindeutig.
Aber wenn wir das nun selbst berechnen anhand von ClientWidth und Position sollte das eindeutig sein.

Jetzt noch mit Clipping anzufangen halte ich für keine gute Idee.
Simpel und überschaubar sollte es sein und ich denke das haben wir doch auch gut hinbekommen.
Ob jetzt ein oder 2 GridPixel mehr im unsichtbaren gezeichnet werden (bedingt z.B. durch die Breite der ScollBlken selbst)
sehe ich als kein Problem, zumal das alles nur während der Designphase passiert.
Problematisch war halt nur, dass er unnötigerweise zehntausende von Pixel verarbeitet hatte.

Erstaunlich ist auch, dass es ja anscheinend schon mal funktioniert hatte, wenn ich das richtig verstanden habe.
Das wurde also "verschlimmbessert" :roll:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: ScrollBox Absturz in der Designphase

Beitrag von wp_xyz »

Hab das jetzt, nach kleinen Änderungen, committet:

Code: Alles auswählen

function RoundToMultiple(AValue, ABasis: Integer): Integer; inline;
begin
  Result := AValue div ABasis * ABasis;
end;

procedure TDesigner.PaintClientGrid(AWinControl: TWinControl;
  aDDC: TDesignerDeviceContext);
...
    // paint points
    if ShowGrid then
    begin
      ADDC.Canvas.Pen.Color := GridColor;
      ADDC.Canvas.Pen.Width := 1;
      ADDC.Canvas.Pen.Style := psSolid;
      P := TWinControlAccess(AWinControl).GetClientScrollOffset;
      R := AWinControl.ClientRect;
      R.BottomRight := R.BottomRight + Point(GridSizeX, GridSizeY);
      OffsetRect(R, RoundToMultiple(P.X, GridSizeX), RoundToMultiple(P.Y, GridSizeY));
      DrawGrid(ADDC.Canvas.Handle, R, GridSizeX, GridSizeY);
    end;
siro hat geschrieben:
Do 25. Aug 2022, 09:48
Erstaunlich ist auch, dass es ja anscheinend schon mal funktioniert hatte, wenn ich das richtig verstanden habe.
Das wurde also "verschlimmbessert" :roll:
Das ist der Lauf der Dinge. Wenn Software einen gewissen Grad an Fehlerfreiheit erreicht hat, kann man sie nicht mehr verbessern. Mit jedem behobenen Fehler besteht die Gefahr, dass man einen (oder mehrere!) neue(n) Fehler einbaut. 100 % Fehlerfreiheit gibt es nur in den Plänen des Managements.

Antworten