Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

Top / Left falsch, wenn gescrollt

  Alt 25. Aug 2020, 09:49
Hallo zusammen,
ich kämpfe hier seit Jahren mit einem uralten Problem, dass ich nun doch endlich mal abschließend klären möchte:

Situation:
Zur Laufzeit wird mein GUI öfters neu aufgebaut, wenn sich etwas geändert hat. Hat der Benutzer gerade nach Rechts oder Unten gescrollt, werden die neu erzeugten / positionierten Komponenten relativ zur linken oberen Ecke des Formulars positioniert, nicht zum "Ursprung" des Clientbereichs des Formulars, der ja aktuell bei den Koordinaten (0 - HorzScrollbar.ScrollPos, 0 - VertScrollbar.ScrollPos) liegt. Das Problem besteht identisch, wenn ich die Komponenten in einer ScrollBox positioniere.

Ich kann mir nicht vorstellen, dass das "richtig" ist.

Lösungsansätze:
1) Vor jedem Neu-Aufbau scrolle ich X und Y auf "0". Funktioniert, aber das Programm zappelt dauernd wie wild herum, wenn neu aufgebaut wird. Nicht hübsch.
2) ALLE Änderungen von Positionen von Komponenten suchen und abfangen, Left/Top entsprechend den Scrollbars manipulieren und weitergeben. Wahrscheinlich die nachhaltigste Lösung, aber ein *riesen* Aufwand, für ein eigentlich so triviales Problem. Das MUSS doch anders gehen?
Edit: Problem ist dann auch, wenn ich die "tatsächlichen" Positions-Werte mit den "Soll"-Werten meines Layouts vergleiche, z.B. um zu prüfen, ob Überschneidungen stattfinden. Im Prinzip muss ich jede einzelne Quelltextzeile ALLES Units meiner Software anpassen, die irgendwas mit Left, Top, Right oder Bottom zu tun haben... Das kann nicht sein...
3) Alles in ein Panel reinklatschen, dessen Größe auf den scrollbaren Bereich festlegen und AutoScroll des Forms/Scrollbox auf True. Hatte meine ich auch irgendwelche Probleme (ist schon Lange her), das wäre wahrscheinlich die einfachste/schnellste Lösung.

Gibt es eine richtige Lösung?



Zum Testen: Formular mit Scrollbar.Range 4000 Breit, 2000 Hoch erstellen. Label und Timer darauf platzieren.
Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm6 = class(TForm)
    Timer1: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  Label1.SetBounds(100, 200, 100, 100);
end;
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (25. Aug 2020 um 10:42 Uhr)
  Mit Zitat antworten Zitat