Οι πίνακες στην C++/CLI δημιουργούνται και δεσμεύουν χώρο στο Managed Heap (Garbage Collected Heap) Για τον λόγο αυτό οι μεταβλητές των πινάκων



Σχετικά έγγραφα
Το MS Visual Studio επιτρέπει στον προγραμματιστή να αναπτύξει προγράμματα σε δύο διαφορετικές εκδόσεις της γλώσσας C++ : ISO/IEC C++ που αποτελεί

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Συνέχεια του αντικειμενoστραφούς προγραμματισμού Επέκταση των κλάσεων σε Visual Components (Window Controls) Κατασκευή του Interface στο Design Time,

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

4 η Εργαστηριακή Άσκηση

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

Δομημένος Προγραμματισμός

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

Παρουσίαση Delphi. Μέμος-Μπαγκράτσας Ιωάννης 1232 Μαργαρίτης Νικόλαος 1226

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

ΔΟΜΗΜΕΝΟΣ ΟΠΤΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠAΡΑΘΥΡΙΚΟ ΠΕΡΙΒΑΛΛΟΝ με τη Γλώσσα Προγραμματισμού VISUAL BASIC (1 ο ΕΠΙΠΕΔΟ)

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

New Project Windows Forms Applications

Διαδικτυακό Λογισμικό Αριθμητικής Ανάλυσης. Numerical Analysis Network Software

ΜICROSOFT VISUAL STUDIO Eργ 1: Ανάπτυξη απλής εφαρµογής: Solutions, Projects, GUI, Events, Debugging. Εισαγωγή

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Αντικειµενοστρεφής Προγραµµατισµός

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC ΤΙ ΜΠΟΡΟΎΜΕ ΝΑ ΚΆΝΟΥΜΕ ΜΕ ΤΗ VISUAL BASIC ΑΝΤΙΚΕΊΜΕΝΑ: ΦΌΡΜΑ ΚΑΙ ΧΕΙΡΙΣΤΉΡΙΑ ΕΤΙΚΈΤΑ LABEL

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Διαδικασιακός Προγραμματισμός

7η Εργαστηριακή Άσκηση: Προβολή εικόνας στη φόρμα με εκτέλεση ερωτήματος.

Οντοκεντρικός Προγραμματισμός

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΟΔΗΓΙΕΣ ΔΗΜΙΟΥΡΓΙΑΣ ΕΦΑΡΜΟΓΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΑΜΕΣΟΥ ΑΡΧΕΙΟΥ ΣΕ ΠΕΡΙΒΑΛΛΟΝ VISUAL STUDIO NET

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Αντικειμενοστρεφής Προγραμματισμός

Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database

Αντικειμενοστραφής Προγραμματισμός

Δομές Δεδομένων & Αλγόριθμοι

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Computing. Νοέμβριος Έκδοση 1.0

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Η γλώσσα προγραμματισμού C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

Πως θα κατασκευάσω το πρώτο πρόγραμμα;

Δυναμική μνήμη με πίνακες και λίστες

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Αντικειμενοστρεφής Προγραμματισμός

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

Επίλυση προβλήματος με Access

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Βασικά Στοιχεία της Java

ΑΝΑΠΤΥΞΗ ΔΙΑΔΡΑΣΤΙΚΗΣ ΙΣΤΟΣΕΛΙΔΑΣ ΠΑΡΑΓΓΕΛΙΩΝ ΛΙΑΝΙΚΗΣ ΣΕ ΕΡΓΟΣΤΑΣΙΟ

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Εισαγωγή στην πληροφορική

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Γενικά (για τις γραπτές εξετάσεις)

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Γράφοντας μουσική με το Finale 2006 (B μέρος)

Δομές Δεδομένων & Αλγόριθμοι

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Το PowerPoint (PP) είναι ένα γραφικό πρόγραμμα για παρουσιάσεις. Χαρακτηριστικά Παρουσιάσεων:

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Υπολογιστών με C++

Κλάσεις και Αντικείµενα

Υπερφόρτωση τελεστών (operator(

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Στις εφαρμογές της C++/CLI μπορούμε να ενσωματώσουμε δύο ειδών μενού: 1. Κύρια Μενού (Main Menu) Τα οποία εμφανίζονται στο επάνω μέρος της φόρμας,

Διαδικασία Ανάπτυξης Λογισμικού

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Visual Basic Γλώσσα οπτικού

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

Παράρτημα A: PHP, HTML φόρμες και το πρωτόκολλο HTTP.

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Transcript:

Οι πίνακες στην 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);}