Form aufrollen



  • Versuch's damit:

    // Funktion verbessert und getestet!
    void __fastcall Rollen(int e)
    {
        int p=(Top<e)*2-1;
        while((p>0 && Top<e) || (p<0 && Top>e))
        {
            Top+=p;
            Application->ProcessMesages();
            Sleep(1);
        }
    }
    void __fastcall TForm1::ButtonAufrollenClick(TObject *Sender)
    {
        Rollen(100);
    }
    void __fastcall TForm1::ButtonZurollenClick(TObject *Sender)
    {
        Rollen(Screen->Height);
    }
    

    EDIT: Die Funktion Rollen muss in der Klasse "TForm1" deklariert sein... udn die Funktionen sind ungetestet, da ich hier keinen BCB zur Hand habe, bin nicht zuhause ^^

    EDIT #2: Funktion getestet und verbessert!



  • Ich verstehe ehrlich gesagt nicht, wie dieser Code meine Form aufrollt. 😕
    Ausserdem hab ich doch gesagt, dass das Rollen wunderbar funktioniert. Doch wenn ich in der Form ein TDBGrid einfüge und es mit allen vier Anker fixiere, funktioniert nur noch das Aufrollen und danach friert das Programm ein.
    Ich hab mir jetzt überlegt, dass ich das TDBGrid erst anzeige, wenn das Aufrollen beendet ist bzw. es verschwinden lasse, bevor zugerollt wird. Vielleicht funktioniert das ja.
    Wenn jemand noch ne andere Idee hat. Wäre ich dankbar, weil ich eigentlich die Elemente in dem Fenster beim Rollen mitanzeigen wollte. 😃



  • nur mal so:

    vermeide es dutzende male ((TDockWnd)ThrParam)* zu casten (kosten haufenweise zeit). mache das lieber nur einmal.

    meine persönliche meinung zum aufrollen: lass solche gimicks lieber, würde mich als endanwender eher stören als erfreuen. (wie gesagt: meine meinung)

    funktioniert das mit dem dbgrid wenn du die ecken nicht verankerst?



  • @Sunday:
    Du meinst ich soll die C-Cast mit einem Dynamic-Cast ersetzen, oder wie? Ich hätte nicht gedacht, dass das soviel Zeit in Anspruch nimmt.

    Zu deiner Meinung mit dem Rollen:
    Ich werde dem Nutzer die Möglichkeit geben, das Rollen abzuschalten. Weil ich das persönlich auch besser finde. Aber da das "offiziell" ist und "DAU"s visuelle Menschen sind, will ich es mit einbauen. 😃

    Wenn ich die Ecken nicht verankere, dann gibt er mir eine Speicherzugriffsvetzung aus.



  • Zum einen solltest Du einen dynmamic cast verwenden, zum anderen solltest Du ihn nur ein einziges Mal durchführen. Das macht den Code schneller und viel übersichtliicher.



  • Maffe001 schrieb:

    Wenn ich die Ecken nicht verankere, dann gibt er mir eine Speicherzugriffsvetzung aus.

    In welcher Codezeile?



  • Maffe001 schrieb:

    Ich verstehe ehrlich gesagt nicht, wie dieser Code meine Form aufrollt. 😕

    Mit welchem Compiler arbeitest du? - Hast du die Funktion denn mal getestet?

    EDIT: Also ich habe sie getestet, und auf die Form ein DBGrid gesetzt undalle 4 Ecken verankert... und folgendes funktioniert (Delphi 6):

    procedure TForm1.FormClick(Sender: TObject);
    begin
        Rollen(0);
        Rollen(Screen.Height-Height);
    end;
    
    procedure TForm1.Rollen(e:Integer);
    var p:Integer;
    begin
        p:=Integer(Top<e)*2-1;
        while ((p>0) and (Top<e)) or ((p<0) and (Top>e)) do
        begin
            Top:=Top+p;
            Application.ProcessMessages;
            Sleep(1);
        end;
    end;
    

    Und das habe ich in C++ umgewandelt, ist ja nicht sonderlich schwer 😉 und das rollt meine Form auf Position X,0 und danach auf X,Y (Y ist Höhe des Bildschirms minus Höhe der Form)... und das ohne sich aufzuhängen ^^



  • Ich arbeite mit dem Standard-Compiler des BCB6 Enterprise.

    Die Speicherverletzung ist weg, warum weiss ich allerdings noch nicht genau. Aber das Programm friert wieder ein.

    @Windoof:
    Deine Funktion hab ich noch nicht getestet, weil mir erstmal das Verständnis gefehlt hat. Aber ich werde es noch tun. 🙂



  • Pro bier das mal... aber mal etwasanderes: Wenn die Formaufgerollt ist, was genau wird dann gemacht? - Wird evtl. eine Funktion aufgerufen, die länger braucht und evtl. Schleifen aufgerufen? - Evtl. Endlosschleifen, ungewollt? Wenn eine Schleife durchläuft und nicht zwischendurch Application->ProcessMEssages(); aufgerufen wird, "friert" das PRogramm ein, das liegt dann nicht an deiner Roll-Funktion...



  • Eigentlich mach ich erstmal nichts. Ich hab das Rollen in einem Thread umgesetzt, der sich nach Beendigung des Rollen wieder schlafen legt, damit das Rollen die Anwendung nicht blockiert. Tja und danach ist die Anwendung im Leerlauf. Also ich weiss nicht, was das Einfrieren hervorruft. Das Kuriose ist, dass er nicht immer einfriert, sondern manchmal erst nach ein paar Mal Auf- und Zuklappen. Naja, ich muss das wohl mal Auseinanderpflücken.



  • Welche Sicherheit hast Du Du bezüglich der Thread-Synchronisierung verwendet? Synchronise oder CriticalSection?



  • Die Daten für das Rollen hole ich mir aus ner Klasse, die das Ganze verwaltet. Die Lese- und Schreiboperationen sind mit einem Mutex verriegelt. Das sollte also nicht der Fehler sein.


Anmelden zum Antworten