Το προφίλ μας στο Google Plus
0

Ανάπτυξη εφαρμογών σε C# για το .NET [μέρος 8ο]

Στο προηγούμενο τεύχος, παρ’ ό,τι μας είχε χτυπήσει η καλοκαιρίτιδα αποφασίσαμε να ασχοληθούμε μ’ ένα καυτό θέμα: Τη δημιουργία παραθυρικών εφαρμογών. Το πρόγραμμα που εξετάσαμε λειτούργησε ως μία ομαλή εισαγωγή στον κόσμο των παραθύρων, αλλά δεν επιτελούσε κάποια σπουδαία εργασία. Αυτή τη φορά θα δημιουργήσουμε το deltaPad, την πιο ενδιαφέρουσα εφαρμογή για τα Windows :P

Αν και οι παραθυρικές εφαρμογές είναι αρκετά πιο σύνθετες από εκείνες που τρέχουν στην κονσόλα, οι κλάσεις της C# καθιστούν πανεύκολη τη δημιουργία τέτοιων προγραμμάτων. Άλλωστε, προς μεγάλη μας ανακούφιση, το SharpDevelop ενσωματώνει ένα περιβάλλον σχεδίασης που μετατρέπει το “στήσιμο” μιας εφαρμογής σε παιχνιδάκι. Σε αυτό το άρθρο θα κάνουμε ένα γενναίο βήμα. Θα προσπεράσουμε τα προγραμματάκια τύπου “hello world” και θα δημιουργήσουμε το deltaPad. Πρόκειται για έναν επεξεργαστή απλού κειμένου, που ξεχωρίζει από όλους τους υπόλοιπους ακριβώς επειδή τον κατασκευάσαμε μόνοι μας ;)

Το περιβάλλον του προγράμματός μας δεν θα διαφοροποιείται από εκείνο των τυπικών text editor. Στην κορυφή του παραθύρου θα εμφανίζεται ένα μενού, με όλες τις ρυθμίσεις και τις λειτουργίες. Ακριβώς από κάτω θα δεσπόζει ένα μεγάλο πλαίσιο κειμένου, το οποίο θα αναπροσαρμόζει αυτόματα τις διαστάσεις του ώστε πάντοτε να καλύπτει ολόκληρο το παράθυρο του προγράμματος. Ας δούμε τώρα και τις δυνατότητες που θα προσφέρει ο κειμενογράφος μας:

  • Άνοιγμα και αποθήκευση αρχείων που περιέχουν απλό κείμενο (plain text files).
  • Επιλογές για Αντιγραφή, Αποκοπή και Επικόλληση.
  • Επιλογή γραμματοσειράς για το πλαίσιο κειμένου.
  • Ρύθμιση για την αναδίπλωση (ή όχι) των γραμμών.
  • Δυνατότητα αυτόματης εισαγωγής της ημερομηνίας και της ώρας.
  • Δυνατότητα μετατροπής του επιλεγμένου κειμένου σε κεφαλαία ή πεζά.

Κάπου εδώ πιστεύουμε ότι κερδίσαμε το ενδιαφέρον σας για τα καλά. Ας προχωρήσουμε λοιπόν στην υλοποίηση. Όπως και την προηγούμενη φορά, ανοίγουμε το SharpDevelop και επιλέγουμε τη δημιουργία ενός νέου Project τύπου “Windows Application”. Ως όνομα του project δίνουμε το deltaPad και πατάμε OK. Κάπως έτσι εμφανίζεται μπροστά μας το γνώριμο περιβάλλον ανάπτυξης που, μεταξύ άλλων, περιλαμβάνει και την καρτέλα Design. Εκεί συναντάμε μια μικρή κενή φόρμα, την οποία δημιούργησε για λογαριασμό μας το SharpDevelop. Σε πρώτη φάση, χωρίς να ανησυχούμε καθόλου για τον κώδικα, αρχίζουμε τη σχεδίαση του παραθυρικού περιβάλλοντος της εφαρμογής μας.

Χτίζοντας τα μενού
Από την καρτέλα Tools (στα αριστερά του παραθύρου του IDE), κάνουμε κλικ στην ομάδα αντικειμένων “Windows Forms” και στη συνέχεια στο MenuStrip. Μετά αρκεί να κάνουμε κλικ στο πάνω μέρος της φόρμας της εφαρμογής μας. Με αυτόν τον τρόπο ορίζεται μια οριζόντια περιοχή για τη φιλοξενία του μενού, που εκτείνεται σε όλο το μήκος της φόρμας. Εκεί μπορούμε να τοποθετήσουμε όποιες επιλογές θέλουμε, κάνοντας κλικ στο μικρό πλαίσιο με την προτροπή “type here”. Με αυτόν τον τρόπο εισάγουμε τις τέσσερεις ομάδες επιλογών που θα περιλαμβάνει το μενού της εφαρμογής μας (file, edit, view και help). Σημειώστε ότι τα ονόματα που εισάγουμε χρησιμοποιούνται από το SharpDevelop μέσα στον κώδικα του προγράμματος, για τη δημιουργία αντικειμένων της κλάσης MenuItems. Αυτό σημαίνει ότι θα ήταν φρόνιμο να χρησιμοποιούμε λατινικούς χαρακτήρες και μόνο. Αν θέλουμε το μενού του προγράμματός μας να εμφανίζεται στα ελληνικά, δεν πρέπει να πληκτρολογήσουμε απευθείας τις ελληνικές λέξεις. Αφού εισάγουμε τις επιλογές στα αγγλικά (file, edit, view και help), πρέπει να κάνουμε κλικ επάνω σε καθεμία και από την περιοχή Properties (στη δεξιά πλευρά του IDE) να εισάγουμε την αντίστοιχη ελληνική λέξη σαν τιμή της ιδιότητας Text.

Εδώ αξίζει να αναφέρουμε μια λεπτομέρεια. Όπως γνωρίζετε, όταν πατάμε το πλήκτρο [ALT] σε μια παραθυρική εφαρμογή, κάτω από τις επιλογές του κεντρικού μενού εμφανίζεται μια ιδιότυπη υπογράμμιση. Οι γραμμές υποδεικνύουν ένα γράμμα από το όνομα κάθε επιλογής, το οποίο λειτουργεί σαν συντόμευση. Ε, λοιπόν, αυτό το γράμμα καθορίζεται από την τιμή της ιδιότητας Text, με τη βοήθεια του χαρακτήρα ampersand (&). Για παράδειγμα, αν θέλουμε το γράμμα F της επιλογής File να λειτουργεί σαν συντόμευση με το [ALT], αρκεί να κάνουμε κλικ στο σχετικό αντικείμενο του μενού και να δώσουμε στην ιδιότητα Text την τιμή “&File”. Αν (από παραξενιά!) θέλαμε να ορίσουμε ως συντόμευση το γράμμα l (πεζό L), θα έπρεπε να δώσουμε την τιμή “Fi&le. Με λίγα λόγια, ο χαρακτήρας ampersand τοποθετείται αμέσως πριν από το γράμμα που θέλουμε να λειτουργεί σαν συντόμευση. Οι συντομεύσεις αυτού του είδους ονομάζονται “συντομεύσεις πλοήγησης” (navigational shortcuts), καθώς χρησιμοποιούνται για την μετακίνηση μέσα στα μενού και δεν ενεργοποιούν κάποια λειτουργία.

Μέχρι στιγμής έχουμε φτιάξει το πρώτο επίπεδο του μενού. Τώρα μένει να προσθέσουμε τις επιλογές των επιμέρους μενού. Για να προσθέσουμε ένα στοιχείο στο μενού File, κάνουμε κλικ επάνω του και χρησιμοποιούμε το πλαίσιο εισαγωγής που εμφανίζεται. Με αυτόν τον τρόπο προσθέτουμε τις επιλογές Open, Save και Quit. Όσα είπαμε προηγουμένως εξακολουθούν να ισχύουν: Τα ονόματα που δίνουμε για τα νέα αντικείμενα πρέπει να αποτελούνται από λατινικούς χαρακτήρες. Η ελληνική εκδοχή κάθε επιλογής εισάγεται ως τιμή στην ιδιότητα Text. Αυτή τη φορά, σε κάθε επιλογή του μενού File θα ορίσουμε και μια συντόμευση προς την αντίστοιχη λειτουργία. Συγκεκριμένα, θα ορίσουμε τις συντομεύσεις [CTRL+O] για το Open, [CTRL+S] για το Save και [CTRL+Q] για το Quit. Κάτι τέτοιο μπορεί να γίνει από την ιδιότητα ShortcutKeys. Για παράδειγμα, αφού κάνουμε κλικ στο στοιχείο Quit, αρκεί να κάνουμε κι ένα κλικ δίπλα από την τιμή None, που εμφανίζεται στην ιδιότητα ShortcutKeys. Με αυτόν τον τρόπο θα εμφανιστεί ένα μικρό παραθυράκι, από το οποίο μπορούμε να ορίσουμε την επιθυμητή συντόμευση. Οι συνδυασμοί πλήκτρων που ορίζουμε με αυτόν τον τρόπο εμφανίζονται εξ ορισμού μέσα στα μενού, για τη διευκόλυνση του χρήστη. Αν για κάποιο λόγο θέλουμε να κρύψουμε κάποια συντόμευση, αρκεί να θέσουμε την τιμή της ιδιότητας ShowShortcutKeys σε False.

Για να ορίσουμε μια συντόμευση προς κάποια λειτουργία του μενού, αρκεί να κάνουμε κλικ στο σχετικό αντικείμενο και ακολούθως να τροποποιήσουμε την ιδιότητα ShortcutKeys. Δεν θα μπορούσε να είναι πιο απλό!

Με τον ίδιο τρόπο ορίζουμε και τα υπόλοιπα μενού. Στο Edit προσθέτουμε τις επιλογές Copy, Paste, Cut, InsertDate, toUpper και toLower. Στο View προσθέτουμε τις επιλογές wordwrap και selectfont, ενώ στο Help προσθέτουμε την επιλογή About. Πριν προχωρήσουμε, αξίζει να σταθούμε σε δύο λεπτομέρειες. Κατ’ αρχάς, έχετε υπόψη ότι μπορούμε να ομαδοποιούμε τις επιλογές ενός μενού, εισάγοντας διαχωριστικές γραμμές στα κατάλληλα σημεία. Αυτό γίνεται με δεξί κλικ στο πλαίσιο όπου κανονικά θα πληκτρολογούσαμε την επόμενη επιλογή. Από το μενού που εμφανίζεται επιλέγουμε το Insert -> Separator. Αρκετά συχνά, κάποιες από τις επιλογές ενός μενού λειτουργούν ως διακόπτες on/off. Στη δική μας περίπτωση μια τέτοια επιλογή αποτελεί το wordwrap, το οποίο ενεργοποιεί ή απενεργοποιεί την αναδίπλωση των γραμμών. Για λόγους διευκόλυνσης του χρήστη, δίπλα από τέτοιες επιλογές υπάρχει χώρος για την εμφάνιση ενός τικ, το οποίο προστίθεται και αφαιρείται αυτόματα κι ανάλογα με την κατάσταση της αντίστοιχης επιλογής. Για να πετύχουμε κάτι τέτοιο στο δικό μας πρόγραμμα, αρκεί να κάνουμε κλικ στο στοιχείο wordwrap και να θέσουμε την ιδιότητα CheckOnClick σε True.

Σχεδιάζοντας το περιβάλλον της εφαρμογής μας. Όπως βλέπετε, για το background του TextBox επιλέξαμε ένα ωραιότατο μαύρο. Τα γράμματα θα είναι σχεδόν λευκά (ένα πολύ ανοιχτό γκρι) και ο editor θα θυμίζει Unix-like κονσόλα.

Περισσότερα παραθυρικά αντικείμενα
Αφού ξεμπερδέψουμε με τη σχεδίαση του μενού, προχωράμε στην κεντρική περιοχή του παραθύρου της εφαρμογής μας. Από την καρτέλα Tools (στα αριστερά του IDE), επιλέγουμε την ομάδα αντικειμένων “Windows Forms” και στη συνέχεια σύρουμε ένα αντικείμενο TextBox μέσα στη φόρμα μας. Η πρώτη ρύθμιση που κάνουμε είναι να ορίσουμε την ιδιότητα Multiline σε True, ώστε το TextBox να δέχεται κείμενο πολλαπλών γραμμών. Επιπρόσθετα, ορίζουμε και την ιδιότητα Scrollbars σε Both, για να μπορούμε να μετακινούμαστε άνετα μέσα στα διάφορα κείμενα. Επειδή η αναδίπλωση του κειμένου είναι εξ ορισμού ενεργοποιημένη, θα δούμε να εμφανίζεται μόνο η κατακόρυφη μπάρα κύλισης. Για να εμφανίσουμε και την οριζόντια μπάρα πρέπει να απενεργοποιήσουμε την αναδίπλωση των γραμμών, θέτοντας την ιδιότητα WordWrap σε False. Συνιστούμε αυτή τη ρύθμιση και σημειώνουμε πως, ούτως ή άλλως, θα μπορεί να αλλάξει πανεύκολα και από το μενού του deltaPad. Πρέπει τώρα να εξασφαλίσουμε ότι κάθε φορά που αλλάζουμε το μέγεθος του παραθύρου, το TextBox θα εκτείνεται σε όλο το διαθέσιμο χώρο. Αν πιστεύετε ότι κάτι τέτοιο μπορεί να γίνει μόνο από τον κώδικα, κάνετε λάθος. Θα χρειαστεί απλώς να θέσουμε την ιδιότητα Dock σε Fill. Εναλλακτικά, θα μπορούσαμε να δώσουμε στην ιδιότητα Anchor την τιμή “Top, Bottom, Left, Right”.

Για να εξασφαλίσουμε ότι το TextBox θα καταλαμβάνει πάντα ολόκληρο το διαθέσιμο χώρο, αποδίδουμε στην ιδιότητα Dock την τιμή Fill.

Για να πετυχαίνει η εφαρμογή μας όσα περιγράψαμε νωρίτερα, πρέπει να προσθέσουμε μερικά αντικείμενα ακόμα. Από τη γνωστή περιοχή, τραβάμε ένα FileOpenDialog, ένα FileSaveDialog και ένα FontDialog. Τα συγκεκριμένα αντικείμενα θα αξιοποιούνται από τις αντίστοιχες επιλογές που προσθέσαμε νωρίτερα στο μενού. Γι’ αυτό το λόγο, δεν θα τροποποιήσουμε καμία από τις ιδιότητές τους και δεν θα ασχοληθούμε καθόλου με την τοποθέτησή τους. Αρκεί η προσθήκη τους στη φόρμα. Μετά κι από αυτό, μπορούμε να πούμε ότι ξεμπερδέψαμε με το κομμάτι του Visual Programming. Έχουμε πλέον μπροστά μας την ανάπτυξη του κώδικα, ο οποίος θα δώσει ζωή σε όσα σχεδιάσαμε ως τώρα.

Ας γράψουμε κώδικα
Το Visual Programming είναι εύκολο και έχει την πλάκα του. Ωστόσο, ο αληθινός προγραμματισμός αρχίζει όταν επιστρατεύουμε τη λογική μας και γράφουμε κώδικα. Θα ξεκινήσουμε από τα απλά και θα γράψουμε τον κώδικα για την ενεργοποίηση και την απενεργοποίηση της αναδίπλωσης του κειμένου. Όπως είδαμε παραπάνω, η σχετική επιλογή του μενού συνοδεύεται από ένα τικ, το οποίο θα δείχνει την κατάσταση (ενεργή ή ανενεργή) της ρύθμισης. Επομένως, μια καλή θέση για τον κώδικα που θα τροποποιεί την ιδιότητα WordWrap του TextBox, είναι η συνάρτηση χειρισμού του event που ονομάζεται CheckedChanged. Το συγκεκριμένο event ανήκει στο αντικείμενο WordWrap, που έχουμε προσθέσει στο μενού View. Για να γράψουμε τον κώδικα, λοιπόν, κάνουμε κλικ επάνω στο συγκεκριμένο αντικείμενο, μεταβαίνουμε στα events (βρίσκονται σε μια καρτέλα του παραθύρου Properties) και κάνουμε διπλό κλικ επάνω στο CheckedChanged. Έτσι, μεταφερόμαστε σε μια κατάλληλη θέση εντός του αρχείου MainForm.cs. Εκεί, αρκεί να προσθέσουμε τις ακόλουθες γραμμές:

void WordwrapToolStripMenuItemCheckedChanged(object sender, EventArgs e) {
	if(wordwrapToolStripMenuItem.Checked) {
		textBox.WordWrap = true;
	} else {
		textBox.WordWrap = false;
	}
}

Η λειτουργία του κώδικα είναι εμφανής. Δείτε και μία πιο σύντομη εκδοχή:

void WordwrapToolStripMenuItemCheckedChanged(object sender, EventArgs e) {
	textBox.WordWrap = wordwrapToolStripMenuItem.Checked;
}

Όπως βλέπετε, απαλλαχθήκαμε από έναν έλεγχο τιμής. Ως εκ τούτου, εκτός από μικρότερη, η δεύτερη εκδοχή του κώδικα είναι και ταχύτερη. Σειρά έχει η υλοποίηση των λειτουργιών της αντιγραφής, της αποκοπής και της επικόλλησης. Οι ακόλουθες γραμμές υλοποιούν τις τρεις λειτουργίες, αξιοποιώντας τις ομώνυμες μεθόδους που παρέχει το TextBox:

void CopyToolStripMenuItemClick(object sender, EventArgs e) {
	textBox.Copy();
}

void PasteToolStripMenuItemClick(object sender, EventArgs e) {
	textBox.Paste();
}

void CutToolStripMenuItemClick(object sender, EventArgs e) {
	textBox.Cut();
}

Αφού εισάγουμε τις παραπάνω τρεις συναρτήσεις, πρέπει να τις αντιστοιχίσουμε στα events Click των αντίστοιχων επιλογών του μενού. Για το σκοπό αυτό, κάνουμε κλικ σε καθένα από τα στοιχεία του μενού, μεταβαίνουμε στο παράθυρο Properties και στην περιοχή όπου εμφανίζονται τα events, και φροντίζουμε να συμπληρώσουμε το όνομα της κατάλληλης συνάρτησης στο πεδίο Click.

Ας προχωρήσουμε τώρα σε μια ελαφρώς συνθετότερη λειτουργία: Την εισαγωγή ενός timestamp στο σημείο όπου βρίσκεται ο κέρσορας. Γι’ αυτό θα χρειαστεί να επιστρατεύσουμε το αντικείμενο DateTime, από το οποίο θα αποσπάσουμε σε μορφή κειμένου την τρέχουσα ημερομηνία και ώρα του συστήματος. Στη συνέχεια θα αξιοποιήσουμε τη μέθοδο Insert του αντικειμένου String, η οποία περιλαμβάνει το κείμενο του TextBox. Με τη βοήθειά της θα εισάγουμε την ημερομηνία στη θέση του δρομέα. Μήπως αναρωτιέστε πού βρίσκεται ο δρομέας και πώς θα μάθουμε τη θέση του; Σκεφτείτε ότι η θέση του δρομέα, όταν δεν έχουμε επιλέξει κάποιο τμήμα κειμένου, αποτελεί το εν δυνάμει σημείο εκκίνησης μιας επιλεγμένης περιοχής. Επομένως, μπορούμε να βρούμε τη θέση του διαβάζοντας την ιδιότητα SelectionStart, του TextBox. Από την άλλη, αν είχαμε μαρκάρει μια περιοχή του κειμένου και επιλέγαμε την εισαγωγή της ημερομηνίας, θα θέλαμε να τοποθετηθεί στην αρχή της επιλεγμένης περιοχής. Άρα η ιδιότητα SelectionStart θα ήταν και πάλι η καταλληλότερη. Δείτε τον κώδικα που γράψαμε:

void InsertDateToolStripMenuItemClick(object sender, EventArgs e) {
	string now = DateTime.Now.ToString();
	int cursorPosition = textBox.SelectionStart;
	textBox.Text = textBox.Text.Insert(cursorPosition, now);
textBox.SelectionStart = cursorPosition + now.Length;
}

Παρατηρήστε την τελευταία γραμμή της μεθόδου. Ο δρομέας τοποθετείται στο τέλος της συμβολοσειράς που μόλις προσθέσαμε. Όπως και προηγουμένως, αφού εισάγουμε τον κώδικα της παραπάνω συνάρτησης πρέπει να τη “συνδέσουμε” με το event ονόματι Click της επιλογής InsertDate, του μενού Edit.

Τώρα θα υλοποιήσουμε δυο λειτουργίες που διαφοροποιούν το deltaPad από το Notepad των Windows. Αναφερόμαστε στη δυνατότητα μετατροπής του επιλεγμένου κειμένου σε πεζά ή κεφαλαία. Για το σκοπό αυτό αποφασίσαμε να δημιουργήσουμε μια μέθοδο, η οποία θα είναι σε θέση να πραγματοποιεί και τις δύο ενέργειες. Η συγκεκριμένη μέθοδος θα αξιοποιείται από τις συναρτήσεις χειρισμού των events ονόματι Click, των αντίστοιχων επιλογών του μενού.

private enum Case{ Upper, Lower }
		
private void ChangeCase(Case toCase) {
	int cursorPosition = textBox.SelectionStart;
	int selectedLen = textBox.SelectionLength;
	string changeCaseText = textBox.Text.Substring(cursorPosition,selectedLen);
	if(toCase == Case.Upper) {
		changeCaseText = changeCaseText.ToUpper();
	} else {
		changeCaseText = changeCaseText.ToLower();
	}
	string newText = textBox.Text.Remove(cursorPosition, selectedLen);
	newText = newText.Insert(cursorPosition, changeCaseText);
	textBox.Text = newText;
	textBox.SelectionStart = cursorPosition;
	textBox.SelectionLength = selectedLen;			
}

void ToUpperToolStripMenuItemClick(object sender, EventArgs e) {
	ChangeCase(Case.Upper);
}
		
void ToLowerToolStripMenuItemClick(object sender, EventArgs e) {
	ChangeCase(Case.Lower);
}

Ο κώδικας είναι και πάλι αρκετά απλός. Η μέθοδος που πραγματοποιεί τις μετατροπές (ChangeCase) δέχεται μια παράμετρο με όνομα toCase. Προφανώς, η τιμή της παραμέτρου καθορίζει το είδος της μετατροπής. Για λόγους κομψότητας του κώδικα ορίσαμε την απαρίθμηση Case, που έχει σαν μέλη τα Upper και Lower. Όπως βλέπετε, η παράμετρος toCase έχει σαν τύπο τη συγκεκριμένη απαρίθμηση. Με αυτό το κολπάκι, όταν καλούμε τη μέθοδο ChangeCase μπορούμε να γράφουμε κάτι τέτοιο

	ChangeCase(Case.Upper);

…ή και κάτι τέτοιο:

	ChangeCase(Case.Lower);

Κατά τα γνωστά, πριν προχωρήσουμε πρέπει να αντιστοιχίσουμε τις παραπάνω δύο συναρτήσεις (ToUpperToolStripMenuItemClick και ToLowerToolStripMenuItemClick) στα events Click των αντίστοιχων επιλογών του μενού. Μετά κι από αυτό, μπορούμε να περάσουμε στη λειτουργία αλλαγής γραμματοσειράς. Ο απαιτούμενος κώδικας είναι και πάλι απλούστατος:

void SelectFontToolStripMenuItemClick(object sender, EventArgs e) {
	fontDialog.Font = textBox.Font;
	DialogResult result = fontDialog.ShowDialog(this);
	if(result == DialogResult.OK) {
		textBox.Font = fontDialog.Font;
	}
}

Πριν εμφανίσουμε το FontDialog, ορίζουμε κατάλληλα την ιδιότητα Font. Συγκεκριμένα, της αποδίδουμε την τιμή που έχει η ομώνυμη ιδιότητα του TextBox. Έτσι, όταν θα εμφανιστεί το πλαίσιο διαλόγου για την επιλογή γραμματοσειράς, θα εμφανίζει την τρέχουσα ρύθμιση. Για την εμφάνιση του πλαισίου χρησιμοποιούμε τη μέθοδο ShowDialog(). Στη συνέχεια, αφού τσεκάρουμε ότι το πλαίσιο διαλόγου τερματίστηκε με το πάτημα του πλήκτρου OK, επιβάλλουμε τη νέα ρύθμιση στο TextBox.

Γράφοντας το πρώτο μας κείμενο, στο δικό μας text editor! Στην εικόνα φαίνεται το αποτέλεσμα της μετατροπής ενός επιλεγμένου τμήματος σε κεφαλαία.

Σε αυτό το στάδιο απομένει να υλοποιήσουμε τις λειτουργίες φόρτωσης και αποθήκευσης των αρχείων κειμένου. Για το σκοπό αυτό θα δημιουργήσουμε τις μεθόδους LoadText και SaveText, οι οποίες θα καλούνται από τις μεθόδους χειρισμού των events Click, των αντίστοιχων επιλογών του μενού. Ο κώδικάς μας στηρίζεται στη χρήση των γνώριμων συναρτήσεων File.ReadAllText και File.WriteAllText. Σημειώστε ότι το αντικείμενο File κατοικοεδρεύει στο χώρο ονομάτων System.IO. Επομένως, στην κορυφή του αρχείου με τον κώδικα πρέπει να δηλώσουμε τη χρήση του συγκεκριμένου namespace.

private void LoadText() {
	DialogResult result = openFileDialog.ShowDialog(this);
	if(result == DialogResult.OK) {
		try {
			textBox.Text = File.ReadAllText(openFileDialog.FileName);
		} catch(Exception err) {
			MessageBox.Show(err.Message, "Σφάλμα φόρτωσης αρχείου", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	}		
}
		
private void SaveText() {
	DialogResult result = saveFileDialog.ShowDialog(this);
	if(result == DialogResult.OK) {
		try {
			File.WriteAllText(saveFileDialog.FileName, textBox.Text);
		} catch (Exception err) {
			MessageBox.Show(err.Message, "Σφάλμα αποθήκευσης αρχείου", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	}
}
		
void OpenToolStripMenuItemClick(object sender, EventArgs e) {
	LoadText();
}
	
void SaveToolStripMenuItemClick(object sender, EventArgs e) {
	SaveText();
}

Στην περίπτωση του LoadText, το περιεχόμενο του αρχείου που επέλεξε ο χρήστης φορτώνεται στην ιδιότητα Text, του ΤextΒox. Αντίθετα, στην περίπτωση του SaveText το κείμενο που βρίσκεται στο ΤextΒox αποθηκεύεται στο αρχείο που καθορίζει ο χρήστης. Όπως έχουμε ξαναπεί, όταν εργαζόμαστε με αρχεία ενδέχεται να προκύψουν σφάλματα. Ακριβώς γι’ αυτό επιστρατεύουμε τη δομή try – catch, με τη βοήθεια της οποίας εμφανίζουμε και τα κατάλληλα μηνύματα.

Για το τέλος αφήσαμε την υλοποίηση των επιλογών τερματισμού του προγράμματος και της εμφάνισης πληροφοριών σχετικά με αυτό. Ο τερματισμός πραγματοποιείται με την κλήση της συνάρτησης Application.Exit. Να σας θυμίσουμε ότι το αντικείμενο Application είναι το βασικό αντικείμενο που αρχικοποιείται κατά την έναρξη μιας παραθυρικής εφαρμογής. Ο σχετικός κώδικας βρίσκεται στο αρχείο Program.cs, που δημιουργείται αυτόματα από το SharpDevelop.

void ExitToolStripMenuItemClick(object sender, EventArgs e) {
	Application.Exit();
}

Για το παράθυρο πληροφοριών αποφασίσαμε να χρησιμοποιήσουμε ένα MessageBox. Μπορεί να μην έχει εντυπωσιακή όψη, αλλά είναι απλό και κάνει ακριβώς αυτό που θέλαμε: Εμφανίζει μια “ταυτότητα” του προγράμματος:

	
void AboutToolStripMenuItemClick(object sender, EventArgs e) {
	MessageBox.Show("deltaPad - ver 1.0.0\n(c) 2015, multiPetros - <www.deltahacker.gr>\n\nThis is free software, distributed under the FreeBSD License","About deltaPad...", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Κάπου εδώ φτάσαμε στο τέλος. Πιστεύουμε ότι πήρατε μια καλή γεύση από την ευκολία που προσφέρει η C#, κατά την ανάπτυξη εφαρμογών για το περιβάλλον των Windows. Η εφαρμογή deltaPad δέχεται άπειρες προσθήκες και βελτιώσεις. Όσοι έχετε το μεράκι, μπορείτε να περάσετε αρκετές ώρες αναπτύσσοντας περαιτέρω τον κειμενογράφο μας. Στο τέλος, εκτός από τη χαρά της δημιουργίας θα έχετε κερδίσει κι ένα μικρό, ελαφρύ και χρήσιμο εργαλείο. Όπως πάντα, ο κώδικας βρίσκεται στη διάθεσή σας. Εμείς ανανεώνουμε το ραντεβού μας για το επόμενο τεύχος. Μέχρι τότε, ελπίζουμε να γράψετε κώδικα και να τον μοιραστείτε μαζί μας από το site του περιοδικού.

Το παράθυρο πληροφοριών του κειμενογράφου μας! Από τον επεξεργαστή μας δεν λείπει τίποτα. Ή σχεδόν τίποτα, τέλος πάντων ;)

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων