Οι πίνακες στην C++/CLI δημιουργούνται και δεσμεύουν χώρο στο Managed Heap (Garbage Collected Heap) Για τον λόγο αυτό οι μεταβλητές των πινάκων δηλώνονται πάντα ως Λαβές Εντοπισμού (Tracking Handles) «^». Η δήλωση ενός πίνακα γίνεται με την δεσμευμένη λέξη array ως εξής array<τύπος στοιχείων του πίνακα> ^ όνομα_πίνακα, π.χ. array<int> ^ data; array<double> ^ grades; κ.λ.π. Η δέσμευση μνήμης για τον πίνακα γίνεται με χρήση της εντολής gcnew ως εξής: όνομα_πίνακα = gcnew array<τύπος στοιχείων>(πλήθος στοιχείων); Π.χ. array<int> ^ data; data = gcnew array<int>(100); Μετά την δήλωσή της (array<int> ^ data;) η μεταβλητή data έχει την τιμή nullptr. Η τιμή αυτή σημαίνει ότι το managed handle δεν δείχνει σε κανένα αντικείμενο. Η gcnew θα δώσει στο handle την τιμή της περιοχής μνήμης που δεσμεύτηκε για το αντικείμενο.
Η δήλωση ενός πίνακα μπορεί να γίνει και με functional notation : array<int> ^ data( gcnew array<int>(100) ); Επίσης είναι δυνατό κατά την δήλωση του πίνακα να γίνει και αρχικοποίηση των τιμών του πίνακα, για παράδειγμα: array<int> ^ numbers = { 1, 2, 3, 4, 5 }; Σε αυτή την περίπτωση το πλήθος των στοιχείων του πίνακα για την δέσμευση μνήμης λαμβάνεται από το πλήθος των στοιχείων εντός των άγκιστρων (στην περίπτωση αυτή = 5). Τέλος αρχικοποίηση μπορεί να γίνει και με την κλήση της gcnew ως εξής : array<int> ^ numbers; numbers = gcnew array<int>{ 1, 2, 3, 4, 5 }; Παράδειγμα αρχικοποίησης πίνακα με String: array < String^ > ^ onomata = { "John", Ann", Mary", Tom", "Jim"};
Η προσπέλαση των στοιχείων του πίνακα γίνεται με τον γνωστό τρόπο με χρήση των τετράγωνων αγκύλων και ενός δείκτη θέσης του πίνακα: Στοιχείο_Πίνακα = Όνομα_Πίνακα [ Δείκτης_Θέσης ] ; Η αρίθμηση των θέσεων των στοιχείων του πίνακα ξεκινά από το 0. Λόγω του δείκτη θέσης, η προσπέλαση όλων των στοιχείων ενός πίνακα μπορεί να γίνει εύκολα με ένα βρόχο for, Π.χ. : for (i=0 ; i<5 ; i++ ) sum+= data[i]; Εκτός από τον βρόχο for μπορούμε να χρησιμοποιήσουμε και τον βρόχο for each που συντάσσεται ως εξής : for each ( όνομα_μεταβλητής in όνομα_πίνακα ) { } Παράδειγμα : array<int> ^ data= gcnew array<int>{1,2,3,4,5}; int Max=data[0]; for each (int n in data) {if (n>max) Max=n;} Console::WriteLine("Max = {0}",Max);
Οι πίνακες ως αντικείμενα έχουν και ορισμένες πολύ χρήσιμες ιδιότητες και μεθόδους που διευκολύνουν την χρήση τους : Ιδιότητα Length: επιστρέφει το πλήθος των στοιχείων του πίνακα ως ακέραιο αριθμό, π.χ. for (i=0 ; i<data->length ; i++) sum=sum+data[i]; Ιδιότητα Rank: επιστρέφει τον αριθμό των διαστάσεων του πίνακα, π.χ. 1 για μονοδιάστατο, 2 για δισδιάστατο, 3 για τρισδιάστατο κ.λ.π. Μέθοδος Clear: μηδενίζει τα στοιχεία ενός πίνακα. Αν τα στοιχεία είναι αριθμητικά γίνονται ίσα με το 0. Αν είναι bool γίνονται false. Αν είναι pointers γίνονται nullptr, κ.λ.π. π.χ. if (data!=nullptr) Array::Clear(data,0,data->Length); Μέθοδος Sort: ταξινομεί έναν πίνακα με αύξουσα σειρά. Ο πίνακας θα πρέπει να έχει οριστεί στο Heap (να μην είναι nullptr) και θα πρέπει να είναι μονοδιάστατος (Rank=1). Παράδειγμα : array<int> ^ data= gcnew array<int>{3,1,5,4,2}; Array::Sort(data); // data = {1,2,3,4,5}
Με την μέθοδο Sort είναι δυνατό να ταξινομήσουμε δύο μονοδιάστατους πίνακες ταυτόχρονα. Η ταξινόμηση γίνεται με βάση τα στοιχεία του πρώτου πίνακα που θεωρείται πίνακας «κλειδιών» αλλά αναδιατάσσονται ταυτόχρονα και τα στοιχεία του δεύτερου πίνακα. Παράδειγμα: array < String^ > ^ onomata = { "John", Ann", Mary", Tom", "Jim"}; array <float> ^ bathmoi = {7.5, 9.0, 6.8, 5.4, 8.1 }; Array::Sort( onomata, bathmoi ); Μέθοδος Reverse: Αντιστρέφει την σειρά των στοιχείων του πίνακα, π.χ array<int> ^ data= gcnew array<int>{1,2,3,4,5}; Array::Reverse(data); // {5,4,3,2,1} Μέθοδος Copy: Αντιγράφει έναν πίνακα σε έναν άλλο. Παράδειγμα : array <float> ^ bathmoi = {7.5, 9.0, 6.8, 5.4, 8.1 }; array <float> ^ grades = gcnew array<float> (5) ; Array::Copy( bathmoi, grades, 5);
Μέθοδος BinarySearch: με την μέθοδο αυτή μπορούμε να αναζητήσουμε ένα στοιχείο μέσα σε έναν ταξινομημένο πίνακα. Η σύνταξη είναι : θέση_στοιχείου = Array::BinarySearch( πίνακας, στοιχείο ); Π.χ. array < int > ^ values = { 23, 45, 68, 94, 123, 127, 150, 203, 299}; int tobefound=127; int position = Array::BinarySearch(values, tobefound); // 5 Αν το στοιχείο δεν βρεθεί η μέθοδος επιστρέφει αρνητικό νούμερο. Μέθοδος IndexOf: με την μέθοδο αυτή μπορούμε να αναζητήσουμε ένα στοιχείο μέσα σε έναν πίνακα που δεν χρειάζεται να είναι ταξινομημένος. Η σύνταξη είναι : θέση_στοιχείου = Array::IndexOf( πίνακας, στοιχείο ); Π.χ. array < String^ > ^ onomata = { "John", Ann", Mary", Tom", "Jim"}; String ^ student ( Tom ); int position = Array::IndexOf( onomata, student); // 3
Με βάση την κλάση Array μπορούμε να δημιουργήσουμε πίνακες δύο η περισσότερων διαστάσεων με μέγιστο αριθμό διαστάσεων τις 32. Για παράδειγμα, η δημιουργία πίνακα δύο διαστάσεων γίνεται ως εξής: array < int, 2 > ^ values = gcnew array < int, 2 > (4, 5); όπου το «,2» δηλώνει το πλήθος των διαστάσεων του πίνακα, ενώ το 4,5 είναι το πλήθος των γραμμών και το πλήθος των στηλών του πίνακα αντίστοιχα. Η προσπέλαση των στοιχείων του πίνακα γίνεται ως εξής: όνομα_πίνακα [ γραμμή, στήλη ] = τιμή ; Παράδειγμα κώδικα : int nrows=4; int ncols=5; array < int, 2 > ^ values(gcnew array < int, 2 > (nrows, ncols)); for(int i = 0 ; i < nrows ; i++) for(int j = 0 ; j < ncols ; j++) values[i,j] = (i+1)*(j+1);
File extension Type Contents.cpp,.c Source Τα πηγαία αρχεία κώδικα της εφαρμογής..exe,.dll Project Το παραγόμενο εκτελέσιμο πρόγραμμα ή η παραγόμενη dynamic-link library.h Source Αρχείο επικεφαλίδας (header file) που συνδυάζεται με το.cpp.ico Resource Αρχείο με την γραφική αναπαράσταση εικονιδίου..ilk Linking Incremental link file -αρχείο που υποβοηθά το αυξητικό link..map Linking Ένα αρχείο κειμένου που περιέχει πληροφορίες για το linking..obj,.o Compiling Αρχείο κώδικα μηχανής μετά την μεταγλώττιση και πριν το linking..pch Debug Precompiled header file αρχείο προ-μεταγλωττισμένης επικεφαλίδας.pdb Debug Program debug database αρχείο με βάση δεδομένων του Debugging.res Resource Αρχείο Binary με τα Resources του Project..resx Resource XML αρχείο που περιγράφει τα resources του project..rc,.rc2 Resource Script file που χρησιμοποιείται στην παραγωγή των resources..sln Solution Το αρχείο του Solution (Solution File).suo Solution Το αρχείο με τα Options του Solution (solution options file) sdf Compiling Βάση Δεδομένων του κώδικα (Code Browsing Database) tlog Compiling Αρχεία συμβάντων - Log Files.vcxproj Project Το αρχείο του Project
Σε κάθε Windows Forms Application παράγεται και ένα.cpp αρχείο με το όνομα που δώσαμε στο project μας p.x. Askhsh1-1.cpp. Το αρχείο αυτό περιέχει το εναρκτήριο σημείο της εφαρμογής (application entry point) που είναι η ρουτίνα main : // Askhsh1-1.cpp : main project file. #include "stdafx.h" #include "Form1.h" using namespace Askhsh11; [STAThreadAttribute] int main(array<system::string ^> ^args) { // Enabling Windows XP visual effects before any controls are created Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it Application::Run(gcnew Form1()); return 0; }
#include "stdafx.h : Στο αρχείο αυτό ενσωματώνουμε όλους τους precompiled headers της εφαρμογής. Το #include αυτό πρέπει να ενσωματώνεται πριν από οποιοδήποτε.cpp [STAThreadAttribute] : καθορίζει ότι η τρέχουσα εφαρμογή θα είναι μονού νήματος (single threaded). Application::EnableVisualStyles() : Ενεργοποιεί τα οπτικά εφφέ (visual styles) τα οποία απαρτίζουν ένα «θέμα» του Λειτουργικού Συστήματος ώστε να μπορούν τα Controls να εμφανίζονται με βάση αυτά τα visual styles. Απαιτείται πριν την δημιουργία οποιουδήποτε Control. Application::SetCompatibleTextRenderingDefault(false): Καθορίζει ότι τα Controls θα χρησιμοποιούν την κλάση TextRenderer που βασίζεται στο GDI (Graphics Device Interface) των Windows. Application::Run(gcnew Form1()) : Ξεκινάει τον βρόχο μηνυμάτων της εφαρμογής στο τρέχον νήμα (thread) και δεσμεύει μνήμη στο garbage collected heap για την βασική φόρμα της εφαρμογής (Form1) την οποία και εμφανίζει στην οθόνη.
Το αρχείο Form1.h περιέχει τον βασικό κώδικα που σχετίζεται με την συγκεκριμένη φόρμα, δηλαδή δήλωση της κλάσης της φόρμας, δήλωση των ενσωματωμένων Controls, αρχικοποίηση των Controls σύμφωνα με την σχεδίασή τους από τον προγραμματιστή και τον κώδικα των διαχειριστών συμβάντων (Event Handlers). Τα τμήματα του Form1.h είναι τα ακόλουθα: Δηλώσεις για την χρήση namespaces Δήλωση της κλάσης Form1 Δήλωση του Constructor και του Destructor Δήλωση και δημιουργία των ενσωματωμένων Controls Αρχικοποίηση των Controls σύμφωνα με την σχεδίαση Δήλωση του κώδικα των Event Handlers
#pragma once namespace Askhsh21 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // }
protected: ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Button^ button3; private: System::Windows::Forms::Button^ button4; private: System::Windows::Forms::Button^ button5; protected: /// <summary> /// Required designer variable. /// </summary> private: System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code void InitializeComponent(void) {this->button1 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->button4 = (gcnew System::Windows::Forms::Button()); this->button5 = (gcnew System::Windows::Forms::Button()); this->suspendlayout(); //παύση ενημέρωσης της φόρμας // button1 this->button1->location = System::Drawing::Point(105, 106); this->button1->name = L"button1"; this->button1->size = System::Drawing::Size(75, 23); // label1 this->label1->autosize = true;
this->resumelayout(false); //ενεργοποίηση της ενημέρωσης της φόρμας this->performlayout(); //επανασχεδιασμός της φόρμας } #pragma endregion private: System::Void button1_click(system::object^ sender, System::EventArgs^e) { label1->left=(this->clientsize.width-label1->width)/2; label1->top=(this->clientsize.height-label1->height)/2; } private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { label1->left=0; label1->top=0; } }; // τέλος της δήλωσης της κλάσης Form1 } // τέλος του namespace Askhsh21
#include : ενσωματώνει αρχείο επικεφαλίδων (με δηλώσεις κλάσεων, συναρτήσεων, μεταβλητών κ.λ.π., στο πηγαίο αρχείο κατά την μεταγλώττιση (#include <stdafx.h>). #define : καθορίζει τιμή σταθεράς που μακρο-αντικαθίσταται πριν την μεταγλώττιση (#define N 100) #ifdef, #ifndef, #else, #endif : δομές για υπό συνθήκη μεταγλώττιση κώδικα. (#ifdef WINDOWS #include <win.h> #else #include <dos.h> #endif) #mport : ενσωματώνει μία βιβλιοθήκη τύπων.olb,.tlb, ή.dll ( π.χ. #import "..\drawctl\drawctl.tlb ) #pragma token-string : η οδηγία pragma ακολουθούμενη από μία χαρακτηριστική λέξη (token-string) αποτελεί μία εξειδικευμένη οδηγία προς τον συγκεκριμένο compiler, που μπορεί να μην αναγνωρίζεται από άλλους compilers, αλλά δεν προκαλεί την δημιουργία σφαλμάτων κατά την μεταγλώττιση. Ο compiler της C/C++ αναγνωρίζει 40 τέτοια tokens.
Αποτελεί ένα κοινό TextBox στο οποίο καθορίζουμε την ιδιότητα Multiline σε true. Στην περίπτωση αυτή το TextBox μπορεί να δεχτεί πολλαπλές γραμμές κειμένου. Συμπληρωματικά Properties WordWrap : (true/false) καθορίζει αν οι γραμμές θα αναδιπλώνονται στο τέλος κάθε γραμμής ή όχι. ScrollBars : (None/Horizontal/Vertical/Both) εισάγει scroll bars για την ολίσθηση πάνω-κάτω και δεξιά-αριστερά. Για να εμφανιστούν τα οριζόντια scrollbars πρέπει η ιδιότητα WordWrap να είναι false. Lines : (array<string^> ^ Lines) πίνακας από Strings που περιέχει τις γραμμές του Multiline TextBox. Μέσω της ιδιότητας αυτής μπορώ να διαβάσω (read) τις γραμμές του TextBox σε μορφή πίνακα, αλλά με ανάθεση πίνακα στην ιδιότητα Lines μπορώ να επανα-καθορίσω τις γραμμές που εμφανίζονται μέσα σε ένα Multiline TextBox.
Κληρονομείται από την κλάση System::Windows:: Forms::ComboBox. Λειτουργεί σαν TextBox αλλά ο χρήστης μπορεί να επιλέξει μία από τις επιλογές της drop-down λίστας που εμφανίζεται πατώντας το Properties DropDownHeight: καθορίζει το ύψος της drop-down λίστας DropDownWidth: καθορίζει το πλάτος της drop-down λίστας DropDownStyle: καθορίζει τον τρόπο εμφάνισης του ComboBox Simple DropDown DropDownList Εμφανίζει ταυτόχρονα το Εμφανίζει το TextBox και Επιτρέπει εισαγωγή TextBox και την λίστα με και την λίστα μόνο από την λίστα
Properties Text : το κείμενο του ComboBox MaxDropDownItems: καθορίζει το μέγιστο πλήθος επιλογών που θα εμφανίζονται στο Drop-Down list. Sorted: (true/false) καθορίζει εάν οι επιλογές της λίστας θα εμφανίζονται ταξινομημένες ή όχι. Items: Collection του τύπου ComboBox::ObjectCollection που περιέχει τις επιλογές της drop-down λίστας με ιδιότητες Count, Item[] και μεθόδους Add, Clear, IndexOf, Insert, Remove, RemoveAt, κ.λ.π. SelectedIndex: δείχνει ή καθορίζει τον α/α της επιλογής από την λίστα. SelectedItem: Επιστρέφει το ίδιο το επιλεγμένο αντικείμενο της λίστας. Methods BeginUpdate(), EndUpdate() επιτρέπουν την πολλαπλή ενημέρωση του ComboBox χωρίς ενδιάμεσο επανα-σχεδιασμό του. RefreshItems(): επανα-σχεδιάζει τις επιλογές του ComboBox. Events DropDown, DropDownClosed, SelectedIndexChanged, SelectionChangeCommitted, κ.λ.π.
Κληρονομείται από την κλάση System::Windows:: Forms::CheckBox. Εμφανίζει ένα τετράγωνο που μπορεί να περιέχει ένα checkmark ή όχι και δίπλα μία λεζάντα κειμένου. Properties Appearance: (Normal/Button) καθορίζει αν θα εμφανίζεται ως checkbox ή ως button που μένει πατημένο ή όχι. AutoSize: (true/false) καθορίζει εάν το μέγεθος του αντικειμένου θα καθορίζεται αυτόματα ή ελεύθερα από τον χρήστη. CheckAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση του checkbox σε σχέση με την λεζάντα κειμένου. Checked: (true/false) καθορίζει αν το CheckBox είναι τσεκαρισμένο ή όχι CheckState: (Checked, Unchecked, Indeterminate) καθορίζει την κατάσταση του CheckBox. ThreeState: (true/false) καθορίζει εάν το checkbox θα έχει 3 καταστάσεις αντί για 2 (Checked, Unchecked, Indeterminate). Text: το κείμενο της λεζάντας του checkbox
Properties: TextAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση του κειμένου στο control. Image: εικόνα που μπορεί να φορτωθεί στο background του control. ImageAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση της εικόνας στο control. TextImageRelation: (Overlay, ImageAboveText, TextAboveImage, ImageBeforeText, TextBeforeImage) καθορίζει την σχετική θέση εικόνας και κειμένου μέσα στο checkbox control. Methods Hide, Show : Εξαφανίζει / εμφανίζει το CheckBox. Refresh(), Invalidate(), Focus(), SendToBack(), BringToFront(), SetBounds(), Scale(factor), Select(), Events CheckedChanged(), CheckStateChanged(), AppearanceChanged(),
Κληρονομείται από την κλάση System::Windows:: Forms::RadioButton. Εμφανίζει ένα κυκλικό κουμπί που μπορεί να είναι επιλεγμένο ή όχι και δίπλα μία λεζάντα κειμένου. Μοιάζει με το CheckBox. Χρησιμοποιείται σε συστοιχίες πολλών RadioButtons τα οποία συμπεριφέρονται με ενιαίο τρόπο: όταν επιλέγεις το ένα από-επιλέγονται τα υπόλοιπα. Properties Appearance: (Normal/Button) καθορίζει αν θα εμφανίζεται ως checkbox ή ως button που μένει πατημένο ή όχι. AutoSize: (true/false) καθορίζει εάν το μέγεθος του αντικειμένου θα καθορίζεται αυτόματα ή ελεύθερα από τον χρήστη. CheckAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση του checkbox σε σχέση με την λεζάντα κειμένου. Checked: (true/false) καθορίζει αν το CheckBox είναι τσεκαρισμένο ή όχι CheckState: (Checked, Unchecked, Indeterminate) καθορίζει την κατάσταση του CheckBox.
Properties Text: το κείμενο της λεζάντας του radiobutton TextAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση του κειμένου στο control. Image: εικόνα που μπορεί να φορτωθεί στο background του control. ImageAlign: (BottomCenter, BottomLeft, BottomRight, MiddleCenter, MiddleLeft, MiddleRight, TopCenter, TopLeft, TopRight) καθορίζει την σχετική θέση της εικόνας στο control. TextImageRelation: (Overlay, ImageAboveText, TextAboveImage, ImageBeforeText, TextBeforeImage) καθορίζει την σχετική θέση εικόνας και κειμένου μέσα στο radiobutton control. Methods Hide, Show : Εξαφανίζει / εμφανίζει το radiobutton. Refresh(), Invalidate(), Focus(), SendToBack(), BringToFront(), SetBounds(), Scale(factor), Select(), Events: CheckedChanged(), CheckStateChanged(), AppearanceChanged(),...
Δημιουργούμε νέο Project. Αλλάζουμε το text της Form1 σε Άσκηση 3-1. Ενσωματώνουμε ένα TextBox και καθορίζουμε την ιδιότητα Multiline σε true, την WordWrap σε false και την ιδιότητα ScrollBars σε Both. Προσθέτουμε δύο Label και δύο TextBox για την γραμμή και την στήλη. Προσθέτουμε 4 buttons και αλλάζουμε το μέγεθός τους και το text. Για την εμφάνιση γραμμής και στήλης «παγιδεύουμε» τα Events Click και KeyUp και γράφουμε τον ακόλουθο κώδικα: private: System::Void textbox1_click(system::object^sender, System::EventArgs^e) { int start = textbox1->selectionstart; int line = textbox1->getlinefromcharindex(start); textbox2->text = Convert::ToString(line+1); //correct 0-based int col = start - textbox1->getfirstcharindexofcurrentline(); textbox3->text = Convert::ToString(col+1); //correct 0-based }
Για την εμφάνιση κειμένου δημιουργούμε event handler και γράφουμε τον ακόλουθο κώδικα: private: System::Void button1_click (System:: Object^ sender, System:: EventArgs^ e) { MessageBox::Show(textBox1->Text, "Άσκηση 3-1", MessageBoxButtons:: OKCancel,MessageBoxIcon:: Information); } Για την εισαγωγή γραμμής δημιουργούμε event handler και γράφουμε: private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { int start = textbox1->getfirstcharindexofcurrentline(); textbox1->text=textbox1->text->insert(start,environment::newline); // NewLine="\r\n" }
Για το Undo δημιουργούμε event handler και γράφουμε τον κώδικα: private: System::Void button4_click (System::Object^ sender, System::EventArgs^ e) { textbox1->undo(); } Τέλος για την διαγραφή γραμμής γράφουμε τον κώδικα: private: System::Void button3_click(system::object^ sender, System::EventArgs^ e) {if (textbox1->lines->length>0) { int line = textbox1->getlinefromcharindex(textbox1->selectionstart); array<string^>^ temp=gcnew array<string^>(textbox1->lines->length-1); Array::Copy(textBox1->Lines,temp,line); Array::Copy(textBox1->Lines,line+1,temp,line,textBox1->Lines->Length-line-1); textbox1->lines=temp; } }
Η εφαρμογή αποτελείται από 3 φόρμες και υλοποιεί ένα Setup Wizard. Η κάθε φόρμα μπορεί να μας οδηγήσει στην επόμενη φόρμα μέχρι την ολοκλήρωση της διαδικασίας, αλλά και στην προηγούμενη για επανάληψη των βημάτων. Στην αρχική φόρμα ενσωματώνουμε ένα Label ένα PictureBox και 2 Buttons. Αλλάζουμε το κείμενο το και το font του Label. Φορτώνουμε μία εικόνα στο PictureBox. Αλλάζουμε το Text των 2 Buttons.
Δημιουργούμε και 2 η φόρμα και ενσωματώνουμε σε αυτήν ένα Label, ένα ComboBox ένα CheckBox και 3 Buttons. Καθορίζουμε το κείμενο του Label. Προσθέτουμε επιλογές στην ιδιότητα Items του ComboBox. Αλλάζουμε το Text του CheckBox. Αλλάζουμε το Text των 3ων Buttons Δημιουργούμε και 3 η φόρμα και ενσωματώνουμε σε αυτήν 3 RadioButtons και 3 Buttons. Καθορίζουμε το Text των 3ων RadioButtons. Καθορίζουμε το Text των 3ων Buttons. Στο Form1.h κάνουμε include τις δύο άλλες φόρμες: #include "Form2.h" #include "Form3.h" Στην κλάση της Form1 ενσωματώνουμε 2 μέλη δεδομένα: public: Form2 ^ frm2; Form3 ^ frm3;
Στo Form2.h ενσωματώνουμε στην κλάση της φόρμας δύο data members: public: System::Windows::Forms::Form ^ frm1; System::Windows::Forms::Form ^ frm3; Στo Form3.h ενσωματώνουμε στην κλάση της φόρμας ένα data member: public: System::Windows::Forms::Form ^ frm2; Στo Form1.h ενσωματώνουμε στον Constructor τον παρακάτω κώδικα αρχικοποίησης ώστε να δημιουργηθούν οι Form2 και Form3 και η κάθε φόρμα να έχει pointers για τις άλλες δύο: Form1(void) {InitializeComponent(); frm2= gcnew Form2(); frm3= gcnew Form3(); frm2->frm1=this; frm2->frm3=frm3; frm3->frm2=frm2; }
Παράγουμε Event Handlers για τα Buttons. Για το Button Έξοδος της Form1 γράφουμε τον παρακάτω κώδικα: private: System::Void button1_click(system::object^ sender, System::EventArgs^ e) { this->close(); } Για το Button Επόμενο> της Form1 γράφουμε τον παρακάτω κώδικα: private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { this->hide(); frm2->show(); } Για το Button Έξοδος της Form2 γράφουμε τον παρακάτω κώδικα: private: System::Void button3_click(system::object^ sender, System::EventArgs^ e) { frm1->close(); } Για το Button <Προηγούμενο της Form2 γράφουμε τον παρακάτω κώδικα: private: System::Void button1_click(system::object^ sender, System::EventArgs^ e) { frm1->show(); this->hide(); }
Για το Button Επόμενο> της Form2 γράφουμε τον παρακάτω κώδικα: private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { frm3->show(); this->hide(); } Για το Button <Προηγούμενο της Form3 γράφουμε τον παρακάτω κώδικα: private: System::Void button1_click(system::object^ sender, System::EventArgs^ e) { frm2->show(); this->hide(); } Για το Button Έξοδος της Form3 γράφουμε τον παρακάτω κώδικα: private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { Application::Exit(); } Για το Button Ολοκλήρωση της Form3 γράφουμε τον παρακάτω κώδικα: private: System::Void button3_click(system::object^ sender, System::EventArgs^ e) { MessageBox::Show("Η Εγκατάσταση Ολοκληρώθηκε με Επιτυχία!", "Εφαρμογή",MessageBoxButtons::OKCancel,MessageBoxIcon::Exclamation);}