|
| Autor |
Nachricht |
Marduk Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 374
|
How to: Kleiner Editor
Verfasst am: 13.05.2008, 01:36 |
|
|
Mit diesem Tutorial möchte ich euch zeigen wie ihr mit Textdateien arbeiten könnt. Wir werden Dateien speichern und sie anschließend wieder laden.
Anfangen wollen wie mit der Form. Da wir ja etwas in die Datei schreiben wollen, brauchen wir eine Textbox auf unserer Form. Am besten stellt ihr die Eigenschaft "MultiLine" auf true, denn dann können wir mehrzeilige Texte speichern und laden. Zu der Textbox brauchen wir auch zwei Buttons mit denen wir die Events zum Speichern und Laden aufrufen können.
Hier mal ein Beispiel wie die Form aussehen könnte:
 Um den Text der Textbox jetzt zu speichern, müssen wir als erstes in den Code-Modus wechseln, dazu klicken wir auf den Speichern-Button doppelt.
Um den Text zu speichern schreiben wir folgenden Code Visual Basic: [code]Dim outputstream As New IO.StreamWriter("test.txt") outputstream.Write(Textbox1.Text) outputstream.Close()[/code] Zur Erklärung: Wir deklarieren uns zu Beginn einen Stream, dem wir den Dateinamen übergeben. Mit .Write(Textbox.Text) schreiben wir unseren Inhalt der Textbox in den Stream und damit in unsere Datei. Die gespeicherte Datei befindet sich dann in dem Ordner, in dem sich auch unser Programm befindet. Um das zu ändern, kann man anstatt nur dem Dateinamen auch einen Pfad angeben (z.B Dim outputstream As New IO.StreamWriter("C:test.txt")), dann würde die Textdatei auf dem Laufwerk C gespeichert werden.
Das wäre es zum Speichern des Textes, um unseren Text wieder zu öffnen und in unserer Textbox anzuzeigen, klicken wir erstmal doppelt auf den Laden-Button.
Der Code zum Laden sieht dann so aus: Visual Basic: [code]Dim inputstream As New IO.StreamReader("test.txt") Textbox1.Text = inputstream.ReadToEnd() inputstream.Close()[/code] Auch beim Laden wird bei der Deklaration unseres Streams der Dateiname übergeben. Und hier kann man auch wieder einen direkten Pfad angeben. Mit .ReadToEnd() wird der gesamte Inhalt der Datei ausgelesen und vorerst in den Stream geladen. Um ihn aus dem Stream in die Textbox zu bekommen benutzen wir die zweite Codezeile. Und zum Schluss wird der Stream wieder geschlossen (Sollte man nicht vergessen, denn sonst treten bei mehreren und größereren Streams Speicherprobleme auf;))
Wenn wir das Programm jetzt testen, sollte alles wunderbar funktionieren.
Da wir aber unsere gespeicherte Datei auch mal anders benennen wollen und auch andere Dateien öffnen wollen, brauchen wir etwas, mit dem wir die Dateien auswählen können. Und die Lösung heisst OpenFileDialog und SaveFileDialog. Diese zwei Dialoge kennt man zumeist aus diversen anderen Windows-Programmen. Es öffnet sich ein Fenster, in dem man eine Datei aussuchen bzw. speichern kann. Und genau das soll unser Editor auch können. Dazu ziehen wir aus der Toolbox den OpenFileDialog und den SaveFiledialog auf unsere Form. Die zwei Steuerelemente werden nich auf der Form angezeigt, sondern automatisch unten an den Rand gesetzt.
An unserem Code ändert sich nicht viel. Vor den Speicher-Code schreiben wir folgenden Code: Visual Basic: [code]SaveFileDialog1.Filter = "Textdateien|*.txt" SaveFileDialog1.DefExt = "txt" SaveFileDialog1.ShowDialog() Dim sFilePath As String = SaveFileDialog1.FileName[/code] Und für "test.txt" setzen wir "sFilePath" ein. Für den Laden-Code sieht das ganze dann so aus: Visual Basic: [code]OpenFileDialog1.Filter = "Textdateien|*.txt" OpenFileDialog1.ShowDialog() Dim sFilePath As String = OpenFileDialog1.FileName[/code] Und ersetzen wieder "test.txt" durch "sFilePath".
Mit .Filter geben wir an, welche Dateien in dem kleinen Fenster angezeigt werden sollen. Hier werden jetzt nur die Textdateien angezeit und die anderen ausgeblendet. Mit .DefExt geben wir die Dateiendung an, in der die Datei gespeichert werden soll. Da es eine Textdatei werden soll, geben wir "txt" an.
Das war auch schon das ganze Tutorial über unseren kleinen Editor.
Und hier ist noch mal der ganze Code, ein bisschen ordentlicher und verbesserter:
Visual Basic: [code] Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click With SaveFileDialog1 .Filter = "Textdateien|*.txt|Alle Dateien|*.*" .DefaultExt = "vb-x" If .ShowDialog = Windows.Forms.DialogResult.OK And .FileName <> vbNullString Then Dim outputstream As New IO.StreamWriter(.FileName) outputstream.Write(TextBox1.Text) outputstream.Close() End If End With End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click With OpenFileDialog1 .Filter = "Textdateien|*.txt" .DefaultExt = "txt" If .ShowDialog = Windows.Forms.DialogResult.OK And .FileName <> vbNullString Then Dim inputstream As New IO.StreamReader(.FileName) TextBox1.Text = inputstream.ReadToEnd inputstream.Close() End If End With End Sub[/code] |
|
| |
|
 |
Zero Day Tutorial Leser

Anmeldedatum: 10.05.2008 Beiträge: 37
|
Verfasst am: 13.05.2008, 08:36 |
|
|
Vielen Dank genau das habe ich gebraucht hab gestern garnix gebacken bekommen
Das hier ist mein Kleiner Editor bis jetzt Visual Basic: [code]Imports System.IO Public Class Form1
Public Class Form1
End Class
Private Sub NeuToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NeuToolStripMenuItem.Click
TextBox1.Text = ""
End Sub
Private Sub SpeichernToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeichernToolStripMenuItem.Click
With SaveFileDialog1 .Filter = "Ada (*.ada)|*.ada|Assembler (*.asm)|*.asm|ASP (*.asp)|*.asp|AutoIt (*.au3)|*.au3|Batch (*.bat)|*.bat|C (*.c)|*.c|CAML (*.ml)|*.ml|CMAKEFILE (*.cmake)|*.cmake|C++ (*.h)|*.h|C# (*.cs)|*.cs|CSS (*.css)|*.css|Diff(*.diff)|*.diff|Flash Action (*.as)|*.as|Fortran (*.f)|*.f|Haskell (*.hs)|*.hs|HTML (*.html)|*.html|INI (*.ini)|*.ini|Java (*.java)|*.ajav|JavaScript (*.js)|*.js|KiXtart (*.kix)|*.kix|Lisp (*.lsp)|*.lsp|Lua (*.lua)|*.lua|Makefile (*.mak)|*.mak|MATLAB (*.m)|*.m|NFO (*.nfo)|*.nfo|NSIS (*.nsi)|*.nsi|Pascal (*.pas)|*.pas|Perl (*.pl)|*.pl|PHP (*.php)|*.php|PostScript (*.ps)|*.ps|Properties File (*.properties)|*.properties|Python (*.py)|*.py|RC (*.rc)|*.rc|Ruby (*.rb)|*.rb|Sheme (*.scm)|*.scm|Shell (*.sh)|*.sh|SmallTalk (*.st)|*.st|SQL (*.sql)|*.sql|TCL (*.tcl)|*.tcl|TeX (*.tex)|*.tex|Text (*.txt)|*.txt|Visual Basic (*.vb)|*.vb|Verilog (*.v)|*.v|VHDL (*.vhd)|*.vhd|XML (*.xml)|*.xml|YAML (*.yml)|*.yml" .DefaultExt = "vb-x" If .ShowDialog = Windows.Forms.DialogResult.OK And .FileName <> vbNullString Then Dim outputstream As New IO.StreamWriter(.FileName) outputstream.Write(TextBox1.Text) outputstream.Close()
End If
End With
End Sub
Private Sub ÖffnenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÖffnenToolStripMenuItem.Click
With OpenFileDialog1 .Filter = "Alle Dateien|*.*" .DefaultExt = "txt" If .ShowDialog = Windows.Forms.DialogResult.OK And .FileName <> vbNullString Then Dim inputstream As New IO.StreamReader(.FileName) TextBox1.Text = inputstream.ReadToEnd inputstream.Close()
End If
End With
End Sub
Private Sub InformationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InformationToolStripMenuItem.Click MsgBox("Coded by Zero Day", MsgBoxStyle.OkOnly, "About") End Sub
Private Sub KopiernToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KopiernToolStripMenuItem.Click
My.Computer.Clipboard.Clear() My.Computer.Clipboard.SetText(TextBox1.Text) If My.Computer.Clipboard.ContainsText Then TextBox1.Text = My.Computer.Clipboard.GetText End If
End Sub
Private Sub EinfügenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EinfügenToolStripMenuItem.Click
Dim data_object As New DataObject data_object.SetData(DataFormats.Text, TextBox1) Clipboard.SetDataObject(data_object)
End Sub End Class [/code]
Ich muss das mit dem Einfügen noch schauen und Ausschneiden dann bin ich fertig 
Kann man diese Functions vllt kürzer und besser durch HotKeys lösen ??? |
|
| |
|
 |
Marduk Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 374
|
Verfasst am: 13.05.2008, 17:49 |
|
|
Kann man diese Functions vllt kürzer und besser durch HotKeys lösen ??? |
Kürzer heisst nicht unbedigt besser Also der Code ist schon soweit optimiert, da kann man nicht mehr viel verbessern, zudem ist er sowieso sehr kurz und fällt bei der Geschwindigkeit nicht ins Gewicht |
|
| |
|
 |
speedywolf Poster

Anmeldedatum: 01.05.2008 Beiträge: 108
|
Verfasst am: 13.05.2008, 19:14 |
|
|
Voraus: Habs nicht so mit vb.net^^
Bei mir kommt immer dieser Fehler, was ich nicht verstehe (sry):
Der Name "OpenFileDialog1" wurde nicht deklariert. Der Name "SaveFileDialog1" wurde nicht deklariert. |
|
| |
|
 |
Marduk Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 374
|
Verfasst am: 13.05.2008, 19:31 |
|
|
Du musst aus der Toolbox das OpenFileDialog-Element (bzw. das SaveFileDialog-Element) auf deine Form ziehen. Dann funktioniert es. Alternativ kannst du auch den Code hier, in die einzelnen Subs schreiben. Dann werden die Dialoge per Code erstellt. Visual Basic: [code]Dim SaveFileDialog As New SaveFileDialog() 'bzw. Dim OpenFileDialog As New OpenFileDialog()[/code] |
|
| |
|
 |
speedywolf Poster

Anmeldedatum: 01.05.2008 Beiträge: 108
|
Verfasst am: 13.05.2008, 19:35 |
|
|
Okay vielen Dank Funzt alles super!
Langsam gefällt mir VB.NET 2008 :p Meine Frage:
Wie kann ich jetzt machen, wenn man das Programm startet, statt Speichern, Erstellen steht und wenn man erstellt hat, statt erstellen, speichern steht?^^
Wenn ihr nicht draus kommt was ich meine, kann ich es mit Bilder zeigen :p |
|
| |
|
 |
Marduk Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 374
|
Verfasst am: 14.05.2008, 20:40 |
|
|
Ich würde mir ne globale Variable deklarieren vom Typ Boolean. Danach bei Form1_Load die Variable auf false setzen. Und dann folgenden Code bei dem Button:
Visual Basic: [code]Dim var As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button2.Text = "Speichern" var = False End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'false = Speichern aktiv und Laden inaktiv 'true = Speichern inaktiv und Laden aktiv
If var = False Then 'wird gespeichert danach alles auf Laden stellen Button2.Text = "Laden" var = True Else 'wird geladen und alles auf Speichern stellen Button2.Text = "Speichern" var = False End If End Sub[/code]
Ok, bei mir steht jetzt am Anfang Speichern, musst halt vertauschen  |
|
| |
|
 |
speedywolf Poster

Anmeldedatum: 01.05.2008 Beiträge: 108
|
Verfasst am: 14.05.2008, 20:51 |
|
|
Vielen Dank Marduk! Boah.. VB.NET is ja mal saugeil x)
Edit: Kann man eignetlich bei den txt Dateien Tags verwenden? Z.B: [ b] [/ b] etc.? |
|
| |
|
 |
Mr.BurnZ Newbie

Anmeldedatum: 22.05.2008 Beiträge: 3
|
Verfasst am: 22.05.2008, 17:46 |
|
|
| Hey, kann man auch irgend wie eine Suche aktivieren so wie im Normalen Editor mit Strg+F und alles Makieren mit Strg+A ? |
|
| |
|
 |
tr4st Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 486
|
Verfasst am: 22.05.2008, 18:40 |
|
|
@speedywolf: Nein. @Mr.BurnZ: Müsstest du dir zusätzlich einbauen, KeyEvents abfangen. |
|
| |
|
 |
Marduk Überflieger

Anmeldedatum: 16.04.2008 Beiträge: 374
|
Verfasst am: 24.05.2008, 18:48 |
|
|
@speedywolf: Eine Textbox unterstützt es nicht, da müsstest du schon eine RichTextBox verwenden, mit der du solche Sachen machen kannst. @Mr.Burnz: Wie Daniel schon gesagt hat, müsstest du mit den Events spielen. Strg+A wird aber auch von der normalen Textbox unterstützt. |
|
| |
|
 |
ShadowLenny Tutorial Leser

Anmeldedatum: 25.05.2008 Beiträge: 54
|
Verfasst am: 20.07.2008, 19:37 |
|
|
Kann ich hier noch reinposten? (Thread ist ja schon ein wenig älter.)
Wollte nur mal ganz groß DANKE sagen!
Das, was du am Anfang gemacht hast, also das, was eigentlich total unkomfortabel ist und wo man keinen eigenen Namen eingeben kann...
danach habe ich schon voll lange gesucht!
Tausend dank  |
|
| |
|
 |
|
|