ScrollBox Absturz in der Designphase
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
ScrollBox Absturz in der Designphase
Hallöchen,
ich habe einen reproduzierbaren Absturz bei der Verwendung der ScrollBox schon während der Designphase,
kann das evtl. mal jemand bitte überprüfen ?
Neue Anwendung:
Ich setzte eine Scrollbox aufs Formular
Nun stelle ich im Objectinspektor ein
VertScrollBar:
Range: 10000
HorzScrollBar:
Range: 10000
wenn ich die Komponente nun schieben will, wars das.......
auch mit Range 5000 geht das schon nicht mehr.
die Komponente verschwindet irgendwie...
Lazarus 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_64-win64-win32/win64
übrigens habe ich seit der letzen Version immer wieder mal diese merkwürdigen "großen, pixeligen Fonts" beim Starten von Lazarus.
Kurz danach ist aber alles okay. Vielleicht hängt es damit zusammen ? sollte ich evtl. alles neu installieren ?
mit schwitzenden Grüßen
Siro
ich habe einen reproduzierbaren Absturz bei der Verwendung der ScrollBox schon während der Designphase,
kann das evtl. mal jemand bitte überprüfen ?
Neue Anwendung:
Ich setzte eine Scrollbox aufs Formular
Nun stelle ich im Objectinspektor ein
VertScrollBar:
Range: 10000
HorzScrollBar:
Range: 10000
wenn ich die Komponente nun schieben will, wars das.......
auch mit Range 5000 geht das schon nicht mehr.
die Komponente verschwindet irgendwie...
Lazarus 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_64-win64-win32/win64
übrigens habe ich seit der letzen Version immer wieder mal diese merkwürdigen "großen, pixeligen Fonts" beim Starten von Lazarus.
Kurz danach ist aber alles okay. Vielleicht hängt es damit zusammen ? sollte ich evtl. alles neu installieren ?
mit schwitzenden Grüßen
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: ScrollBox Absturz in der Designphase
Auf GTK/Linux kann ich das Problem schon mal nicht nachvollziehen. Flutscht alles.
Lazarus 2.3.0 (rev main-2_3-2366-g4fba69291d) FPC 3.2.2 x86_64-linux-gtk2
Lazarus 2.3.0 (rev main-2_3-2366-g4fba69291d) FPC 3.2.2 x86_64-linux-gtk2
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Danke schonmal Theo für den Test.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1436
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: ScrollBox Absturz in der Designphase
Auf Windows 10 64 Bit Trunk Version wird zwar alles extrem langsam, geht am Ende aber.
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Danke fliegermichl,
ich glaube auch das sich die Anwendung irgendwie (vermutlich in Paint) ewig aufhält.
Sobald man die Anwenung gestartet hat, sofern nicht der Absturz schon kam, läuft es richtig.
ich glaube auch das sich die Anwendung irgendwie (vermutlich in Paint) ewig aufhält.
Sobald man die Anwenung gestartet hat, sofern nicht der Absturz schon kam, läuft es richtig.
Zuletzt geändert von siro am Fr 19. Aug 2022, 14:14, insgesamt 2-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 153
- Registriert: Sa 30. Jan 2010, 18:17
- OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Bei mir auch.fliegermichl hat geschrieben: ↑Fr 19. Aug 2022, 14:00Auf Windows 10 64 Bit Trunk Version wird zwar alles extrem langsam, geht am Ende aber.
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Danke Thandor.
Grad nochmal auf einem anderen Rechner probiert
Auf meinem i5 Laptop:
ja, es ist EXTREM langsam aber funktional.
es scheint wirklich nur in der Designphase so langsam zu sein.
kann man eigentlich nicht mit leben, da ist etwas nicht in Ordnung....
Grad nochmal auf einem anderen Rechner probiert
Auf meinem i5 Laptop:
ja, es ist EXTREM langsam aber funktional.
es scheint wirklich nur in der Designphase so langsam zu sein.
kann man eigentlich nicht mit leben, da ist etwas nicht in Ordnung....
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Es liegt an den Gitterpunkten....
Schaltet man in den Einstellungen das Gitter aus, ist es in Ordnung.
Er hält sich anscheinend ewig mit dem Zeichnen der Gitterpunkte (scheinbar auch den nicht sichtbaren) innerhalb des Ranges auf.
Schaltet man in den Einstellungen das Gitter aus, ist es in Ordnung.
Er hält sich anscheinend ewig mit dem Zeichnen der Gitterpunkte (scheinbar auch den nicht sichtbaren) innerhalb des Ranges auf.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Habe grad mal eine Zeitmessung gemacht für das Zeichnen des Punkterasters:
Wenn HorzScrollBar.Range = 5000 und VertScrollBar.Range = 5000
und das Raster auf 8 steht ergibt das:
5000/8 = 625
625 * 625 = 390625 Pixel, die natürlich nicht alle sichtbar sind.
Ich habe ein Formular 500 * 500 Pixel erstellt
Das Zeichnen des Rasters ohne RangeCheck benötigt bei mir 3,25 Sekunden
mit einem simplen, nicht optimierten RangeCheck jedoch nur noch 6,5ms.
Ich vermute, die Ursache ist dort zu suchen, ich weis aber nicht wie ich an den Source Code zum Zeichnen des Rasters für das Formular im Designmodus ran komme.
Wie sucht man so etwas am besten ?
Übrigens: Wenn ich in die ScrollBox ein TImage setzte (mit Align Client), ist das Problem auch behoben, da dann das Raster innerhalb der ScrollBox nicht mehr gezeichnet wird.
Fehlersuche vermutlich in TScrollBox.Paint während der Designphase...
Wo finde ich die implementierung der procedure TIDesigner.PaintGrid; virtual; abstract; für die ScrollBox
PaintGrid muss, der Definition nach, in geerbten Objektenseparat implementiert werden.
Ist also nicht direkt imTIDesigner vorhanden, wenn ich das richtig interpretiere.
Wenn HorzScrollBar.Range = 5000 und VertScrollBar.Range = 5000
und das Raster auf 8 steht ergibt das:
5000/8 = 625
625 * 625 = 390625 Pixel, die natürlich nicht alle sichtbar sind.
Ich habe ein Formular 500 * 500 Pixel erstellt
Das Zeichnen des Rasters ohne RangeCheck benötigt bei mir 3,25 Sekunden
mit einem simplen, nicht optimierten RangeCheck jedoch nur noch 6,5ms.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
freq,tStart,tStop:Int64;
t:Single;
x,y:Integer;
begin
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(tStart);
with canvas do begin
for x:=0 to 5000 div 8 do begin
for y:=0 to 5000 div 8 do begin
// if (x*8 < width) and (y*8 < height) then
Pixels[x*8,y*8]:=clBlack;
end;
end;
end; // canvas
QueryPerformanceCounter(tStop);
// in Sekunden umrechnen
Form1.caption:=FloatToStr((tStop-tStart) / freq);
end;
Wie sucht man so etwas am besten ?
Übrigens: Wenn ich in die ScrollBox ein TImage setzte (mit Align Client), ist das Problem auch behoben, da dann das Raster innerhalb der ScrollBox nicht mehr gezeichnet wird.
Fehlersuche vermutlich in TScrollBox.Paint während der Designphase...
Wo finde ich die implementierung der procedure TIDesigner.PaintGrid; virtual; abstract; für die ScrollBox
PaintGrid muss, der Definition nach, in geerbten Objektenseparat implementiert werden.
Ist also nicht direkt imTIDesigner vorhanden, wenn ich das richtig interpretiere.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: ScrollBox Absturz in der Designphase
Offiziell, indem man die IDE debuggt. Aber das ist relativ aufwendig, mit Nachdenken und Wissen über die Grundstruktur der IDE geht's einfacher und schneller:
Wie du schon bemerkt hast, wird das "Show grid" in den Optionen des Formular-Designers aus/eingeschaltet. Das meiste, was mit der IDE zu tun hat, steht im Verzeichnis "ide" der Lazarus-Installation, und alles, was im Konfigurationsformular auftaucht, läuft über Frames, für die ein Unterverzeichnis "frames" reserviert ist. Und dort sticht eine Datei "formed_options.pas" ins Auge. Wenn man die Datei öffnet, findet man im Designer tatsächlich diese "ShowGridCheckbox"-Combobox. Weiteres durchsuchen im Quelltext, zeigt dass der Zustand dieser Checkbox als Element ShowGrid der EnvironmentOptions abgespeichert wird.
Nun weiter mit der "Suche in Dateien", Suchtext "ShowGrid", Suchverzeichnis: das Lazarus-Installationsverzeichnis mit Unterverzeichnissen. Es werden über 100 Einträge gefunden, aber die meisten sind schon vom Dateiverzeichnis her unzutreffend. In der Unit designer.pp (Im Ordner designer) wird's aber interessant: eine Zeile in der Liste der Fundstellen heißt "if ShowGrid then", und die bringt uns mitten in die Methode TDesigner.PaintClientGrid - mit dem vorangestellten Kommentat "// Paint points" scheint das der (vorläufige) Übeltäter zu sein:
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;
DrawGrid(ADDC.Canvas.Handle, TWinControlAccess(AWinControl).GetLogicalClientRect,
GridSizeX, GridSizeY);
end;
Code: Alles auswählen
function TScrollingWinControl.GetLogicalClientRect: TRect;
begin
Result := ClientRect;
{if (FHorzScrollBar.Range>Result.Right)
or (FVertScrollBar.Range>Result.Bottom) then
DebugLn(['TScrollingWinControl.GetLogicalClientRect Client=',ClientWidth,'x',ClientHeight,' Ranges=',FHorzScrollBar.Range,'x',FVertScrollBar.Range]);}
if Assigned(FHorzScrollBar) and FHorzScrollBar.Visible
and (FHorzScrollBar.Range > Result.Right) then
Result.Right := FHorzScrollBar.Range;
if Assigned(FVertScrollBar) and FVertScrollBar.Visible
and (FVertScrollBar.Range > Result.Bottom) then
Result.Bottom := FVertScrollBar.Range;
end;
Das weitere Tüfteln, wie man nun, von dieser Erkenntnis ausgehend, das an DrawGrid zu übergebende Rechteck bestimmen muss, überlasse ich euch...
[EDIT]
Eine Idee hätte ich noch, um sich das Debuggen zu vereinfachen: TScrollbox hat eine OnPaint-Methode, und dort könnte man das o.e. DrawGrid aufrufen, so dass man dasselbe Verhalten wie im Objekt-Inspektor in einem normalen Projekt hat. Nun kann man mit dem übergebenen Rechteck herumspielen, und die richtigen Einstellungen finden. Im folgenden Code habe ich zunächst das ClientRect genommen - sieht auf den 1.Blick super aus und ist super schnell, nur wenn man scrollt verschwindet das Grid... Die nächste Idee war, das ClientRect um die Lage der linken/oberen Ecke zu verschieben: nun kann man mit der Maus scrollen, aber beim Klicken auf den Balken selbst entstehen Artefakte. Das muss noch besser gehen...
Code: Alles auswählen
procedure TForm1.ScrollBox1Paint(Sender: TObject);
const
VARIANTE = 3;
var
R: TRect;
begin
case VARIANTE of
1: begin // Langsam (Originalzustand)
R := Rect(0, 0, Scrollbox1.HorzScrollbar.Range, Scrollbox1.VertScrollbar.Range);
end;
2: begin // Schnell (Gültig aber nur ohne Scrollen
R := Scrollbox1.ClientRect;
end;
3: begin // Schnell, Scrollen mit Maus OK, aber Artefakte beim Klick auf Scrollbar und Scroll nach oben/links
R := Scrollbox1.ClientRect;
OffsetRect(R, Scrollbox1.HorzScrollbar.Position, Scrollbox1.VertScrollbar.Position);
end;
end;
LCLIntf.DrawGrid(Scrollbox1.Canvas.Handle, R, 8, 8);
end;
Zuletzt geändert von wp_xyz am Fr 19. Aug 2022, 17:44, insgesamt 1-mal geändert.
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Hallo wp_xyz,
ersteinmal wieder vielen Dank für deine ausführlichen Erklärungen
und dass Du Dich mal dem Problem angenommem hast.
Das mit der IDE und dem Debuggen/Verzeichnissen hätte ich nie gefunden,
aber jetzt habe ich ja einen guten Anhaltspunkt und gucke mir das morgen genauer an.
Ich hab früher schon mal mit der ScrollBox experimentiert und wie Du auch Artefakte beim Scrollen bemerkt, die dann aber irgendwann
auch weg waren. Ohje, das ist so ca. 20 Jahre her, Delphi 3... ich muss mal in den Backups suchen.
Auf jeden Fall vielen Dank für deine Mühe und schonmal einen guten Start ins Wochenende.
ersteinmal wieder vielen Dank für deine ausführlichen Erklärungen
und dass Du Dich mal dem Problem angenommem hast.
Das mit der IDE und dem Debuggen/Verzeichnissen hätte ich nie gefunden,
aber jetzt habe ich ja einen guten Anhaltspunkt und gucke mir das morgen genauer an.
Ich hab früher schon mal mit der ScrollBox experimentiert und wie Du auch Artefakte beim Scrollen bemerkt, die dann aber irgendwann
auch weg waren. Ohje, das ist so ca. 20 Jahre her, Delphi 3... ich muss mal in den Backups suchen.
Auf jeden Fall vielen Dank für deine Mühe und schonmal einen guten Start ins Wochenende.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Hallo nochmal, nach 2 Tagen Merkwürdigkeiten mit der ScrollBox habe ich es nun hinbekommen,
sieht komisch aus , gebe ich zu, aber NUR so habe ich es ohne irgendwelche Artefakte usw. hinbekommen.
Kurze Erklärung:
Der Startpunkt ist abhängig von der momentanen Scrollposition
Dieser Wert wird zunächst durch GridX geteilt, dann wissen wir wieviele Einheiten von GridX es sind von der 0 bis ScrollBar.Position,
also dem ersten sichbaren Pixel in der ScrollBox
Der Rest der Division geht verloren und das ist auch gut so, wir brauchen nur die ganzen Anteil.
Das Ergebnis ist also dann direkt durch GridX teilbar.
Nun wird der Wert wieder mit GridX multipliziert. Dann haben wir die horizontale Startposition x1 bzw. r.left
Zur rechten Position muss nun noch ClientWidth dazuaddiert werden und zusätzlich noch ein GridX Wert
damit ergibt sich folgendes Prozedere für das Rechteck:
Ich denke mal, das sollte nun irgendwie in den Code der IDE integriert werden können.
Meine Versuche sind zumindestens nun erfolgreich, vielleicht kann das jemand gegentesten...
für ein LinienRaster könnte es dann so aussehen:
sieht komisch aus , gebe ich zu, aber NUR so habe ich es ohne irgendwelche Artefakte usw. hinbekommen.
Kurze Erklärung:
Der Startpunkt ist abhängig von der momentanen Scrollposition
Dieser Wert wird zunächst durch GridX geteilt, dann wissen wir wieviele Einheiten von GridX es sind von der 0 bis ScrollBar.Position,
also dem ersten sichbaren Pixel in der ScrollBox
Der Rest der Division geht verloren und das ist auch gut so, wir brauchen nur die ganzen Anteil.
Das Ergebnis ist also dann direkt durch GridX teilbar.
Nun wird der Wert wieder mit GridX multipliziert. Dann haben wir die horizontale Startposition x1 bzw. r.left
Zur rechten Position muss nun noch ClientWidth dazuaddiert werden und zusätzlich noch ein GridX Wert
damit ergibt sich folgendes Prozedere für das Rechteck:
Code: Alles auswählen
r.left:=ScrollBox1.HorzScrollBar.Position div GridX * GridX;
r.top :=ScrollBox1.VertScrollBar.Position div GridY * GridY;
r.right:=r.left+ScrollBox1.ClientWidth + GridX;
r.bottom:=r.top+ScrollBox1.ClientHeight + GridY;
LCLIntf.DrawGrid(Scrollbox1.Canvas.Handle, R, GridX, GridY);
Meine Versuche sind zumindestens nun erfolgreich, vielleicht kann das jemand gegentesten...
für ein LinienRaster könnte es dann so aussehen:
Code: Alles auswählen
x1:=ScrollBox1.HorzScrollBar.Position div GridX * GridX;
x2:=x1+ScrollBox1.ClientWidth+GridX;
y1:=ScrollBox1.VertScrollBar.Position div GridY * GridY;
y2:=y1+ScrollBox1.ClientHeight+GridY;
while x1 <= x2 do begin
ScrollBox1.canvas.MoveTo(x1,y1);
ScrollBox1.canvas.LineTo(x1,y2);
inc(x1,GridX);
end;
x1:=ScrollBox1.HorzScrollBar.Position div GridX * GridX;
while y1 <= y2 do begin
ScrollBox1.canvas.MoveTo(x1,y1);
ScrollBox1.canvas.LineTo(x2,y1);
inc(y1,GridY);
end;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: ScrollBox Absturz in der Designphase
Danke. Sieht gut aus!
Tja, wie baut man das jetzt ein...?
TScrollingWinControl.GetLogicalClientRect zu ändern wäre das Naheliegendste, aber ich denke: Logical ClientRect - das hat eine vorgegebenen Bedeutung, nämlich die gesamte "logische" Größe des Controls, von dem nur ein Ausschnitt sichtbar ist.
Aufgerufen wird das in Designer.PaintClientGrid als Argument der DrawGrid-Prozedur. Ich denke, man muss hier das GetLogicalClientRect durch ein lokales Rechteck ersetzen, das das mit deiner Rechnung verschobene ClientRect darstellt. Nur: der Designer ist sehr allgemein und kennt die Scrollbars der Scrollbox überhaupt nicht. Wie weit ist das Control nun schon gescrollt? Zum Glück gibt es eine TControl-Methode GetClientScrollOffset, die gibt normalerweise Point(0, 0) zurück, aber bei der ScrollBox ist der Funktionswert gerade die Scrollbar-Position:
Das müsste funktionieren, um deine Rechnung direkt anzuwenden. Damit komme ich zu folgender Änderung in TDesigner.PaintClientGrid (in Unit designer.pp im Verzeichnis designer der Lazarus-Installation):
Kopiere das in die genannte Unit, baue die IDE neu und teste ausgiebig (nach meinen eigenen Tests scheint es funktionieren). Ich möchte nicht dafür verantwortlich sein, wenn nach dem Einpflegen dieser Änderung der Designer nicht mehr funktioniert...
Bei meinen eigenen Tests sind mir noch ein paar Sachen aufgefallen:
- Egal, ob man Scrollbar.Smooth auf true oder false setzt, erscheint mir das Scrollen immer mit Einstellung Smooth abzulaufen. Ist das immer so? Oder eine Folge dieser Änderung? Oder eine Folge des riesigen Scrollbar.Range?
- Wenn ich die Pfeiltasten betätige, passiert gar nicht? Brauche ich denn zum Scrollen mit der Tastatur einen speziellen Handler?
Tja, wie baut man das jetzt ein...?
TScrollingWinControl.GetLogicalClientRect zu ändern wäre das Naheliegendste, aber ich denke: Logical ClientRect - das hat eine vorgegebenen Bedeutung, nämlich die gesamte "logische" Größe des Controls, von dem nur ein Ausschnitt sichtbar ist.
Aufgerufen wird das in Designer.PaintClientGrid als Argument der DrawGrid-Prozedur. Ich denke, man muss hier das GetLogicalClientRect durch ein lokales Rechteck ersetzen, das das mit deiner Rechnung verschobene ClientRect darstellt. Nur: der Designer ist sehr allgemein und kennt die Scrollbars der Scrollbox überhaupt nicht. Wie weit ist das Control nun schon gescrollt? Zum Glück gibt es eine TControl-Methode GetClientScrollOffset, die gibt normalerweise Point(0, 0) zurück, aber bei der ScrollBox ist der Funktionswert gerade die Scrollbar-Position:
Code: Alles auswählen
function TScrollingWinControl.GetClientScrollOffset: TPoint;
begin
if (HorzScrollBar <> nil) and (VertScrollBar <> nil) then
begin
Result.X := HorzScrollBar.Position;
Result.Y := VertScrollBar.Position;
end else
begin
Result.X := 0;
Result.Y := 0;
end;
end;
Code: Alles auswählen
var
P: TPoint; // <--- neu
R: TRect; // <--- neu
....
// paint points
if ShowGrid then
begin
ADDC.Canvas.Pen.Color := GridColor;
ADDC.Canvas.Pen.Width := 1;
ADDC.Canvas.Pen.Style := psSolid;
R := TWinControlAccess(AWinControl).ClientRect; // <--- neu
P := TWinControlAccess(AWinControl).GetClientScrollOffset; // <--- neu
OffsetRect(R, P.X div GridSizeX * GridSizeX, P.Y div GridSizeY * GridSizeY); // <--- neu
InflateRect(R, GridSizeX, GridSizeY); // <--- neu
DrawGrid(ADDC.Canvas.Handle, R, GridSizeX, GridSizeY); // <--- ersetzen
end;
Bei meinen eigenen Tests sind mir noch ein paar Sachen aufgefallen:
- Egal, ob man Scrollbar.Smooth auf true oder false setzt, erscheint mir das Scrollen immer mit Einstellung Smooth abzulaufen. Ist das immer so? Oder eine Folge dieser Änderung? Oder eine Folge des riesigen Scrollbar.Range?
- Wenn ich die Pfeiltasten betätige, passiert gar nicht? Brauche ich denn zum Scrollen mit der Tastatur einen speziellen Handler?
Zuletzt geändert von wp_xyz am Di 23. Aug 2022, 23:12, insgesamt 1-mal geändert.
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Hallo wp_xyz,
schön dass Du es mal getestet hast und auch schon weiter in die Tiefe vorgedrungen bist.
Ich bin grad noch am probieren, aber vorab schonmal noch etwas Info:
Smooth: was ich feststellen konnte:
Wenn Smooth FALSE ist, dann ändert sich die Scrollposition beim Drücken mit der Maus auf den linken oder rechten Pfeil des Scrollbars
um den Wert Increment.
Ist Smooth auf TRUE, dann ändert sich die Scrollposition beim Drücken mit der Maus auf den linken oder rechten Pfeil des Scrollbars
immer um 1
ABER: Smooth kann man NUR in der Deisgnphase ändern. NANU ???
Während das Programm läuft, hat eine Änderung auf Smooth keine Wirkung mehr.
Der Wert Smooth wird aber korrekt übernommen, ich habe ihn ausgelesen und er ändert sich auch.
aber die Funktion ist nicht mehr gegeben, wenn das Programm läuft, sehr merkwürdig......
Tastatur:
Mit den Cursortasten der PC Tastatur kann man generell die Scrollbalken der ScrollBox NICHT bewegen, (auf meinem Windows 64)
im Gegensatz zum TScrollbar, da geht es auch über die Tastatur.
Ich bin da völlig deiner Meinung, ich würde vorerst auch nichts ändern wollen in der IDE,
das Bedarf noch ausgiebigen Tests.
Ich probiere aber trotzdem noch ein bischen rum.
schön dass Du es mal getestet hast und auch schon weiter in die Tiefe vorgedrungen bist.
Ich bin grad noch am probieren, aber vorab schonmal noch etwas Info:
Smooth: was ich feststellen konnte:
Wenn Smooth FALSE ist, dann ändert sich die Scrollposition beim Drücken mit der Maus auf den linken oder rechten Pfeil des Scrollbars
um den Wert Increment.
Ist Smooth auf TRUE, dann ändert sich die Scrollposition beim Drücken mit der Maus auf den linken oder rechten Pfeil des Scrollbars
immer um 1
ABER: Smooth kann man NUR in der Deisgnphase ändern. NANU ???
Während das Programm läuft, hat eine Änderung auf Smooth keine Wirkung mehr.
Der Wert Smooth wird aber korrekt übernommen, ich habe ihn ausgelesen und er ändert sich auch.
aber die Funktion ist nicht mehr gegeben, wenn das Programm läuft, sehr merkwürdig......
Tastatur:
Mit den Cursortasten der PC Tastatur kann man generell die Scrollbalken der ScrollBox NICHT bewegen, (auf meinem Windows 64)
im Gegensatz zum TScrollbar, da geht es auch über die Tastatur.
Ich bin da völlig deiner Meinung, ich würde vorerst auch nichts ändern wollen in der IDE,
das Bedarf noch ausgiebigen Tests.
Ich probiere aber trotzdem noch ein bischen rum.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: ScrollBox Absturz in der Designphase
Guten Morgen,
mir ist grade noch etwas aufgefallen:
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);
-----------------------------------
Auffällig:
ClientWidth und width liefern immer die gleichen Werte zurück und zwar die Breite der Komponente
ScrollBox.width = 150
BoarderStyle = bsNone
dann ist ClientWidth auch 150
der Mausbereich ist 0..149
BorderStyle = bsSingle
Dann hat man aussen einen 2 Pixel breiten Rahmen, also -4 Pixel
dann ist ClientWidth auch 150
der Mausbereich ist jedoch 0..145
Nun schalte ich den Vertikalen Scrollbar ein
dann ist ClientWidth auch 150
der Mausbereich ist jedoch 0..132
ScrollBox1.canvas.width scheint immer 0 zu sein
-------------------------------
Zudem ist mir in der Originalversion während der Designphase grad noch folgendes aufgefallen.
Wenn der Scrollbalken ausgeblendet wird, also visible auf FALSE und
Position gesetzt wird, stimmt das Gridmuster nicht mehr.
Hier ist also noch ein Bug zu vermelden. In unserer neu erarbeiteten Variante geht es aber richtig, auch mit ausggeblendetem Scrollbalken
mir ist grade noch etwas aufgefallen:
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);
-----------------------------------
Auffällig:
ClientWidth und width liefern immer die gleichen Werte zurück und zwar die Breite der Komponente
ScrollBox.width = 150
BoarderStyle = bsNone
dann ist ClientWidth auch 150
der Mausbereich ist 0..149
BorderStyle = bsSingle
Dann hat man aussen einen 2 Pixel breiten Rahmen, also -4 Pixel
dann ist ClientWidth auch 150
der Mausbereich ist jedoch 0..145
Nun schalte ich den Vertikalen Scrollbar ein
dann ist ClientWidth auch 150
der Mausbereich ist jedoch 0..132
ScrollBox1.canvas.width scheint immer 0 zu sein
-------------------------------
Zudem ist mir in der Originalversion während der Designphase grad noch folgendes aufgefallen.
Wenn der Scrollbalken ausgeblendet wird, also visible auf FALSE und
Position gesetzt wird, stimmt das Gridmuster nicht mehr.
Hier ist also noch ein Bug zu vermelden. In unserer neu erarbeiteten Variante geht es aber richtig, auch mit ausggeblendetem Scrollbalken
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...