Form zurücksetzen / neu laden

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Jens.

    Form zurücksetzen / neu laden

    Meine Erfahrungen mit VB sind noch nicht so sehr groß. Jedoch bin ich fleißiger Leser und kann mir somit vieles selbst erarbeiten.
    Die Lösung fü folgendes Problem konnte ich nirgends finden:
    Ich habe nur ein Form1. Hier werden jede Menge Berechungen etc. durchgeführt. Alles funktioniert prima. Jetzt will ich über einen ToolStrip Button das Fomular wieder in den Zustand zurückversetzen, den es beim ersten Aufruf hatte.
    VB zeigt mir an, dass ich me verwenden soll. Kann mir jemand helfen? Ich weiß weder wo, noch wie, noch wann ich me verwenden soll. Einzig das Warum hat sich mir so halbwegs erschlossen.
    Grüße aus Leipzig
    Jens
    Hallo, Jens.

    Ich habe dein Problem nicht genau verstanden. Was genau meinst du mit "ToolStrip Button"? Und was genau möchtest du zurücksetzen? Wenn du ein Formular neu laden willst, musst du nur

    Quellcode

    1. Form1.Load()


    schreiben. Gegebenenfalls (um alle Eingaben zu löschen) solltest du es vorher mit

    Quellcode

    1. Form1.Unload()


    entladen.

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()

    Hi Malcolm,
    Auf meinem Formular habe ich eine Menüleiste und darunter eine Buttonleiste - a' la Windows.
    Einer dieser Button soll mir nun sämtliche Eingaben auf dem Formular löschen.
    Das könnte ich ja lösen in dem ich für jedes einzelne Element (TextBoxen, Label etc.) einfach eine entsprechende Anweisung
    (z.B. Label1.Text = " ") und so weiter schreibe. Da es sich aber um recht viele Elemente auf dem Formular handelt, wird der Code einfach unendlich lang und es ist vermutlich auch nicht die eleganteste Form. Mein Hang zum Perfektionismus sagt mir intuitiv, dass es da eine Möglichkeit geben muß, das Formular in den Anfangszustand zu versetzen.

    Form1.Unload()

    ist doch - bei einer Anwendung mit nur einem Form- ein Verweis auf sich selbst - oder?
    Habe gerade in den Ereignishandler des Buttons den von Dir vorgeschalgenen Code eingeben. Ergebnis:
    Unload ist kein Member von...
    Mit Form1.Reload geht es auch nicht, gleiche Meldung.
    Mir ist klar, dass ich ja eigentlich das Programm hier auffordere, sich selbst zu zerstören, dabei aber weiter zu laufen und sich selbst dann neu auf zu bauen - und das will es natürlich nicht. Es sei denn ich fordere es mit Application.Exit dazu auf sich einfach nur total zu beenden. Dafür habe ich aber im MenüStrip das Item &Beenden.
    Ich will, das Fomular in seinen Ausgangszustand versetzen. Also alle Eingaben löschen.
    Hintergrund: Es handelt sich hier um ein Berechungsprogramm mit Formeln und Schleifen, die mich zum Wahnsinn treiben;-). Wenn ich dann eine neue Berechung ausführen will, soll alles so sein, wie am Anfang, als das Form frisch geladen wurde. Da sind nur sehr wenige Panels und Group-Boxen sichtbar.
    Gruß aus Leipzig
    Jens
    Hallo Jens,

    probiere mal dieses:

    VB.NET-Quellcode

    1. Unload Me
    2. Me.Show

    Ich finde es kurz, aber wenig elegant. Besser fände ich eine von dir am Anfang sauber durchgeproggte Routine, welche definierte Anfangsbedingungen erzeugt.

    Gruß Markus
    Hi Markus,
    funzt auch nicht
    "Der Name Unload wurde nicht deklariert."
    VB erkennt vermutlich nicht das Unload eigentlich ein Befehl ist...
    Variante 2:

    From1.Unload (me)
    Ergebnis:
    >>Fehler 2 "Angebotsrechner.Form1" kann nicht durch die Standardinstanz auf sich selbst verweisen. Verwenden Sie stattdessen "Me".<<

    Die Idee mit der Routine und den Anfangsbedingungen verfolge ich ja die ganze Zeit - irgenwie :-(. Sollte ich denn wirklich jedes einzelne Element wieder per Script unsichtbar machen müssen??? Kann ich garnicht glauben.
    Gruß aus Leipzig
    Jens
    Welche version von visual basic verwendest du !?

    Unload ist eine stinknormale funktion um objekte zu entladen.
    Die Syntax ist

    VB.NET-Quellcode

    1. Unload (Object)


    Wenn dein VB die Funktion nicht erkennt, hast du was kaputt gemacht ;)

    Das Me verweist auf das aktuelle fenster.
    Also wenn du es in Form1 schreibst, zeigt es auf Form1, wenn du es in Form2 schreibst, zeigt es auf Form2.

    Mit Object.Show ladest du dann die Form neu.

    Bei mir funktioniert

    VB.NET-Quellcode

    1. Unload Me
    2. Me.Show

    problemlos - so, wies sein sollte
    Hallo Andy,
    VB 2005 Express-Edition.

    Ich glaube ich habe hier einen grundlegenden Fehler irgendwo drin...
    Wenn ich die Meldung bekomme, das XY kein Member von Form1 ist, dann fehlt doch irgendwie das Ereignis. An welcher Stelle ist denn z.B. Unload ein Member von Form1. Ich kann das nicht finden.
    Wenn ich in die möglichen Ereignisse von Fom1 im Eigenschaftenfenster reinschaue, wird mir Unload auch nicht angeboten.
    Hier ist was faul.
    Ich hoffe Ihr seid nicht sauer - ich mach jetzt erstmal Schluß. Sitzte seit heute früh 8:00 Uhr an der Sache - Augen werden 4-Eckig. Werde morgen weiter lesen.
    Wünsche allen eine geruhsame Nacht vor der Maschine und mir eine Lösung für Unload oder Refresh oder irgendwas, was mein Fomular refresht ;)
    Herzlich aus Leipzig
    Jens

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Jens“ ()

    Hallo, Jens.

    Du hast Recht, es gibt ein grundlegendes Problem. Das hier ist nämlich ein "Visual Basic 6" bzw. "Visual Basic .NET" - Forum und kein "Visual Basic 2005"-Forum.

    Ich habe wirklich keine Ahnung, was genau die Visual Basic 2005 - Version von der Visual Basic 6 - Version unterscheidet, aber ich halte es für warscheinlich, dass der Unload-Befehl in der Version die du benutzt einfach anders angewendet wird als unter Visual Basic 6. Du hast also warscheinlich nichts falsch gemacht ;-).

    mfG

    Malcolm
    Hi!

    Ich dachte es geht um VB 6.0, da es im Hauptforum steht.


    Also in .net / 2005 wäre der gleichwertige Befehl

    VB.NET-Quellcode

    1. Me.Close()
    2. Me.Show()


    Das funktioniert aber nicht, da das Formular nach .Close() weg ist und sich das Programm beendet.

    Also entweder musst du alle Controls leeren / sichtbar / unsichtbar / ... machen, damit du den Ausgangszustand erreichst oder du brauchst eine 2te Form. Wenn jemand noch eine andere möglichkeit findet, würde ich es gerne wissen ;)


    @ Malcolm: VB 2005 ist (fast) das gleiche wie .NET.
    Ich habe zu mindest mit beiden gearbeitet und in sachen allgemeiner Programmierung hab ich nicht viele unterschiede gefunden - in der Syntax garkeine. Vllt. ist etwas an der Web und Datenbank-Programmierung anders... so weit hab ich mich bis jetzt nicht hinerngearbeitet...
    Ein Unterschied, der mir aufgefallen ist, ist, dass die IDE "benutzerfreundlicher" ist und somit noch mehr speicher frisst ;)

    [EDIT] Wenn ich von .NET rede, meine ich Visual Studio .NET 2003 (FrameWork 1.*) und wenn ich von Visual Studio 2005 rede, meine ich (die Express Version von) VB .NET 2005 (FrameWork 2.0).[/EDIT]


    Btw. VB 2005 sachen gehören am ehesten ins .NET Forum...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    Hi Mad Andy und Ihr anderen fleißigen Schreiber,
    da seht Ihr wieder, dass ich noch nicht einmal den Unterschied der einzelnen Versionen kenne... X( X( X(
    O.K. nun in einer anderen Rubrik und auf ein Neues :))
    Das mit der zweiten Form habe ich probiert in dem ich mit

    Quellcode

    1. Public Sub GetSecondInstance()
    2. Dim newForm1 As New Form1
    3. newFom1.Show
    4. End Sub

    einfach eine Kopie erstellt habe. Die kann man ja dann sicher auch im Originalzustand laden. Weiß zwar noch nicht wie, aber das sollte gehen.
    Jetzt müßte ich doch... nach meiner Logik ?( ...
    der Kopie den Focus geben und dann ... irgenwie ... die erste Form
    mit

    Quellcode

    1. Me.Close()
    schließen können - oder?
    Grüße aus Leipzig
    Jens

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Jens“ ()

    so müsste der code aussehen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim newForm1 As Form1
    3. newForm1 = New Form1
    4. newForm1.Show()
    5. newForm1.Focus()
    6. Me.Close()
    7. End Sub



    Wenn du nichts änderst, beendet sich das Programm, sobald das Startformular geschlossen wird. Also in der Zeile Me.Close() wird das ganze prog beendet.

    Das kannst du folgendermaßen ändern:

    Du Doppelklickst "My Project" im "Projektmappen-Explorer" und setzt "Modus für das Herunterfahren:" auf "Beim Schließen des letzten Formulars".



    Ich würd das zwar nicht so machen, aber das funzt auf jeden Fall ;)
    Herzlichen Dank!
    Der Code funktioniert einwandfrei! Aber im Bauch bleibt ein putziges Gefühl und Du hast es verursacht ;)
    Ich würd das zwar nicht so machen, aber das funzt auf jeden Fall


    Also ich bin mit dem ganzen Programm jetzt ersteinmal soweit, dass die Berechnungen - extrem kompliziert - sauber funktionieren und ich auch ein vernünftiges Ergebnis darstellen kann. Jetzt gefällt mir natürlich nicht, dass der Code - bin halt ein Anfänger - fortlaufend geschrieben ist. Würde mich jetzt gern so ein wenig an's "aufräumen" machen.
    Naja und wenn ich den Gedanken einmal habe, liegen folgende Fragen nahe:
    • Wie würdest Du es machen?
    • Könnte man z.B. den Code für die Berechnung in eine eigene Procedure (Klasse) auslagern?
    • Ist es vielleicht sogar ratsam hier mit einer MDI-Anwendung zu arbeiten?

    Hintergrund meiner Fragen ist der, dass ich - wenn ich mich da schon so reinsteigere - es auch so gut und effektiv wie möglich machen will. Es ist ja auch ein schönes Gefühl, anderen später mit gutem und effektivem Code helfen zu können.
    Grüße aus Leipzig
    Jens
    Mit "ich würde es nicht so machen" beziehe ich mich auf

    Ich finde es kurz, aber wenig elegant. Besser fände ich eine von dir am Anfang sauber durchgeproggte Routine, welche definierte Anfangsbedingungen erzeugt.


    So würde ich es nämlich machen ;)


    MDI-Anwendung halte ich für Sinnlos, da du ja nur eine Art von Fenster hast...
    Wenn du jetzt 10 Formulare für 10 verschiedene Berechnungen hättest, wäre es sogar sinnvoll


    Den Code würd ich in Funktionen in einem Modul auslagern:
    Wie du ein Modul hinzufügst, weißt du hoffentlich ^^
    Dann machst du hald für jede Berechnung eine Funktion

    VB.NET-Quellcode

    1. Public Function Berechnung1(ByVal Zahl1 As Decimal, ByVal Zahl2 As Decimal) As Decimal
    2. Dim Ergebnis As Decimal
    3. 'Rechenvorgang
    4. Ergebnis = Zahl1 + Zahl2
    5. Return Ergebnis
    6. End Function


    Also Berechnung1 änderst du natürlich in den Namen, wie die Berechnung heißen soll, Zahl1 und 2 sind die "Angaben", da kannst du natürlich unendlich viele rein geben. Über das ByVal mach dir erstmal keine gedanken ;)

    und nach der Klammer das "as Decimal" steht für den Typen, der Zurück gegeben wird.
    In der Zeile Return Ergebnis, wird die Funktion verlassen und das ergebnis ausgegeben.
    Je nachdem, ob du in deinem Prog mit Double oder Decimal rechnest, musst du ALLE typen hier anpassen.

    Die Funktion kannst du jetzt von jedem Element des Projektes aufrufen :)



    Grüße ausm Bett, bin nämlich krank -.-


    [EDITED]Ich hätte mir nie gedacht, dass ich jemals jemanden bei .NET helfen kann... ich hasse .net nämlich ^^ Naja... solange es dir hilft ;)[/EDITED]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    Danke Dir ganz herzlich! Die "Aufräumaktion" werde ich so vornehmen.

    Ich hätte mir nie gedacht, dass ich jemals jemanden bei .NET helfen kann... ich hasse .net nämlich ^^ Naja... solange es dir hilft


    Warum?
    Wo sind die gravierenden Unterschiede zu 6.0?
    Womit arbeitest Du?
    Habe auch mal bei Delphi reingeschnuppert und da auch ein wenig mehr als "Hallo Welt" gemacht. Finde zwischen den beiden keine wirklich drastischen Unterschiede- sicher oberflächlich betrachtet.

    Wie du ein Modul hinzufügst, weißt du hoffentlich ^^

    Die Hilfedateien sind zwar nicht unbedingt anfängerfreundlich, aber ich habe extra den Laptop mit der geöffneten Hilfe neben dem PC weil ich zu faul bin, ständig zwischen den Fenstern zu switchen ;)
    Und da steht's drin :]

    Auf jeden Fall zunächst einmal Gute Besserung!!!
    Grüße aus Leipzig
    Jens
    Wo sind die gravierenden Unterschiede zu 6.0?
    Womit arbeitest Du?

    Also der Wohl größte und nervigste unterschied ist, dass man für .net eine 20MB (wenn ich mich da nicht irre) große Runtime braucht. ala Java.
    Bei VB 6.0 brauchst du meistens nicht mehr als 1-2 MB zusätzlich im Setup.
    Wobei diese Dateien seit 2k oder XP (nicht sicher) standardmäßig dabei sind.

    Des weiteren stört mich, dass der Umstieg von 6.0 auf .NET ein großer Sprung ist, weil sie die IDE total verändert hat und die Methodern / Funktionen "geordnet" wurden. -> Wenn du weißt wie eine Funktion in 6.0 heißt, suchst du erst mal ne Stunde, bis du sie in .NET hast.
    Des weiteren fehlt die alte Methode Steuerelementarrays zu erstellen usw. usf.

    Ich persönlich verwende hauptsächlich PHP (tut hier aber nichts zur sache) und VB 6.0. - Auch, wenn ich schon einiges in .NET gecodet hab.
    Die PDAs unterschtützen ja nur .net :(


    Habe auch mal bei Delphi reingeschnuppert und da auch ein wenig mehr als "Hallo Welt" gemacht. Finde zwischen den beiden keine wirklich drastischen Unterschiede- sicher oberflächlich betrachtet.

    Hab auch mal mit Delphi angefangen...
    Die Syntax war mir letzendlich dann aber zu unübersichtlich / aufwendig, da man mit VB so ziehmlich das gleiche machen kann.
    Abgesehen davon ist Pascal / Delphi am aussterben, weils von C (was ich demnächst eh lernen muss) verdrängt wird.


    Die Hilfedateien sind zwar nicht unbedingt anfängerfreundlich, ...

    Die .NET - MSDN is fürn *****
    Da geben Seiten wie das Forum hier und vbarchiv.net wesentlich mehr her ;)


    Auf jeden Fall zunächst einmal Gute Besserung!!!

    Danke :)

    Und viel Erfolg noch ;)
    Ging schneller als ich dachte - mit den neuen Problemen...

    Quellcode

    1. Public Function Berechnung1(ByVal Zahl1 As Decimal, ByVal Zahl2 As Decimal) As Decimal
    2. Dim Ergebnis As Decimal
    3. 'Rechenvorgang
    4. Ergebnis = Zahl1 + Zahl2
    5. Return Ergebnis
    6. End Function

    Die Fragen nach der Art der Daten steht ersteinmal nicht, muß mit Decimal rechnen, da es im Zins und Zinseszins geht.
    Meine Frage nun:
    In dem Code wird ja "Ergebnis" berechnet und über Return zurück an die aufrufende Procedur gegeben.
    Vielleicht bin ich da zu doof, aber kann denn die aufrufende Procedur mit der Variablen Ergebnis was anfangen, wenn die Variable in einem Modul deklariert wird? Weißt Du, was ich meine? (Weiß es ja selbst kaum)
    Grüße aus Leipzig
    Jens
    Sorry, war mit meiner Frage zu schnell.
    Klar kann di aufrufnde Procedur mit der Variablen was anfangen:
    Weil da steht

    Quellcode

    1. Dim returnedValue As Decimal = Berechnung1 (Ergebnis)

    So sieht doch der Aufruf der Funktion aus - Richtig?
    habe jetzt auch das ByVal heruasbekommen. Was da steht kann von der aufrufenden Procedur nicht verändert werden - Korrekt?

    Grüsse aus leipzig
    Jens

    Edit by Agent: Keine Dreifachposts in zukunft!
    @Agent
    Verstanden - geht auch über Editieren
    @Mad Andy
    In meinen Modulen wird der Inhalt der Textboxen auf dem Form1 nicht erkannt. muss ich die entsprechenden parameter im Proceduraufruf übergeben?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Jens“ ()