Fensterposition speichern



  • Ich möchte, das die Position von meinen verschiedenen Fenstern in der Registry abgespeichert wird. Dazu speichere ich Top & Left im OnClose-Event und das funktioniert auch. Das Problem ist das zurück lesen. Ich habe sowohl im OnShow sowie im OnCreate Event die gespeicherten Werte von Top & Left zurück geschrieben. Bei keinem Event bleiben die Werte beim anzeigen erhalten. Hab ich irgendwo etwas übersehen?



  • Das kannste doch ganz einfach lösen also ich hab erlicht gesagt keine Ahnung wie genau man das über die Registry machen kann aber es sollte Teoretisch wie folgt funktionieren.

    1-> Wenn Form1::OnClose() dann speichert er die Daten in eine Datei od. Registry.
    2-> Wenn Form::OnInit() dann öffnet er die Datei oder Registry und übergebt die beiden Top & Left als Integer in 2 Int Variablen rüber und dann über
    Form1-Left=IntToStr(IntVariable) in die Form zurück.

    Wie du das nun bewergstelligen willst weiß ich Technisch nicht genau also wie die Commands für die Registrierung heißen aber vielleicht hilft dir ja jemand weiter ich wollte nur mal so helfen wie weit ich konnte. Ich hoffe ich konnte wenigstens etwas helfen 🙂

    Also hier findest du noch einige Themen zur Regystri und zum Speichern der Daten:

    Registry:
    http://www.c-plusplus.net/forum/viewtopic.php?t=64958&highlight=registry
    http://www.c-plusplus.net/forum/viewtopic.php?t=64223&highlight=registry
    http://www.c-plusplus.net/forum/viewtopic.php?t=67195&highlight=registry
    http://www.c-plusplus.net/forum/viewtopic.php?t=66406&highlight=registry
    http://www.c-plusplus.net/forum/viewtopic.php?t=65734&highlight=registry
    http://www.c-plusplus.net/forum/search.php?search_id=588175474&start=30

    Dateien:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39469
    http://www.c-plusplus.net/forum/viewtopic.php?t=10822&highlight=dateien+speichern
    http://www.c-plusplus.net/forum/topic,10843.html

    Würd mich auch mal Interesieren wenn jemand was dazu schreiben könnte der Ahnung davon hat.



  • Mordamir schrieb:

    Hab ich irgendwo etwas übersehen?

    Höchstwahrscheinlich, da es eigentlich funktionieren sollte.
    Prüfe mal Deine "Position"-Property. Die sollte auf "poDesigned" stehen, damit es funktionieren kann.



  • Ag3nt schrieb:

    ....
    Form1-Left=IntToStr(IntVariable) in die Form zurück.
    ....

    int IntVariable = 123;
    Form1->Left = IntToStr(IntVariable);
    

    ➡ [C++ Fehler] E2034 Konvertierung von 'AnsiString' nach 'int' nicht möglich ⚠

    😃 😃 -Kein Kommentar-



  • promicha schrieb:

    -Kein Kommentar-

    Nachmacher 😉



  • Sorry, bin erst jetzt weider dazu gekommen. Ein OnInit-Event gibt es nicht, höchstens OnCreate.
    Das Schreiben der Werte in die Registry klappt ja auch, und auch das zurücklesen in Form1->Top und Form1->Left, nur öffnet sich das Fenster dann trotzdem an der alten Position. Die Eigentschaft Position steht auf poDesigned.
    Habe das zurücklesen der Werte in den Events OnCreate und OnShow probiert, bei beiden kein Ergebnis.



  • OnCreate 🙂 ist gemeint 🙂

    Ehm ich kann ja mal naher nen Code für dich progen 🙂 Als Beispiel 🙂



  • Mordamir schrieb:

    Sorry, bin erst jetzt weider dazu gekommen. Ein OnInit-Event gibt es nicht, höchstens OnCreate.
    Das Schreiben der Werte in die Registry klappt ja auch, und auch das zurücklesen in Form1->Top und Form1->Left, nur öffnet sich das Fenster dann trotzdem an der alten Position. Die Eigentschaft Position steht auf poDesigned.
    Habe das zurücklesen der Werte in den Events OnCreate und OnShow probiert, bei beiden kein Ergebnis.

    Meinst du mit alten Position, etwa die Position an der das Fenster beim letzten
    Programmstart stand, und wurde dieser vieleicht gespeichert?

    Probier doch einfach mal Testwerte aus um den eigentlichen Fehler nähr zu kommen, z.B. Left = 0,Top = 0. und das im OnCreate Ereigniss.
    Sollte das Funktionieren, liegt der Fehler wo anders, wenn nicht dann giebt
    das hier vermutlich noch ein langer Thread, da es funktionieren sollte.

    gruß Micha

    Zusatz:
    Hast Du ein NT System (NT,2000,XP)??? Dann könnte es Möglich sein das die
    Daten gar nicht in der Registry stehen, wenn dem so ist, dann Zeige mal
    dein Code für die Registry. Wenn du die ganz einfache Variante verwendest, haut es nicht.



  • Ja, es geht darum, dass das Fenster wieder an der gleichen Position geöffnet wird.
    Die Daten werden schon richtig in die Registry gespeichert. Wenn ich das Fenster ganz oben links hin verschiebe, dann steht in der Registry beim beenden des Programms auch 0, 0 für die Koordinaten. Auch das zurücklesen an sich funktioniert. 0,0 stehen dann auch in Top & Left. Nur wenn das Fenster dann auch angezeigt wird, ist es wieder an den alten Koordinaten. Position ist poDesigned. Betriebssystem ist Windows 2000.



  • Und auf was hast du Form->Align stehen?



  • Das Problem is dein poDesigned. Stell das mal auf poDefault um, dann sollte es klappen.



  • -=]xXx[=- schrieb:

    Das Problem is dein poDesigned. Stell das mal auf poDefault um, dann sollte es klappen.

    Sicher das es mit poDesigned nicht geht?

    Bei mir Funktioniert es prima



  • Bei mir hats nicht geklappt.



  • Hab das Problem bei mir gefunden. Ich hatte ein Unterprogramm geschrieben, welches die Registry-Daten für die Fensterposition ausliest. Top & Left hatte ich dabei als Adresse übergeben. Das sah so aus:

    void LoadWindowPosition(AnsiString WindowName, int *Left, int *Top)
    {
    ...
    }
    

    Das Problem daran scheint wohl zu sein, das man auf diese Weise nicht die Properties Top & Left übergeben kann, weil die ja nicht direkt eine Speicheradresse haben.
    Wenn ich jetzt der Funktion 2 Temporäre Variablen für Top & Left übergebe, und diese anschliesend den Form-Properties zuweise, dann funktioniert es.



  • 1000 Wege führen zum richtigen Code 🙂

    Also Glückwunsch das es nun geht 🙂


Log in to reply