VertScrollBox zur Laufzeit befüllen

    VertScrollBox zur Laufzeit befüllen

    Hallo,

    ich habe eine VertScrollbox, die ich zur Laufzeit (beim Programmstart im OnShow der Form) mit vielen Panels befülle, so viele dass gescrollt werden kann.
    Nun soll im OnShow des Forms per ScrollBy(...) gleich zu einem noch unten verdeckten Panel gescrollt werden, aber es bewirkt nichts!
    Ich habe mir dann mal an der Stelle die ContentBounds angesehen, deren Höhe ist 0!

    Baue ich vor dem ScrollBy eine MsgBox ein, stimmt danach auch ContentBounds!
    Ein RealignContent oder Repaint hingegen bewirkt nichts!

    Hat jemand eine Idee wie ich die Scrollbox bewegen kann, bereits im FormShow ihren Inhalt zu positionieren?

    Ciao
    Stefan
    Hi SKO

    sko schrieb:

    ich habe eine VertScrollbox, die ich zur Laufzeit (beim Programmstart im OnShow der Form) mit vielen Panels befülle,


    Das OnShow-Event ist nicht der richtige Ort, um mehrere Komponenten - hier Panels - in einer Scrollbox zu createn. Schreib dir für diesen Vorgag eine eigene Prozedur und rufe dies aus dem FormCreate auf. Im OnShow-Event kannst du Positionen neu berechnen/anpassen (zB. nach einem Invalidate, bzw Resize)

    Gruss
    Delbor
    roase.ch/

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran
    Danke für den Hinweis!
    Ich dachte im Create wäre schlecht, denn da wird das Formular ja noch "gebaut" und ich könnte da nicht noch gleichzeitig an "Steuerelementen rumpfuschen"...

    Macht es einen Unterschied ob man eine Procedur im OnCreate aufruft oder der Code da "direkt in der OnCreate steckt"?

    Meinem Gefühl nach wäre das egal, aber man weiß ja nie ;)

    Ciao
    Stefan
    Hi Soko

    Wenn du eine separate Prozedur schreibst, um die Panels zu erstellen/zu platzieren, kannst du diese von überall her aufrufen. Du könntest Beispielsweise prüfen, ob ein bestimmtes Panel schon existiert und dieses createn,wenns nicht so ist. Anschliessend kannst du es platzieren. Der Efffekt: wenn du die Prozedur aus dem FormCreate heraus aufrufst, gibts die Panels ja noch nicht, und so werden sie erstellt.
    Wenn du andrerseits die Form und alle andern Komponenten erstellt und platziert hast und sich nun die Grösse der Form ändert, müssen die Panels möglicherweise neu platziert werden, nicht aber erstellt - dazu kannst du nun dieselbe Prozedure benutzen, da die Panels nur createt werden, wenn es sie nicht gibt. Ansonsten müsstest du die selbe Prozedur zweimal schreiben, einmal mit und einmal ohne Erstellen der Panels. Und das muss ja nun nicht sein.

    sko schrieb:

    Ich dachte im Create wäre schlecht, denn da wird das Formular ja noch "gebaut"


    Die Überlegung ist nicht grundsätzlich falsch. Wichtig ist, dass alles, was benötigt wird, um die Panels zu erstellen, bereits existiert. Und das ist in aller Regel der Fall. Denn das OnCreate-Event zB. eines Formulars ruft dessen Constructor auf. Ist dieser Ausgeführt, kehrt die Programmausführung zum OnCreate-Event zurück und führt da weitere Anweisungen aus, falls vorhanden, oder beendet diese.

    Hast du irgendwelche Klasse, die beim Createn der Panels von diesen verwendet werde soll, musst du erst diese erstellen. Eine Ausnahme bilden da eventuell sichtbare Komponenten wie eine Scrollbox. Wenn du diese zur Designzeit per Drag&Drop auf der Form platzierst, wird sie mit dieser erstellt.
    Wenn du sie aber erst zur Laufzeit erstellst und darin deine Panels haben willst, muss die Scrollbox vor den Paels erstellt werden.

    Einen kleinen Tip hab ich noch: Wenn du eim Erstellen der Panels diesen die Form als Owner zuweist,gibt diese die Panels frei, wenn sie selbst freigegeben wird. Ansonsten erhälst du ein Speicherleck, falls du sie nicht explizit selbst freigibst.

    Gruss
    Delbor
    roase.ch/

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Delbor“ ()

    Delbor schrieb:


    sko schrieb:

    Ich dachte im Create wäre schlecht, denn da wird das Formular ja noch "gebaut"


    Die Überlegung ist nicht grundsätzlich falsch. Wichtig ist, dass alles, was benötigt wird, um die Panels zu erstellen, bereits existiert. Und das ist in aller Regel der Fall. Denn das OnCreate-Event zB. eines Formulars ruft dessen Constructor auf. Ist dieser Ausgeführt, kehrt die Programmausführung zum OnCreate-Event zurück und führt da weitere Anweisungen aus, falls vorhanden, oder beendet diese.


    Nach meinem Kenntnisstand ruft OnCreate nicht den Konstruktor auf, sondern andersrum:
    Der Konstruktor prüft am Ende, ob ein OnCreate-Event zugewiesen ist und ruft dann dieses auf.

    Das heißt dann auch zwangsläufig, dass im OnCreate-Event eines Formulars der Konstruktor bereits ausgeführt und das Formular mit all seinen Controls erzeugt ist.
    Das OnCreate-Event kann aus diesem Grund auch sicher für die angedachten Zwecke verwendet werden.
    "After three days without programming, life becomes meaningless." (The Tao of Programming, Book 2)
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler, 'Refactoring')
    Hi BerndG

    Stimmt, so wird ein Schuh draus. Im OnCreate meiner Hauptform rufe ich das Oncreate eines Datenmoduls auf. und wenn ich von diesem OnCreate per F7 weitersteppe, lande ich erstmal im Konstruktor des Datenmoduls und erst anschliessend in dessen OnCreate-Event.
    Mit F8 hingegen würde ich hingegen nur im OnCreate-Event landen, wenn da ein Haltepunkt gesetzt ist, ansonsten auf der nächsten Zeile des Hauptform.Create.

    Gruss
    Delbor
    roase.ch/

    Was wirklich zählt, ist Intuition. Albert Einstein

    ________________

    Delbor alias Zoran