Zelf kladblok maken 1. Inleiding
2. Lay-out
3. Menu "Menu"
4. Menu "Bewerken"
5. Extra
6. besluit
1. Inleiding
Welkom.
In deze tutorial ga ik uitleggen hoe je een eigen simpele kladblok maakt. Onze eigen kladblok
zal enkele nuttige functionaliteiten bevatten maar niet echt geavanceerd zijn. Enkele van deze
functionaliteiten zijn: tekstbestanden openen en bewaren, een menutje met opties zoals 'knippen'
en 'plakken'. Niet echt veel moeilijk, maar het moet toch uitgelegd worden. Stap voor stap gaan we
van een lege Form naar het eindresultaat. Enige kennis over het werken met WindowsForm is wel een
vereiste. Indien je die niet hebt kan je beter even eerst mijn tutorial over het werken met
Forms
lezen. Dat maakt het hier al een stuk gemakkelijker. Genoeg inleiding nu, tijd voor het echte werk!
top
2. Lay-out
Open een nieuw project en kies voor een "WindowsApplication". Je geeft het een naam, kiest de locatie
en zorg dat "Create directory for solution" staat AANgevinkt. Klik daarna op OK. Je zal zien dat er
een lege Form wordt gemaakt. Als je met de rechtermuisknop klikt kan je kiezen voor "View Code".
Als je in C# werkt zal je zien dat er al een stuk code staat, in VB.NET staat er enkel de definitie
van je klasse. Dat maakt niet veel uit, de lay-out. Wat hebben we nodig?
- TextBox
- MenuStrip (uitleg volgt nog)
- saveFileDialog (uitleg volgt nog)
- openFileDialog (uitleg volgt nog)
Meer eigenlijk niet. Eerst zeten we nog enkele eigenschappen van de Form zelf. Het eigenschappen venster
kan je tonen via het menu "View" en dan "Properties Window". Stel als size 800 op 600, de FormBorderStyle
zet je op "FixedSingle", en de Text op "Mini Kladblok" of iets dergelijks, zet ook de MaximizeBox op "False".
Gebruik nu de sneltoets: Ctrl + Alt + x. Je ziet links de ToolBox verschijnen. Van hieruit kunne we de
Controls slepen op onze Form. Sleep vanuit het submenu "Menus & Toolbars" een MenuStrip naar de Form en
vanuit "Common Controls" een TextBox. Als je de TextBox geselecteerd hebt zie je rechtsboven een pijltje.
Klik hierop en vink de optie "Multiline" aan. Zet de Name eigenschap van de TextBox op "area" of iets
wat je zelf wilt, zet ook de Dock eigenschap op "Fill", dit is het middenste van de knoppen dat je ziet
als je deze optie wilt wijzigen. Zet de Name van de menuStrip op "menu". Sleep nu nog als laatste vanuit het
submenu "Dialogs" een openFileDialog en saveFileDialog naar je Form. Zet de Name eigenschap ervan op "bewaarForm"
en "openForm". Zoals je wel al zult gemerkt hebben staan er 3 icoontje vanonder aan je scherm. Deze staan daar
zodat ze niet in de weg zitten voor je Form. Nu moeten we enkel nog items aan ons menu toevoegen. Je zal zien
dat er kadertje komt met de tekst "Type here". Hier komen de namen van de menu's. Zorg dat je een menu "Menu"
en "Bewerken" hebt. Als deze er zijn klik je een keer op een menu-item en dan komt daaronder hetzelfde. Hier
voeg je voor het menu "Menu" de volgende items toe: Nieuw, Openen, Bewaren, Afsluiten. En voor het menu "Bewerken
zorg je voor: Ongedaan maken, Alles selecteren, Kopieren, Knippen, Plakken. Veel uitleg maar ik denk dat een
afbeelding ook veel duidelijkheid schept. Mijn lay-out ziet er zo uit:
Nu kan je je project al eens testen door te kiezen voor het menu "Debug" en dan "Start Debugging" of druk op F5.
Als alles correct is moet je nu een Form zien die niet resizable of maximaliseerbaar is. Je hebt je menu met
alle items daarin en een tekstvak dat de rest van de Form vult. Nu dat alles (eindelijk) klaar is kunnen we
met de code beginnen om alles te doen werken.
Nog iets: zorg dat je deze libraries hebt ingeldaen in je codefile:
C# | VB.NET |
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Diagnostics;
using System.Threading;
using System.IO;
|
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Text
Imports System.Windows.Forms
Imports System.Reflection
Imports System.Diagnostics
Imports System.Threading
Imports System.IO
|
top
3. Nieuw bestand, Bestand opslaan / openen
Het eerste wat we moeten doen is kijken of onze tekst is gewijzigd. Als dit niet het geval is kunnen we zonder
probleem het programma sluiten of een nieuw bestand aanmaken. Dit kunnen we nagaan door het event "TextChanged",
dat zal geactiveerd worden wanneer de tekst van ons tekstvak gewijzigd wordt. Hiervoor gebruiken we een boolean.
Als er wijzigingen zijn zetten we hem op 'true' en anders op 'false'. Dubbelklik op het tekstvak en een event
hiervoor wordt automatisch gemaakt. Zorg dat de code er zo uit ziet:
C# | VB.NET |
bool wijziging = false; private void area_TextChanged(object sender, EventArgs e) { wijziging = true; }
|
Dim wijziging As
Boolean = False Private Sub area_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles area.TextChanged wijziging = True End Sub
|
Nu dit klaar is kunnen we de code voor de menu-items gaan doen. We gaan stap voor stap alle items doen en beginnen
bij het menu "Menu". Het eerste item is "Nieuw". Ga naar je Form en dubbelklik op dat menu-item. Een event wordt aangemaakt.
Hierin zet je de volgende code:
C# | VB.NET |
if (bewaard()) { area.Text = ""; wijziging = false; }
|
If bewaard() = True Then area.Text = "" wijziging = False End If
|
Je ziet in het if-statement staan: bewaard(). Deze functie heeft als return-waarde een boolean.
Als er wijzigingen zijn ga je naar die functie die nakijkt of het bestand
al bewaard werd of niet. Je krijg dan MessageBox, je kan dan kiezen tussen 'Yes', 'No' of 'Cancel'. Bij 'Yes' wordt je
door gestuurd naar de functie "bewaren()" (code volgt), bij 'No' wordt alles genegeerd en maak je een nieuw bestand
en 'Cancel' spreekt voor zich: er gebeurt niets. Hier is de code van de functie "bewaard()":
C# | VB.NET |
private Boolean bewaard() { if (wijziging) { DialogResult dlg_res; dlg_res = MessageBox.Show("Er zijn wijzigingen. Wilt u deze opslaan?", "Wijziging", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
if (dlg_res == DialogResult.Yes) { return bewaren(); } if (dlg_res == DialogResult.No) { wijziging = false; return true; } if (dlg_res == DialogResult.Cancel) { return false; } }
return true; }
|
Private Function bewaard() As Boolean
If wijziging = True Then Dim dlg_res As DialogResult dlg_res = MessageBox.Show("Er zijn wijzigingen. Wilt u deze opslaan?", "Wijziging", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
If dlg_res = DialogResult.Yes Then Return bewaren() End If If dlg_res = DialogResult.No Then wijziging = False Return True End If If dlg_res = DialogResult.Cancel Then Return False End If End If Return True
End Function
|
Hieronder volgt de code voor de functie "bewaren()", ook deze geeft als return-waarde een boolean. Deze functie wordt
enkel opgeroepen indien we kiezen voor 'Yes' als ons gevraagd wordt om de wijzigingen op te slaan. In deze code gaan we
de saveFileDialog oproepen en weergeven, we zetten de standaardlocatie op de C-schijf. Als er toch geannuleerd wordt
gaan we gewoon terug naar onze kladblok. Indien we wel willen bewaren halen we de bestandsnaam op en maken we een
StreamWriter aan. Deze zorgt ervoor dat we tekstbestanden kunnen aanmaken. We maken via de StreamWriter een tekstbestand
aan met als naam onze gekozen naam en schrijven de inhoud van ons tekstvak naar het bestand, nadie maken we de
StreamWriter leeg en zetten we de wijziging terug op 'false' en returnen we 'true' (bestand bewaard). Het geheel
zit in een try-catch blok om fouten tijdens dit proces op te vangen en netjes weer te geven, anders loopt het programma
vast als er iets mis gaat. Er staat hier ook een tutorial over Foutafhandeling in .NET!
Hier is de code voor de functie "bewaren()";
C# | VB.NET |
private Boolean bewaren() { string filename; try { DialogResult dlg_res; saveFileDialog1.InitialDirectory = "C:"; dlg_res = saveFileDialog1.ShowDialog();
if (dlg_res == DialogResult.Cancel) { wijziging = true; return false; }
filename = saveFileDialog1.FileName; StreamWriter filesave = new StreamWriter(filename); filesave.WriteLine(area.Text); filesave.Flush(); filesave.Close(); wijziging = false; return true; } catch (Exception x) { MessageBox.Show(x.Message, "Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } }
|
Private Function bewaren() As Boolean
Dim filename As String Try Dim dlg_res As DialogResult saveFileDialog1.InitialDirectory = "C:" dlg_res = saveFileDialog1.ShowDialog()
If dlg_res = DialogResult.Cancel Then wijziging = True Return False End If
filename = saveFileDialog1.FileName Dim filesave As StreamWriter = New StreamWriter(filename) filesave.WriteLine(area.Text) filesave.Flush() filesave.Close() wijziging = False Return True
Catch x As Exception
MessageBox.Show(x.Message, "Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False
End Try
End Function
|
De functie bewaren zouden we ook in het event van het item "Bewaren" kunnen steken, maar als we dit doen moeten we de functie
twee keer schrijven. Een keer in het event van het menu-item en een keer waneer er wijzigingen zijn. Dat is geen nette code
Het enige wat we nu dus moeten zetten in het event van het menu-item "Bewaren", is de aanroep naar de functie "bewaren()". Zo dus:
C# | VB.NET |
bewaren();
|
bewaren()
|
Nu we nieuwe bestanden kunnen aanmaken en bewaren, moet we er reeds bestaande kunnen openen.
Dubbelklik op het item "Openen" van het menu "Menu" Het event wordt weer aangemaakt. Nu gaan we dus
gebruik maken van de openFileDialog. We kijken weer eerst of er geen wijzigingen zijn. In de Dialog zorgen we
dat er alleen tekstbestanden laten zien worden, zodat er geen verkeerde bestanden kunnen geopend worden.
Daarna gaan we via een try-catch blok het bestand uitlezen en de inhoud ervan in ons tekstvak plaatsen. We
geven dan ook nog mee dat er geen wijzigingen zijn, als er iets misgaat wordt er een Messagebix getoond met
een bericht over wat er misliep. Hier is de code voor het openen van een tekstbestand:
C# | VB.NET |
if (bewaard()) { openFileDialog1.FileName = ""; openFileDialog1.Filter = "Tekstbestanden(*.txt)|*.txt"; openFileDialog1.ShowDialog();
try { if (File.Exists(openFileDialog1.FileName)) { StreamReader lezen = File.OpenText(openFileDialog1.FileName); area.Text = lezen.ReadToEnd(); } wijziging = false; } catch (Exception x) { MessageBox.Show(x.Message); } }
|
If bewaard() = True Then openFileDialog1.FileName = "" openFileDialog1.Filter = "Tekstbestanden(*.txt)|*.txt" openFileDialog1.ShowDialog()
Try If File.Exists(openFileDialog1.FileName) Then Dim lezen As StreamReader = File.OpenText(openFileDialog1.FileName) area.Text = lezen.ReadToEnd() wijziging = False End If Catch x As Exception MessageBox.Show(x.Message) End Try End If
|
Het enige item dat er nog in het menu "Menu" zit is "Afsluiten". Dubbelklik op het item "Afsluiten" in het menu.
Ook hier gaan we weer controleren of er wijzigingen zijn aangebracht. Zo ja gaan we eerst vragen om te bewaren,
zo niet kunnen we gewoon afsluiten. Dit is maar een kort stukje code:
C# | VB.NET |
if (bewaard()) { Application.Exit(); }
|
If bewaard() = True Then Application.Exit() End If
|
Hiermee zit het moeilijkste stuk van deze tutorial er op. Je kan al eens wat gaan testen met al deze menu-items en
kijken of alles naar behoren werkt. Normaal zou dit het geval moeten zijn. In het volgende stuk bespreken we het menu "Bewerken".
top
4. Menu "Bewerken"
Hier zou je ook voor elk item een apart event kunnen aanmaken, maar omdat er zo weinig gebeurt in een enkel event
plaatsen we alle code die moet kunnen uitgevoerd worden in 1 event. We noemen het event "bewerken_KeuzeChanged".
LET OP: niet gaan dubbelklikken op elk menu-item dus! Je klikt op het eerste item 1 keer en gaat dan bij de eigenschappen
kijken en je zite boven de lijst met eigenschappen enkele knoppen staan. Je klikt op dat bliksem-knopje en zoekt
naar "Click". Als je die gevonden hebt plaats je er de naam van ons event in. Dit doe je ook voor de andere items van het menu.
Zoals je kan zien wordt er opgehaald welk menu-item dat er gekozen is en wordt de jusit if uitgevoerd.
De volledige code van dat iemand moet er dan als volgt uitzien:
C# | VB.NET |
private void bewerken_KeuzeChanged(object sender, EventArgs e) { if (sender.ToString() == "Ongedaan maken") area.Undo(); if (sender.ToString() == "Alles selecteren") area.SelectAll(); if (sender.ToString() == "Kopiëren") Clipboard.SetDataObject(area.SelectedText, true); if (sender.ToString() == "Knippen") area.Cut(); if (sender.ToString() == "Plakken") { IDataObject tekst = Clipboard.GetDataObject(); if (tekst.GetDataPresent(DataFormats.Text)) { area.SelectedText += (string)tekst.GetData(DataFormats.Text); } } }
|
Private Sub bewerken_KeuzeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ongedaanMakenToolStripMenuItem.Click, plakkenToolStripMenuItem.Click, kopiërenToolStripMenuItem.Click, knippenToolStripMenuItem.Click, allesSelecterenToolStripMenuItem.Click
If sender.ToString() = "Ongedaan maken" Then area.Undo() End If If sender.ToString() = "Alles selecteren" Then area.SelectAll() End If If sender.ToString() = "Kopiëren" Then Clipboard.SetDataObject(area.SelectedText, True) End If If sender.ToString() = "Knippen" Then area.Cut() End If If sender.ToString() = "Plakken" Then Dim tekst As IDataObject = Clipboard.GetDataObject() If tekst.GetDataPresent(DataFormats.Text) = True Then area.SelectedText &= CType(tekst.GetData(DataFormats.Text), String) End If End If
End Sub
|
Het enige waar we nog voor moeten zorgen is dat als er in ons tekstvak geen tekst geselecteerd is, de opties
"Kopieren" en "Plakken" niet aanklikbaar zijn. Dubbelklik op de menunaam "Bewerken" en plaats hierin de volgende code:
C# | VB.NET |
int selectie = area.SelectionLength; if (selectie > 0) { kopiërenToolStripMenuItem.Enabled = true; knippenToolStripMenuItem.Enabled = true; } else { kopiërenToolStripMenuItem.Enabled = false; knippenToolStripMenuItem.Enabled = false; }
|
Dim selectie As Integer = area.SelectionLength If selectie > 0 Then kopiërenToolStripMenuItem.Enabled = True knippenToolStripMenuItem.Enabled = True
Else kopiërenToolStripMenuItem.Enabled = False knippenToolStripMenuItem.Enabled = False
End
If
|
Zo, in feite is nu onze eigen kladblok wel af al kan je er nog wel wat functionaliteiten in steken.
Ik zal er er eentje bespreken in het volgende puntje.
top
5. Extra
Als eerste kunnen we ervoor zorgen dat er ook niet meer kan valsgespeeld worden bij het afsluiten. Als je nu
afsluit met het kruisje doet hij de controle niet of er wijzigingen zijn gesweest. Klik 1x op je Form en ga naar
het eigenschapen zoals bij het menu, zoek hier in de lijst naat het item: "FormClosing" en schrijf hier: "sluiten ".
Plaats hier de volgende code:
C# | VB.NET |
if (e.CloseReason == CloseReason.UserClosing && bewaard()) Application.Exit();
|
If e.CloseReason = CloseReason.UserClosing And bewaard() = True Then Application.Exit() End If
|
Dit is natuurlijk maar een klein extraatje, maar als je zelf nog aan zaken denkt die nuttig kunnen zijn moet
je zeker niet twijfelen om zelf iets te proberen toevoegen! Op aanvraag van iemand komt er hier nog een extra:
Bij het bewaren van een bestand hebben we de standaardlocatie op "C:" gezet. Het is natuurlijk wel iets handiger
als dit in de standaardmap van de huidige gebruiker komt. Wat moeten we hiervoor weten?
- Windowsversie (in de code staat het alleen voor XP en Vista)
- Taal van Windows (hier enkel Nederlands en Engels)
- De huidige gebruiker
Waarom niet enkel de gebruiker? Afhankelijk van de taal is de standaardlocatie in XP anders.
Bij Vista is dat niet het geval. Daarom moeten we ook de Windowsversie weten. Waar plaatsen we de code?
Voor de gemakkelijkheid van de implementatie van dit stukje code plaatsen we het in het Load event van ons programma.
Ga naar je Form en dubbelklik hierop, het Load-event wordt automatisch aangemaakt. Plaats hierin de volgende code:
C# | VB.NET |
int OS = System.Environment.OSVersion.Version.Major; string taal = Thread.CurrentThread.CurrentUICulture.ThreeLetterWindowsLanguageName.ToString(); string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); string[] array = user.Split('\'); string naam = array[1];
if (OS == 5) { dir = "C:\Documents and Settings\" + naam + "\"; if (taal == "NLD") dir += "Mijn Documenten"; if (taal == "ENU") dir += "My Documents"; }
if (OS == 6) { dir = "C:\Users\" + naam +"\Documents"; }
|
Dim OS As Integer = System.Environment.OSVersion.Version.Major Dim taal As String = Thread.CurrentThread.CurrentUICulture.ThreeLetterWindowsLanguageName.ToString() Dim user As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString() Dim array As String() = user.Split("\") Dim naam As String = array(1)
If OS = 5 Then dir = "C:\Documents and Settings\" + naam + "\" If taal = "NLD" Then dir += "Mijn Documenten" End If If taal = "ENU" Then dir += "My Documents" End If End If
If OS = 6 Then dir = "C:\Users\" + naam + "\Documents" End If
|
Zet boven het Load-event nog dit:
C# : string dir = "";
VB : Dim dir As String = ""
Dit is nodig omdat anders de variabele niet gekend is in de functie "bewaren()". Nu moet je enkel nog dit doen in de functie "bewaren()":
C# : saveFileDialog1.InitialDirectory = dir;
VB : saveFileDialog1.InitialDirectory = dir
Ik hoop dat ook dit extraatje duidelijk is, het is ook een handige extra dat de standaardlocatie staat ingesteld op de directory van de huidige gebruiker.
top
6. Besluit
Hiermee zijn we aan het definitieve einde van deze tutorial. Met een beetje inzicht in .NET en wat creativiteit
kan je veel bereiken. En een eigen kladblok of iets dergelijks maken is daar een perfect voorbeeld van.
Deze kladblok is vergelijkbaar met die van Windows XP ongeveer dus dat is zeker niet slecht. Hopelijk
vinden jullie het een interessante en vooral ook leerzame tutorial!
Aan de leden: stem aub en staaf je punten met een reactie! ;)
top
|