Announcement

Collapse
No announcement yet.

Sofortiges Fertigzeichnen eines Formulares

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sofortiges Fertigzeichnen eines Formulares

    Hallo,

    ich habe das Problem, daß ich vor Beenden eines Formulares, ca. 40 Interbase(5.6) Tabellen schließe.

    Vor dem Schliessen wird das Formular jedoch nur zur Hälfte fertiggezeichnet und es ist einige Sekunden lang der Sanduhr-Cursor (SQL) zu sehen. Erst danach wird das Formular fertiggezeichnet.

    Der Aufruf von <b>Form.Update</b> vor dem Schliessen nützt nichts. (Es werden während des Schliessens der Tabellen keinerlei Aktionen am Form vorgenommen).

    Der Anblick des halb fertigen Formulares in dieser Phase ist ein äußerst unschöner Effekt und zerstört einen ansonst guten Eindruck.

    Wer weiß guten Rat ?

    Gruss<br>Helmut

  • #2
    Hallo,

    wenn zwischen den einzelnen Aufrufen (Schliessen der Tabellen) regelmässig <b>Application.ProcessMessages</b> aufgerufen wird, erhält die VCL die Change, auf die in der Zwischenzeit eingetroffenen WM_PAINT-Botschaften zu reagieren und somit die Formular-Oberfläche korrekt darzustellen

    Comment


    • #3
      Vielen Dank Hr.Kosch!

      Ich habe nach jedem Tabellen-Close Application.ProcessMessages eingefügt.

      Der einzige Unterschied ist, daß statt dem SQL-Cursors der normale Pfeilcursor zu sehen ist. Das Formular wird wie früher erst nach allen Closes fertiggezeichnet.

      Wissen Sie noch einen Rat ?

      Gruss<br>Helmu

      Comment


      • #4
        Nachtrag:

        Ich verwende in der Unit für das schnelle Fertigzeichnen des Forms beim Form-Aufruf folgendes Konstrukt:

        <pre>
        unit HErfassg;
        interface
        uses
        Windows ...
        const
        WM_STARTALL = WM_USER + 0;
        type
        TFmHErfassg = class(TForm)
        ...
        procedure WMStartAll(var Msg: TMessage); message WM_STARTALL; // Botschaftsbehandlungs-Proc
        public
        { Public-Deklarationen }
        procedure MyFormActivate(Sender: TObject);
        private
        { Private-Deklarationen }
        end;

        var
        FmHErfassg: TFmHErfassg;

        implementation

        procedure TFmHErfassg.MyFormActivate(Sender: TObject);
        begin
        // Alle Maßnahmen für Form_Activate
        end;

        {------------------------------------------------------------------------------
        The WM_SHOW event posts a message that calls this method. That
        way I'm sure the form is actually visible before I start drawing
        on it.
        ------------------------------------------------------------------------------}
        // wird erst aufgerufen, nachdem Formular fertig gezeichnet wurde
        procedure TFmHErfassg.WMStartAll(var Msg: TMessage);
        begin {Sender}
        MyFormActivate(self); // Erst jetzt, nachdem Form fertig aufgebaut ist
        end;

        {------------------------------------------------------------------------------
        I post a message so I can draw something after
        the form is actually visible. See WMStartAll.
        ------------------------------------------------------------------------------}
        procedure TFmHErfassg.FormShow(Sender: TObject);
        begin
        PostMessage( Handle, WM_STARTALL, 0, 0 );
        end;
        </pre&gt

        Comment


        • #5
          Hallo,

          kann es sein, daß obiges Konstrukt, welches für den schnellen Aufbau des Forms zuständig ist, die schnelle Beendigung des Forms (die Wirkung "Application.ProcessMessages" beim Schliessen (siehe oben) verhindert ?

          Gruss <br>Helmu

          Comment


          • #6
            Hi,

            a)
            Was muss denn beim Beenden fertig gezeichnet werden ?? M.E. sollte doch alles da sein und nur darauf warten zu verschwinden ??

            b)
            Das Konstrukt zum 'schnellen fertigzeichnen' sieht mächtig überflüssig aus, da alle Dinge, die diesem Zweck dienen sollen, <b>nach</b> dem Anzeigen des Formulars geschehen. Das wird neben der Positionierung in Formshow noch dadurch 'getopt', dass der Aufruf myFormActivate auch noch brav mittels Postmessage hinten an die MessageQueue angehängt wird. Schon mal die 'Optimierung' ausdokumentiert und dann das Laufzeitverhalten verglichen ??

            c) Beim Beenden bzw. Schliessen des Fensters sollte die Routine MyFormActivate nie zum Tragen kommen ausser sie wird in entsprechenden Routinen implizit aufgerufen.

            d)
            Um hässliche Effekte beim Schliessen eines Formulars zu unterdrücken, würde ich zuerst versuchen die zeitraubenden Vorgänge in OnCloseQuery(...) zu erledigen.

            Gruß
            Gesin

            Comment


            • #7
              Hi

              Vor der längerdauernden Aktionen mal Form.Update oder RedrawWindow(Form.Handle, 0, nil, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW); aufrufen.

              Gruß Hage

              Comment


              • #8
                Danke für die Antworten!

                Für Gesine:

                a) Was ist wenn man aus einem Programm austeigt, hiebei ca. 80 Interbase-Tabellen schliessen muß und trotz einem Form.Update vor den Closes dieses nicht fertiggezeichnet wurde. Es ist das halbe alte Form und das halbe neue Form ca. 15 Sekunden lang überlappend zu sehen. Trotz einem Applikation.ProcessMessages nach jedem einzelnen Tabellen-Close wird das neue (gerufene) Form erst "nach" allen Closes fertiggezeichnet.

                b) und c) Ich verwende wie oben ausgedrückt, dass oben beschriebene Konstrukt "nur" beim Aktivieren des Forms.
                Ohne dieses Konstrukt tritt genau derselbe Effekt durch das Open der 80 Interbase Tabellen auf. Es wäre sehr lange eine Mischung aus dem verlassenen und gerade aufgerufenen Form ersichtlich.
                Mit dem Konstrukt wird das neue Form "sofort" fertiggezeichnet und danach die lang andauernden Operationen durchgeführt.

                d) Muss ich mal probieren.

                Gruss<br>Helmu

                Comment

                Working...
                X