ScrollBox Absturz in der Designphase

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

ScrollBox Absturz in der Designphase

Beitrag von siro »

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.......
ScrollBox_Absturz.jpg
ScrollBox_Absturz.jpg (157.19 KiB) 1900 mal betrachtet
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 :wink:
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: ScrollBox Absturz in der Designphase

Beitrag von theo »

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

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 »

Danke schonmal Theo für den Test.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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

Beitrag von fliegermichl »

Auf Windows 10 64 Bit Trunk Version wird zwar alles extrem langsam, geht am Ende aber.

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 »

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.
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...

Thandor
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

Beitrag von Thandor »

fliegermichl hat geschrieben:
Fr 19. Aug 2022, 14:00
Auf Windows 10 64 Bit Trunk Version wird zwar alles extrem langsam, geht am Ende aber.
Bei mir auch.

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 »

Danke Thandor.

Grad nochmal auf einem anderen Rechner probiert
Auf meinem i5 Laptop:

ja, es ist EXTREM langsam :cry: aber funktional. :wink:

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...

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 »

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.
ScrollBox_Absturz_2.jpg
ScrollBox_Absturz_2.jpg (46.62 KiB) 1853 mal betrachtet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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 »

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.

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;      
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.
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:
Fr 19. Aug 2022, 15:55
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 ?
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;
DrawGrid scheint das Gitter mit Weiten GridSizeX/GridSizeY in dem Rechteck zu zeichen, das durch TWinControlAccess(AWinControl).GetLogicalClientRect definiert ist. GetLogicalClientRect ist eine virtuelle Methode, die von TScrollbox überschrieben wird:

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;
Also: zunächst so groß wie das Control selbst (ClientRect), dann aber, wenn Scrollbars sichtbar sind, in der entsprechenden Richtung bis zum Range des Scrollbars aufgeweitet. Das ist der Übeltäter: Bei dieser Definition wird das Gitter bei sichtbaren Scrollbars immer über die 10000x10000 Pixel gezeichnet, obwohl nur ein winziger Ausschnitt sichtbar ist.

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.

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,

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...

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 nochmal, nach 2 Tagen Merkwürdigkeiten mit der ScrollBox habe ich es nun hinbekommen,
sieht komisch aus :shock: , 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); 
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:

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...

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

Re: ScrollBox Absturz in der Designphase

Beitrag von wp_xyz »

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:

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;
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):

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; 
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?
Zuletzt geändert von wp_xyz am Di 23. Aug 2022, 23:12, insgesamt 1-mal geändert.

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,
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 ??? :roll:
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...

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 »

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.
ScrollBox_Absturz_3.jpg
ScrollBox_Absturz_3.jpg (44.48 KiB) 1500 mal betrachtet
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...

Antworten