Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Top / Left falsch, wenn gescrollt (https://www.delphipraxis.net/205307-top-left-falsch-wenn-gescrollt.html)

berens 25. Aug 2020 09:49

Top / Left falsch, wenn gescrollt
 
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;

himitsu 25. Aug 2020 15:54

AW: Top / Left falsch, wenn gescrollt
 
Zitat:

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.
Ich glaub das hatte irgendeine Grenze und wenn der Scrollbereich größer ist, wird quasi abgeschnitten.

jovitaweeks 14. Sep 2020 08:36

AW: Top / Left falsch, wenn gescrollt
 
Danke schön

KodeZwerg 14. Sep 2020 08:44

AW: Top / Left falsch, wenn gescrollt
 
Es gibt auch ein FlowPanel was mit dem Inhalt wachsen kann.
Ich weiß ja nicht wie deine Vcl anordnung aussieht (ein bild wäre nice gewesen), man kann Align = alTop einstellen und bei resize lediglich den Top wert neu zuordnen.
Also man fängt bei Top 0 an, wirft ein ding mit alTop rein und sagt dessen Top ist gleich die top + height des vorigen und macht nach diesem muster immer weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz