1. Datei >> Neu 2. Beim Beenden Speichern abfragen 3. Autosave

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    1. Datei >> Neu 2. Beim Beenden Speichern abfragen 3. Autosave

    Hi,

    ich suche jetzt schon seit zwei Tagen nach einer Lösung (in google und hier), aber langsam weiß ich einfach nicht mehr, was für Suchbegriffe ich eingeben soll. Ich programmiere gerade (zur Übung - ich bin noch absoluter Noob) einen kleinen Texteditor, dabei habe ich drei Probleme.

    1. Ich habe ein Menü aufgebaut und möchte, dass sich (wenn ich auf "Neu" klicke) wie bei Word, oder Notepad oder sonst einem Programm, ein neues Textfenster öffnet.
    Aber alle Methoden, die ich bisher im Netz gefunden habe, machen einfach nur das aktuelle Texteingabefenster leer ... das ist aber nicht Sinn der Sache.
    (Mir würde auch schon ein Suchbegriff helfen :( )

    2. Ich möchte, dass er beim Beenden/Schließen des Fensters mit der Richtextbox guckt, OB etwas geändert wurde und FALLS ja, soll er nachfragen, ob er die Datei speichern soll.
    Dazu habe ich bisher nur diesen Thread gefunden: [VB 2008] Vor Schließen des Formulars "Datei speichern" aufrufen
    Aber erstens überprüft der nicht, was schon geändert wurde, zweitens ist der für 2008 (ich hab noch nicht raus, wie groß die Unterschiede zu 2010 sind) und drittens verstehe ich nicht, was genau in DatenSpeichern() rein soll, bzw. wie/wo man die deklariert/definiert.

    3. Würde ich gerne einen Autosave einbauen, dass also alle 10 Minuten die Datei automatisch gespeichert wird, dazu hab ich aber noch gar nichts gefunden und auch wieder das problem, dass ich nicht genau weiß wonach ich suchen soll.

    Ich hoffe meine Fragen sind nicht allzu dämlich, ich hab mich wirklich, wirklich dusslig gesucht und bin für jeden noch so kleinen Tipp oder Link dankbar
    rumpel
    Hey,
    ich versuch dir jetzt erstmal beim 2. Punkt zu Helfen.
    Versuchs einfach mal mit folgendem Code:

    VB.NET-Quellcode

    1. If RichTextBox1.Modified Then
    2. Dim frage As DialogResult = MessageBox.Show("Möchten sie ihre Änderungen speichern?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
    3. If frage = DialogResult.Yes Then
    4. 'speichern
    5. Elseif
    6. Application.exit
    7. End if


    Auch wenns jetzt nicht nach der Reihenfolge ist ;)
    Zum ersten kannst du ganz einfach eine neue Instanz deiner Form machen und die öffnen lassen.

    Sollte eigentlich funktionieren wenn man da sentsprechend anpasst.
    Ich sehe gerade das es VB2010 bei dir ist, sollte aber trotzdem funktionieren.

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

    Rumpel schrieb:

    1. Ich habe ein Menü aufgebaut und möchte, dass sich (wenn ich auf "Neu" klicke) wie bei Word, oder Notepad oder sonst einem Programm, ein neues Textfenster öffnet.
    Aber alle Methoden, die ich bisher im Netz gefunden habe, machen einfach nur das aktuelle Texteingabefenster leer ... das ist aber nicht Sinn der Sache.
    (Mir würde auch schon ein Suchbegriff helfen :( )

    Wie kann man googlen wenn man nicht einmal weiss wonach man suchen muss, ich kenne das Problem. Hier heist vermutlich Dein Suchbegriff "MDI Fenster", eine Anleitung (leider auf englisch) gibt es hier, aber im Forum gibt es einiges dazu. Im Wesentlichen werden beliebig viele neue Fenster innerhalb Deiner Hauptform geöffnet, schau Dir mal die Bilder an ob das Dein Problem löst.

    Du musst also Dein Hauptfenster als "MDI-Container" deklarieren, eine 2.Form deklarieren mit Deiner RichTextBox und diese Form beim Klicken auf "Neu" neu erzeugen und mit .show anzeigen. Genauer steht es im Beispiel oben.

    2. Ich möchte, dass er beim Beenden/Schließen des Fensters mit der Richtextbox guckt, OB etwas geändert wurde und FALLS ja, soll er nachfragen, ob er die Datei speichern soll.

    Ob sich Dein Text geändert hast kannst Du feststellen, indem Du im TextChanged Event Deiner RichTextBox Dir eine Boolsche Variable auf true setzt. Das Sichern der Datei fragst Du wie bei Dominic oder Deinem Beispiel im Form-Closing event Deiner MDI-Form (Form2) ab. Nur nicht gerade Application.Exit aufrufen ;)
    Wie Du den Namen festlegst (InputBox) überlasse ich Dir.

    3. Würde ich gerne einen Autosave einbauen, dass also alle 10 Minuten die Datei automatisch gespeichert wird, dazu hab ich aber noch gar nichts gefunden und auch wieder das problem, dass ich nicht genau weiß wonach ich suchen soll.

    Entweder mit einem timer pro MDI-Fenster (unschön), oder mit 1 Timer in Deiner Hauptform bei der Du alle MDI-Fenster durchgehst und die Richtextboxen sicherst.

    Hoffe ich habe Dir genug zum googeln gegeben: Isch abe fertisch ...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Kangaroo“ ()

    Erst einmal Danke für die ersten Antworten.

    @Dominic
    Jipp, das für 2. sieht ganz okay aus, aber du hast jetzt eigentlich nur
    Speichern()
    Durch den Kommentar
    'Speichern
    ersetzt, ... mich würde halt interessieren was Speichern() genau ist (Funktion? Klasse?) und (weil die wohl selbst geschrieben ist) wie/wo ich die erzeugen kann/soll/muss.

    Was meinst du mit "instanzen erzeugen" immer wenn ich versuche aus Form1 wieder Form1 aufzurufen, ärgert er sich und sagt, dass das nicht geht ^^'

    @Kangoroo
    Also, das sieht schon mal ziemlich, ziemlich gut aus, mit dem MDI. Allerdings bin ich mir noch nicht hundertprozentig sicher, ob der wirklich tut, was ich will. So wie das da auf den Bildern aussieht, wird quasi ein Elternelement erzeugt und in diesem Fenster drin werden dann Kinder gemacht :P also eher so wie z.B. bei Photoshop. Problem wäre nur, wenn ich die Kinder nicht rausverschieben kann, bin ich so eingeschränkt. Bei Word z.B. kann ich beliebig viele Fenster erzeugen und die komplett unabhängig voneinander auf meinem Desktop durch die Gegend schieben. Verstehst du, was ich meine??

    EDIT: Ohhh, da kam ja noch mehr. Wow, ja, tatsächlich, einiges zum Googlen dabei :D danke auf jeden Fall. *trotzdem auf die Frage nach den rausverschiebbaren Kindern schielt*

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

    Rumpel schrieb:

    Verstehst du, was ich meine??

    Natürlich: dann lässt Du das mit dem MDI-Container einfach weg und erzeugst das Fenster einfach nur so neu und zeigst es ebenso mit .Show an. Dann hängst das irgendwo auf dem Desktop rum.

    Aber wieso engt Dich das mit dem MDI ein ? Wenn Deine Hauptform "sizeable" ist, Du sie also per Ziehen so gross oder klein machen kann wie Du willst hast Du doch genug Platz. Aber das kannst Du ja selber lösen wie Du möchtest, ist halt Geschmacksfrage.
    Also mit Instanz mein ich ganz einfach das:

    VB.NET-Quellcode

    1. Dim fenster As New Form1
    2. fenster.Show()


    Aber ist denke ich mal zu einfach :D

    Für das Speichern:

    Da kannst du eine Funktion machen wie zum Beispiel diese hier:

    VB.NET-Quellcode

    1. Private Function Speichern() As Boolean
    2. Dim dlgFileSave As New SaveFileDialog()
    3. dlgFileSave.Title = "titel"
    4. dlgFileSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    5. dlgFileSave.Filter = "Textdateien (*.txt)|*.txt|HTML-Dokument (*.html)|*.html|Alle Dateien (*.*)|*.*"
    6. If dlgFileSave.ShowDialog() = DialogResult.OK Then
    7. Dim writer As New StreamWriter(dlgFileSave.FileName)
    8. If Not (writer Is Nothing) Then
    9. writer.Write(RichTextBox1.Text)
    10. writer.Close()
    11. End If
    12. End If
    13. End Function


    Und dann rufst du diese Funktion einfach durch Speichern() auf.
    @Kangaroo

    Kangaroo schrieb:

    Rumpel schrieb:

    Verstehst du, was ich meine??

    Natürlich: dann lässt Du das mit dem MDI-Container einfach weg und erzeugst das Fenster einfach nur so neu und zeigst es ebenso mit .Show an. Dann hängst das irgendwo auf dem Desktop rum.

    Tut mir leid, das versteh ich leider nicht. was heißt "erzeug das Fenster einfach nur so neu"? Bzw. wie geht das? *steht wohl auf dem Schlauch*?

    Kangaroo schrieb:


    Aber wieso engt Dich das mit dem MDI ein ? Wenn Deine Hauptform "sizeable" ist, Du sie also per Ziehen so gross oder klein machen kann wie Du willst hast Du doch genug Platz. Aber das kannst Du ja selber lösen wie Du möchtest, ist halt Geschmacksfrage.
    Mein "Problem" mit dem "sizeable" Elternteil ist, dass ich immer gerne viele Programme aufhabe, besonders wenn ich so ein Textprogramm zum Notizen machen benutzen will und dann muss ich den Eltern kleiner machen und wenn dann zwei Fenster drin offen sind, wird's schon eng ... außerdem ist es ja eine Übung und mein grobes Vorbild ist Word und da geht das nun mal mit den einzeln verschiebbaren Fenstern :P

    @Dominic

    Hmm .. ich hab ja gerade gelernt, dass es MDI gibt und dass das wahrscheinlich die Lösung ist, .. aber das mit den Instanzen schau ich mir dann auch gleich noch mal an ..

    Auf jeden Fall danke, danke, danke für das Speicherndings (sieht sogar ziemlich fast genau so aus, wie das was ich scho habe, nur dass ich jetzt auch weiß, wie man Funktionen schreibt :D )

    @Alle
    Ich glaub ich hab hier in zwei Minuten mehr gelernt, als in zwei Tagen Websuche 8|

    Rumpel schrieb:

    Hmm .. ich hab ja gerade gelernt, dass es MDI gibt und dass das wahrscheinlich die Lösung ist, .. aber das mit den Instanzen schau ich mir dann auch gleich noch mal an ..

    Ich hoffe ich habe Dich nicht zu sehr verwirrt: MDI brauchst Du nur wenn Du Deine Kinder in der Hauptform einsperren willst. Ansonsten legst Du Form mit Deiner Richtextbox nur neu an und zeigst sie mit Show

    VB.NET-Quellcode

    1. Class Form1
    2. private frm2 as Form2 <-- Form2 ist separat definiert und hat eine RichTextbox
    3. ' so erzeugt man ein neues Kindfenster
    4. Sub NeueForm2()
    5. frm2=new Form2
    6. frm2.show()
    7. End Sub
    8. End Class ' Form1

    Mach Dir doch schnell eine kleine Test-Anwendung mit 1 Button, 1 Hauptform und 1 Kinderform (Form2) und probiers aus
    @Kangaroo
    Sooo, also das mit deinem letzten Codeschnipseln funktioniert soweit schon einmal suuuper :D
    Was ich daran nur leider nicht verstehe:
    Kann ich das nur aus dem Hauptfenster/Elternfenster aus aufrufen?
    Bzw. was muss ich tun, damit ich das auch aus dem Kindelement selbst heraus aufrufen kann?
    Mit globalen und lokalen und weiß nicht wie Variablen und Funktionen hab ich nämlich noch so meine Probleme (php hat sowas alles nicht)

    @Dominic
    Das mit dem Speichern üben kommt dann als nächste dran.
    achso, ok
    dann hab ich das falsch verstanden ;)

    Ich dachte weil ich ein bisschen weiter oben geschrieben habe "...habe wieder was dazugelernt...", dass du meinst das ich jetzt Speichern lernen soll xD
    Naja ich wünsch dir viel Spaß und erfolg dabei :thumbup:

    Rumpel schrieb:

    Was ich daran nur leider nicht verstehe:
    Kann ich das nur aus dem Hauptfenster/Elternfenster aus aufrufen?
    Bzw. was muss ich tun, damit ich das auch aus dem Kindelement selbst heraus aufrufen kann?
    Mit globalen und lokalen und weiß nicht wie Variablen und Funktionen hab ich nämlich noch so meine Probleme (php hat sowas alles nicht)

    Prinzipiell kannst Du auch aus der (Kinder)Form2 wieder ein neues Fenster erzeugen. Hat allerdings einen geringfügigen Nachteil: wenn Du eine Kinderform schliesst, so "sterben" auch alle deren Kindeskinder, Urenkel und Grossurenkel ....

    Wenn Du neu in VB.Net ist , so kann man Dir nur wärmstens das Galileo-Openbook empfehlen: vieles wird Dir bekannt sein, aber generell ist es gut geschrieben und deckt weite Bereiche von .NET ab.

    Rumpel schrieb:

    Hmmm .. und ich kann dem Kind nicht sagen, dass es ein Geschwister (also wieder ein Kind des Eltern) erzeugen soll?

    ts, ts, ... versuch mal Deiner Schwester zu sagen sie soll Dir einen Bruder erzeugen :P

    Aber Du kannst es Deinen Eltern sagen: in diesem Fall rufst Du die Form1-Methode "neueForm2" auf:

    VB.NET-Quellcode

    1. Form1.neueForm2()
    OT

    Kangaroo schrieb:

    ts, ts, ... versuch mal Deiner Schwester zu sagen sie soll Dir einen Bruder erzeugen :P

    Hmmm ... das wäre ja dann inzucht ... also ist VB nur ein sehr moralisches Programm :P
    /OT

    Kangaroo schrieb:

    Aber Du kannst es Deinen Eltern sagen: in diesem Fall rufst Du die Form1-Methode "neueForm2" auf:

    Und die so erzeugten Kinder sterben dann nicht, wenn ich das Kindelement, dass sie (über die Eltern) erzeugt hat wieder schließe?

    -------
    So, jetzt ist mir der PC mit dem VB abgeschmiert (liegt wahrscheinlich an der Hardware) und ich darf erst mal Onkel Doktor spielen ... Dann wohl bis heute Abend, ich sag dann, ob alles geklappt hat, auf jeden Fall schon mal Danke für die bisher wirklich super hilfreichen Antworten!

    lg
    Rumpel
    Okay, ich übe gerade speichern, aber irgendetwas mache ich falsch.

    Mein Code:

    VB.NET-Quellcode

    1. Private Function DateiSpeichern() As Boolean
    2. ' Erzeuge ein SaveFileDialog
    3. Dim SaveFile1 As New SaveFileDialog()
    4. SaveFile1.Title = "Speichern"
    5. SaveFile1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    6. ' legt Dateierweiterung fest
    7. SaveFile1.Filter = "RichText [*.rtf*]|*.rtf|Text [*.txt*]|*.txt|Alle Dateien [*.*]|*.*"
    8. ' Wenn Datei ausgewählt
    9. If (SaveFile1.ShowDialog() = System.Windows.Forms.DialogResult.OK) _
    10. And (SaveFile1.FileName.Length > 0) Then
    11. ' Dann speichern
    12. RichTextBox1.SaveFile(SaveFile1.FileName)
    13. End If
    14. End Function

    Also, es gibt zwar keinen Fehler, aber es gibt eine Warnung:

    Warnung! schrieb:

    Die DateiSpeichern-Funktion gibt nicht für alle Codepfade einen Wert zurück. Fehlt eine Return-Anweisung?
    Private Function->Private Sub
    As Boolean in der ersten Zeile ganz weg...
    du gibst hier keinen Wert(mit Return) zurück, somit benötigst du keine Funktion, sondern eine Methode...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---