TScrollBox - Designzeitproblem
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
TScrollBox - Designzeitproblem
Ich verwende eine TScrollBox, da ich ein Layout habe das größer als der vorhandene Platz ist. Es sind ganz einfach jede Menge Panel, die per Anchors der Reihe nach vertikal aufgefädelt sind. Soweit so gut. Nur komme ich zur Designzeit nicht an die Panels heran, die am unteren Rand in der Scrollbox verschwunden sind. Der vertikale Scrollbar auf der Seite wird zwar angezeigt, ist aber ohne Funktion und kann nicht mit der Maus erreicht werden. Auch das Scrollrad der Maus ist ohne Funktion.
Wie kann ich da scrollen, damit ich die unteren Panels erreichen kann ?
Edit:
Man kann den VertScrollBar im OI öffnen und dort die Position ändern. Ist aber für eine GUI nicht gerade prickelnd
Lazarus 2.3.0 rmain-2_3-342-gc44d729ba2 FPC 3.2.3 i386-win32-win32/win64
Wie kann ich da scrollen, damit ich die unteren Panels erreichen kann ?
Edit:
Man kann den VertScrollBar im OI öffnen und dort die Position ändern. Ist aber für eine GUI nicht gerade prickelnd
Lazarus 2.3.0 rmain-2_3-342-gc44d729ba2 FPC 3.2.3 i386-win32-win32/win64
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: TScrollBox - Designzeitproblem
So, oder einfach das Formular vergrössern, während der Entwurfszeit.af0815 hat geschrieben: Di 31. Mai 2022, 08:40 Man kann den VertScrollBar im OI öffnen und dort die Position ändern. Ist aber für eine GUI nicht gerade prickelnd
Etwas anderes wüsste ich auch nicht.
Re: TScrollBox - Designzeitproblem
Nicht 100% sicher, ob das Folgende ein Control in den sichtbaren Bereich holt, aber ich würde das gewünschte Panel im Objekt-Baum (über dem Objektinspektor) anklicken. Das Panel müsste natürlich einen "sprechenden" Namen haben, so dass man es leicht findet.
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: TScrollBox - Designzeitproblem
Nein, wenn man das macht wird das Panel nicht in den sichtbaren Bereich gebracht. Man kann manchmal die Eckmarkierungen sehen, aber nicht aktiv. Die Namen der Panels sagen alles aus, das ist kein Problem die zu finden bzw. das Richtige zu erwischen.wp_xyz hat geschrieben: Di 31. Mai 2022, 11:51 Nicht 100% sicher, ob das Folgende ein Control in den sichtbaren Bereich holt, aber ich würde das gewünschte Panel im Objekt-Baum (über dem Objektinspektor) anklicken. Das Panel müsste natürlich einen "sprechenden" Namen haben, so dass man es leicht findet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: TScrollBox - Designzeitproblem
Das Scrolling zur Designzeit ist definitiv abgeschaltet im Code
Lazarus/lcl/include/controlscrollbar.inc
Lazarus/lcl/include/controlscrollbar.inc
Code: Alles auswählen
procedure TControlScrollBar.ScrollHandler(var Message: TLMScroll);
var
NewPos: Longint;
begin
if (csDesigning in FControl.ComponentState) then
exit; //prevent wierdness in IDE.
...
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: TScrollBox - Designzeitproblem
Wobei ich das spasseshalber mal auskommentiert hab, IDE neu gebacken und es geht trotzdem nicht.
- kupferstecher
- Beiträge: 434
- Registriert: Do 17. Nov 2016, 11:52
Re: TScrollBox - Designzeitproblem
In so einem Spezialfall würde ich wohl die Panels als Seiten in ein TNotebook packen und dann erst in der Form-Create in der Scrollbox sauber untereinander anordnen. Ist zwar ein Workaround, aber über den OI dann gut zu navigieren.
-
- Beiträge: 1065
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: TScrollBox - Designzeitproblem
nur eine Interessenfrage ohne Lösungskompetenz...af0815 hat geschrieben: Di 31. Mai 2022, 08:40 Es sind ganz einfach jede Menge Panel, die per Anchors der Reihe nach vertikal aufgefädelt sind.
@af0815
Sind die Panels mehrere Instanzen vom gleichen Typ, also so etwas wie die fortlaufenden Forms in Access? Scrollen und editieren in einem samt drauf liegender Funktionen in Form von Buttons. Ist ziemlich fein und wurde von den Benutzern als Design immer gerne angenommen.
Gibt es ähnliches fertig in Lazarus/FPC?
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: TScrollBox - Designzeitproblem
Nein die Panels können absolut verschieden sein. Auch kann das Panel einfach nur ein Container für Frames sein, oder Buttons beinhalten. Wären die vom gleichen Typ, bräuchte ich das Scrollen nicht, da ich das erste konfiguriere und die restlichen Panels dann funktionieren. So habe ich es bisher gemacht und kein Problem. Nur diesmal wird das Benutzerinterface inhomogener, deshalb ist für mich die Frage ganz einfach aufgetaucht.charlytango hat geschrieben: So 5. Jun 2022, 10:04@af0815
Sind die Panels mehrere Instanzen vom gleichen Typ, also so etwas wie die fortlaufenden Forms in Access? Scrollen und editieren in einem samt drauf liegender Funktionen in Form von Buttons. Ist ziemlich fein und wurde von den Benutzern als Design immer gerne angenommen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: TScrollBox - Designzeitproblem
Noch eine Idee:
- Setze das ChildSizing der Scrollbox auf ControlsPerLine=1, Layout=cclLeftToRightThenTopToBottom, EnlargeHorizontal=crsHomogenousChildResize, ShrinkHorizontal=crsHomogenousChildResize. Damit werden die Panels horizontal über die gesamte Scrollbox-Breite ausgedehnt; vertikal nehmen sie den jeweils benötigten Platz ein (damit das unterste Control nicht am Rand klebt, muss es ein unteres Borderspacing bekommen). Damit das alles funktioniert, dürfen die einzelnen Panels keine Anker und nur noch Align=alNone haben.
- Die Reihenfolge der Panel wird beim ChildSizing durch die Z-Reihenfolge bestimmt. Klicke das zu bearbeitende Panel im Objekt-Baum an und wähle im Kontext-Menü "Move to back". Damit kommt dieses Panel in der Scrollbox an den oberen Rand, so dass du deine Änderungen vornehmen kannst.
- Um die Reihenfolge zur Laufzeit wieder richtigzustellen, würde ich im OnCreate des Formulars für jedes Panel in der Reihenfolge von oben nach unten die Methode BringToFront aufrufen:
- Setze das ChildSizing der Scrollbox auf ControlsPerLine=1, Layout=cclLeftToRightThenTopToBottom, EnlargeHorizontal=crsHomogenousChildResize, ShrinkHorizontal=crsHomogenousChildResize. Damit werden die Panels horizontal über die gesamte Scrollbox-Breite ausgedehnt; vertikal nehmen sie den jeweils benötigten Platz ein (damit das unterste Control nicht am Rand klebt, muss es ein unteres Borderspacing bekommen). Damit das alles funktioniert, dürfen die einzelnen Panels keine Anker und nur noch Align=alNone haben.
- Die Reihenfolge der Panel wird beim ChildSizing durch die Z-Reihenfolge bestimmt. Klicke das zu bearbeitende Panel im Objekt-Baum an und wähle im Kontext-Menü "Move to back". Damit kommt dieses Panel in der Scrollbox an den oberen Rand, so dass du deine Änderungen vornehmen kannst.
- Um die Reihenfolge zur Laufzeit wieder richtigzustellen, würde ich im OnCreate des Formulars für jedes Panel in der Reihenfolge von oben nach unten die Methode BringToFront aufrufen:
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.BringToFront; // das wird das oberste Panel
Panel2.BringToFront; // das wird unterhalb von Panel1 angeordnet
Panel3BringTofront; // und das unterhalb von Panel2
// etc