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



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

Στοιχειώδης προγραμματισμός σε C++

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

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

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

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

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

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

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

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

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Τύποι δεδομένων, τελεστές, μεταβλητές

Αναφορές, είκτες και Αλφαριθμητικά

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

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

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

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

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

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

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Κλάσεις και αντικείμενα #include <iostream.h<

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

Δεδομένα, Τύποι και Τιμές

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

Προγραμματισμός ΙI (Θ)

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

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

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

(3) Από την εργαλειοθήκη επιλέξτε το εργαλείο «ετικέτας (Label)». Δημιουργήστε μια ετικέτα στην φόρμα σας.

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

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

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

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

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

Προγραμματισμός Ι (ΗΥ120)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΗΥ-150. Προγραμματισμός

ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΤΗ VISUAL BASIC Γ ΓΥΜΝΑΣΙΟΥ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Δεδομένα, τελεστές, είσοδος/έξοδος

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

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

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

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι

Προγραμματισμός Η/Υ (ΤΛ2007 )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

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

Προγραμματισμός Ι (ΗΥ120)

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

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

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

3. Εκφράσεις και έλεγχος ροής

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

Προγραμματισμός Δομές Δεδομένων

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

Transcript:

Το MS Visual Studio επιτρέπει στον προγραμματιστή να αναπτύξει προγράμματα σε δύο διαφορετικές εκδόσεις της γλώσσας C++ : ISO/IEC C++ που αποτελεί την στάνταρ έκδοση της γλώσσας, χρησιμοποιεί στάνταρ βιβλιοθήκες όπως η std. Με αυτή μπορεί ο προγραμματιστής να φτιάξει εγγενείς εφαρμογές (Native) που μεταφράζονται σε κώδικα μηχανής και επικοινωνούν απευθείας με το Windows API (Application Programming Interface). Η βιβλιοθήκη μέσω της οποίας μπορούν να αναπτυχθούν εφαρμογές για Windows είναι η γνωστή βιβλιοθήκη MFC (Microsoft Foundation Class Library) C++/CLI (Common Language Interface) που αποτελεί μία επέκταση της παραπάνω γλώσσας και με αυτή μπορεί κανείς να εκτελεί εφαρμογές που χρησιμοποιούν το CLR (Common Language Runtime) και απευθύνονται στο.net Framework. Με αυτή την γλώσσα αναπτύσσονται εφαρμογές που ονομάζονται Windows Forms Applications

Στην C++/CLI χρησιμοποιούνται τα namespaces (όχι στην βιβλιοθήκη MFC). Σε γλώσσες προγραμματισμού με πολλαπλές βιβλιοθήκες όπως και η C++ υπάρχει πιθανότητα το όνομα (identifier) μίας συνάρτησης, ενός τύπου, μίας σταθεράς, μίας μεταβλητής κ.λ.π. να υπάρχει σε περισσότερες από μία βιβλιοθήκες. Σε αυτή αν ο προγραμματιστής χρησιμοποιήσει το όνομα αυτό στο πρόγραμμά του δημιουργείται ασάφεια (ambiguity) στον compiler ή και στον linker ως προς τον identifier αυτόν. Για τον λόγο αυτό χρησιμοποιούνται οι χώροι ονομάτων (Namespaces). Ένα Namespace μπορεί να περικλείει ένα μεγάλο αριθμό δηλώσεων συναρτήσεων, τύπων, κλάσεων, σταθερών, μεταβλητών κ.λ.π. Κάποια από τα ονόματα (identifiers) που χρησιμοποιούνται στο namespace μπορεί να είναι δηλωμένα και σε άλλο Namespace, με διαφορετική χρησιμότητα και λειτουργία. Όταν πρέπει να χρησιμοποιήσουμε αυτό το όνομα βάζουμε μπροστά το πρόθεμα του χώρου ονομάτων : <namespace>::<identifier>, χωρίζοντάς τα με το :: (scope resolution operator)

Παράδειγμα: namespace simple { int value=0; } namespace complex { int value=1; } void main() { int j,k; j=simple::value; k=complex::value; } Για να μην επαναλαμβάνει ο χρήστης το namespace qualifier μπορεί να χρησιμοποιήσει την δήλωση using ως εξής: using simple::value; Μετά την δήλωση αυτή μπορεί να χρησιμοποιήσει την μεταβλητή value από τον χώρο ονομάτων simple χωρίς να επαναλαμβάνει το πρόθεμα «simple::». Έτσι όταν βρεθεί σκέτη η μεταβλητή value θα εννοείται η simple::value, ενώ για την άλλη θα πρέπει να γράψουμε complex::value.

Αν ο προγραμματιστής θέλει να ενσωματώσει όλες τις δηλώσεις ενός χώρου ονομάτων στο δικό του πρόγραμμα, ώστε να μπορεί να τα χρησιμοποιεί, αρκεί να δηλώσει την οδηγία : using namespace <χώρος_ονομάτων>, π.χ using namespace simple Όλες οι βιβλιοθήκες του.νετ Framework βασίζονται στο System namespace. Εκτός όμως από αυτό υπάρχουν και εξειδικευμένα namespaces που περιλαμβάνουν ειδικές κλάσεις για ειδικές περιπτώσεις όπως π.χ. η System::Data που σχετίζεται με βάσεις δεδομένων. Για τον λόγο αυτό σε ένα νέο Project δημιουργείται ο εξής κώδικας: namespace <όνομα_εφαρμογής>{ using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; }

Στην C++/CLI ο χώρος στον οποίο δεσμεύεται δυναμικά μνήμη ονομάζεται managed heap. Η συλλογή σκουπιδιών garbage collection έχει την δυνατότητα να μετακινήσει τα αντικείμενα που είναι ορισμένα μέσα στο managed heap, ώστε να συμπιέσει τον ελεύθερο χώρο για να γίνει περισσότερο χρησιμοποιήσιμος. Έτσι τα αντικείμενα που δημιουργούνται στο managed heap δεν μπορεί να ελέγχονται από στάνταρ δείκτες (pointers) της C++. Για τον λόγο αυτό χρησιμοποιούνται οι Λαβές Εντοπισμού (Tracking Handles) που αποτελούν εξειδίκευση της C++/CLI. Οι Λαβές Εντοπισμού συμβολίζονται με το σύμβολο «^» που ονομάζεται καπελάκι ή hat. Παράδειγμα : String ^ name; int ^ number; array <int> ^ data; array <String ^> ^ names;

Οι Λαβές Εντοπισμού μοιάζουν με τους κοινούς δείκτες (pointers) αλλά έχουν και σημαντικές διαφορές : 1. Οι Λαβές Εντοπισμού αποθηκεύουν διευθύνσεις όπως και οι δείκτες. 2. Για να απευθυνθείς στην τιμή ή το αντικείμενο που «δείχνει» η Λ.Ε. θα πρέπει να χρησιμοποιήσεις τον τελεστή «*». Π.χ int ^ number(10); int k; k=*number; (oπότε το k παίρνει την τιμή 10). 3. Οι διευθύνσεις των Λ.Ε. μπορούν να αλλάζουν σε αντίθεση με τους δείκτες που παραμένουν σταθεροί. 4. Οι Λ.Ε. ενημερώνονται από τον garbage collector αυτόματα κατά την συμπίεση του Managed Heap και την μετατόπιση αντικειμένων μέσα σε αυτό. 5. Με τις Λ.Ε. δεν είναι δυνατόν να εφαρμοστούν πράξεις διευθύνσεων (π.χ. int * p; p=new int[10]; ; std::cin >> *p; p++; ) Όλα τα αντικείμενα που ανήκουν σε κλάσεις του τύπου «Reference Class Type» δημιουργούνται στο Managed Heap

Οι κλάσεις των αντικειμένων της C++/CLI χωρίζονται σε Value Class Types και Reference Class Types. Τα αντικείμενα των τύπων Value Class αποθηκεύουν τα δεδομένα τους μέσα στον ίδιο τον χώρο που καταλαμβάνει το αντικείμενο. Στην δήλωσή τους μπαίνει το πρόθεμα value : public value class Vector {}; // value class Value Types είναι μεταξύ άλλων όλοι οι αριθμητικοί τύποι, int, long, float, double, κ.λ.π. καθώς και οι τύποι bool και char. Τα αντικείμενα των τύπων Reference Class αποθηκεύουν τα δεδομένα τους σε δυναμικά δεσμευόμενο χώρο στο Manages Heap. Στην δήλωσή τους μπαίνει το πρόθεμα ref : public ref class Block {}; // reference class public ref class Form1 : public System::Windows::Forms::Form Reference Classes είναι μεταξύ άλλων ο τύπος String, ο τύπος Array, οι κλάσεις οπτικών αντικειμένων όπως οι φόρμες (Forms) κ.λ.π. Τα αντικείμενα αυτών δημιουργούνται στο Managed Heap και για τον λόγο αυτό θα πρέπει να δηλώνονται ως tracking handles και όχι σαν απλά αντικείμενα της κλάσης.

Η δήλωση μίας μεταβλητής ως Λαβή Εντοπισμού μπορεί να συνοδεύεται και από αρχικοποίηση της τιμής της μεταβλητής π.χ. int ^ value (55); Με τον τρόπο αυτό δεσμεύεται χώρος στο Managed Heap για το αντικείμενο και αρχικοποιείται με την τιμή εντός της παρένθεσης (value=55); Για να προσπελαστεί η τιμή του αντικειμένου χρειάζεται η χρήση του τελεστή «*» δηλαδή: i = *value; result = 2 * (*value + 15); Παραδείγματα αρχικοποίησης : String ^ name(l John Smith ) το L σημαίνει 2-byte chars bool ^ answer(true); double ^ pi(3.141592) Η δέσμευση μνήμης στο Managed Heap, στο C++/CLI, γίνεται γενικά με την συνάρτηση gcnew()

Η συνάρτηση gcnew() δημιουργεί ένα αντικείμενο ενός managed τύπου δεδομένων (Value Type ή Reference Type) στο Managed Heap. Το αποτέλεσμα που επιστρέφει είναι ένα tracking handle (^) που περιέχει την διεύθυνση του αντικειμένου που δημιουργήθηκε. Εάν η gcnew() δεν μπορεί να δεσμεύσει την απαιτούμενη μνήμη τότε παράγει μία εξαίρεση OutOfMemoryExeption. Οι managed τύποι δεδομένων της C++/CLI υποστηρίζονται από συλλογή σκουπιδιών (garbage collection). Στην θέση των new() και delete() που χρησιμοποιούμε για τους Native τύπους της C++, η C++/CLI χρησιμοποιεί μόνο την gcnew(). Παραδείγματα: value class vector { public: double x; double y; }; int main() { vector ^ point = gcnew vector; //δημιουργεί ένα vector array < int > ^ data = gcnew array < int > (100); // δημιουργεί ένα πίνακα. ακεραίων 100 θέσεων

Όλοι οι γνωστοί τύποι δεδομένων της C++ υπάρχουν και στην C++/CLI με τα ίδια ονόματα, μόνο που αποτελούν κλάσεις και οι μεταβλητές αυτών των τύπων συμπεριφέρονται άλλοτε σαν απλές τιμές και άλλοτε σαν αντικείμενα (objects). Κάθε απλός τύπος δεδομένων της C++ (όπως ο int) αντιστοιχεί σε ένα τύπο κλάσης τιμής (value class type) ο οποίος έχει οριστεί στον χώρο ονομάτων System (System namespace). Αυτό σημαίνει ότι μπορούμε κατά περίπτωση να προσπελάσουμε τα μέλη δεδομένα της κλάσης μίας τέτοιας μεταβλητής ή να καλέσουμε μία μέθοδό της. Για παράδειγμα: float f; Console::Write(f.MaxValue); int i=5; String^ s; s=i.tostring();

Fundamental Type Size (bytes) CLI Value Class bool 1 System::Boolean char 1 System::SByte signed char 1 System::SByte unsigned char 1 System::Byte short 2 System::Int16 unsigned short 2 System::UInt16 int 4 System::Int32 unsigned int 4 System::UInt32 long 4 System::Int32 unsigned long 4 System::UInt32 long long 8 System::Int64 unsigned long long 8 System::UInt64 float 4 System::Single double 8 System::Double long double 8 System::Double wchar_t 2 System::Char

Ο τύπος String (System::String) είναι η κλάση της C++/CLI που χρησιμοποιείται γενικά για την αναπαράσταση αλφαριθμητικών. Περιέχει χαρακτήρες Unicode δηλαδή των 2 bytes σε αντίθεση με τα απλά strings της C/C++ που είναι πίνακες χαρακτήρων (ASCII) του ενός byte ο καθένας. Οι χαρακτήρες που περιέχει είναι του τύπου System::Char που ισοδυναμεί με τον βασικό τύπο wchar_t. Αποτελούν Reference Class Type οπότε οι μεταβλητές δηλώνονται ως tracking handles: String ^ welcome (L Good Morning ) Μπορείς να προσπελάσεις επιμέρους χαρακτήρες ενός String χρησιμοποιώντας τετράγωνες αγκύλες [] π.χ. for(i=0 ; i<welcome->length ; i++) if (welcome[i]==l ) break; H αριθμοδότηση των θέσεων ενός String ξεκινάει από το 0. Η ένωση δύο Strings γίνεται με τον τελεστή + π.χ. String^ a(l Hello ); String^ b(l World ); String^ c(a+b); ή String^ a(l Hello ); String^ b(l World ); String^ c; c=a+b;

Επειδή ο τύπος String είναι Reference Class δηλώνεται πάντα ως tracking handle και οι ιδιότητες και μέθοδοί του προσπελαύνονται με τον τελεστή -> και όχι με. Ιδιότητες: Chars[] επιστρέφει συγκεκριμένο χαρακτήρα του String δίνοντας την θέση του χαρακτήρα, π.χ wchar_t w = welcome->chars[0]; Length επιστρέφει τον αριθμό των χαρακτήρων ενός String π.χ. int a; a=welcome->length; if (a>20) Μέθοδοι (βασικές) : Trim() κόβει τα κενά (spaces) που μπορεί να υπάρχουν στην αρχή και στο τέλος ενός Srtring, π.χ String^ trimmed = welcome->trim(); TrimStart() κόβει τα κενά (spaces) που μπορεί να υπάρχουν στην αρχή ενός Srtring, π.χ String^ trimmed = welcome->trimstart(); TrimEnd() κόβει τα κενά (spaces) που μπορεί να υπάρχουν στο τέλος ενός Srtring, π.χ String^ trimmed = welcome->trimend(); PadLeft(n) συμπληρώνει κενά στην αρχή του String ώστε να φτάσει τους n χαρακτήρες, π.χ. String^ Lpad=welcome->PadLeft(30);

PadRight(n) συμπληρώνει κενά στο τέλος του String ώστε να φτάσει τους n χαρακτήρες π.χ. String^ Rpad=welcome->PadRight(30); Insert(pos, str) εισάγει στο String στην θέση pos το String str, π.χ. String^ a(l Happy Year ); String ^b(l New ); String^ c = a->insert(5,b); Remove(start,len) διαγράφει από το String τους χαρακτήρες που αρχίζουν στη θέση start και έχουν μήκος len, π.χ String^ a(l Happy Νew Year ); String^ b = a->remove(5,4); Replace(old, new) αντικαθιστά όλες τις εμφανίσεις του String old με το String new, π.χ. String^ a(l a dog is a dog ); String ^b=a->replace(l a, L the ); Substring(start, len) επιστρέφει τμήμα του String που αρχίζει στη θέση start και έχει μήκος len π.χ. String^ a(l Happy Year ); String ^b = a->substring(6,4); ToLower() μετατρέπει το String σε μικρά γράμματα π.χ. String^ a(l HAPPY NEW YEAR ); String ^b = a->tolower(); ToUpper() μετατρέπει το String σε κεφαλαία γράμματα π.χ. String^ a(l happy new year ); String ^b = a->toupper();

Η σύγκριση δύο Strings γίνεται με την μέθοδο Compare() Η μέθοδος καλείται με παραμέτρους τα δύο String που πρόκειται να συγκριθούν π.χ. String::Compare(str1, str2), και επιστρέφει έναν ακέραιο με το αποτέλεσμα της σύγκρισης που καθορίζεται ως εξής: αποτέλεσμα <0 σημαίνει str1 < str2 αποτέλεσμα =0 σημαίνει str1 = str2 αποτέλεσμα >0 σημαίνει str1 > str2 Παράδειγμα: String ^ password = L George123 ; String ^ userpwd = Console::ReadLine(); int result; result = String::Compare(password,userpwd); If (result!=0) {Console::WriteLine(L Wrong Password! ); Else { }

Η αναζήτηση σε ένα String μπορεί να γίνει με αρκετές διαφορετικές μεθόδους : IndexOf(s) ψάχνει το String s μέσα στο αρχικό και αν το βρεί επιστρέφει την θέση στην οποία αρχίζει, ή -1 εάν δεν βρεθεί. Π.χ. String^ a(l Happy Νew Year ); String^ b(l New ); int i = a->indexof(b); //αποτέλεσμα 6 Contains(s) ψάχνει μέσα στο αρχικό String για το αν περιέχεται το String s, και επιστρέφει τιμή bool, αντίστοιχα true ή false. Π.χ. String ^ username = Console::ReadLine(); if (username->contains(l root )) Console::WriteLine(L wrong name ); StartsWith(s) ψάχνει μέσα στο αρχικό String για το αν αρχίζει με το String s, και επιστρέφει τιμή bool, αντίστοιχα true ή false. Π.χ. String ^ money = Console::ReadLine(); if (money->startswith(l $ )) Console::WriteLine(L Enter Euros ); EndsWith(s) ψάχνει μέσα στο αρχικό String για το αν τελειώνει με το String s, και επιστρέφει τιμή bool, αντίστοιχα true ή false. Π.χ. String ^ DriveSize = Console::ReadLine(); if (DriveSize->EndsWith(L TByte )) Console::WriteLine(L Enter Gbyte );

Όταν είμαστε σε design mode στο δεξιό άκρο του ΙDE εμφανίζεται το Toolbox, που περιέχει λίστα με τα διαθέσιμα Controls που μπορώ να ενσωματώσω στην φόρμα. Τα Controls είναι ομαδοποιημένα σε 10 κατηγορίες, οι οποίες μπορούν να τροποποιηθούν και από τον χρήστη. Οι αρχικές κατηγορίες Controls είναι οι εξής: Common Controls: περιέχει τα πιο κοινά χρησιμοποιούμενα Controls για εφαρμογές Containers: περιέχει Controls που μπορούν να περιέχουν άλλα Controls. Menus & Toolbars : περιέχει Controls που επιτρέπουν την δημιουργία menus και toolbars Data: περιέχει Controls για διαχείριση δεδομένων Components: περιέχει σύνθετα Controls για διάφορες δουλειές.

Printing: περιέχει Controls που βοηθούν την διαδικασία εκτύπωσης Dialogs: περιέχει διαλόγους που αποτελούν ανεξάρτητες φόρμες για υλοποίηση διαδικασιών επιλογής αντικειμένων (αρχείων, font, κλπ) WPF Interoperability: περιέχει Controls για υλοποίηση αντικειμένων Windows Presentation Foundation που αποτελεί υποσύστημα γραφικών. Reporting: περιέχει Controls για την δημιουργία αναφορών (reports) Visual Basic PowerPacks: περιέχει ομάδες από πρόσθετα Controls για υλοποίηση πολυμορφικών και εντυπωσιακών εφαρμογών. General: αποτελεί άδειο γκρουπ στο οποίο ο χρήστης μπορεί να ενσωματώσει δικά του Controls.

Κληρονομείται από την κλάση System.Windows.Forms::Label. Εμφανίζει στατικό κείμενο με καθοριζόμενο μέγεθος, χρώμα και font Properties Text : το κείμενο του Label ForeColor/BackColor : το χρώμα του κειμένου/φόντου Left, Top, Right, Bottom, Location, Height, Width : θέση και μέγεθος του Control Font : το font των γραμμάτων Name : το όνομα του tracking handle που θα παραχθεί στο πηγαίο αρχείο. Visible : καθορίζει αν το αντικείμενο εμφανίζεται ή όχι Methods GetTextBuf : επιστρέφει το κείμενο του Label. SetTextBuf : καθορίζει το κείμενο του Label. Hide, Show : Εξαφανίζει / εμφανίζει το Label. Refresh(), Invalidate(), Focus(), SendToBack(), BringToFront(), SetBounds(), Scale(factor), Select(), Events Click, DoubleClick, MouseDown, MouseMove, MouseUp, MouseHover

Κληρονομείται από την κλάση System::Windows::Forms::TextBox. Εμφανίζει κείμενο και επιτρέπει την επεξεργασία του Properties Text : το κείμενο που περιέχει το TextBox Name : το όνομα του tracking handle που θα παραχθεί στο πηγαίο αρχείο. ReadOnly : αν μπορούμε να το αλλάξουμε ή όχι ForeColor/BackColor : το χρώμα του κειμένου/φόντου Font : το font των γραμμάτων WordWrap : αν θα γίνεται αναδίπλωση του κειμένου σε επόμενη γραμμή. MaxLength : μέγιστο μήκος string TabStop : αν με Tab πηγαίνουμε ή όχι σε αυτό Methods Clear() : σβήνει ολόκληρο το κείμενο του TextBox. Cut(), Copy(), Paste() εργασίες με το Clipboard Undo() ματαιώνει τη προηγούμενη ενέργεια επεξεργασίας AppendText() προσθέτει κείμενο στο τέλος Events TextChanged, Enter, Leave, KeyDown, KeyPress, KeyUp

Κληρονομείται από την κλάση System.Windows.Forms::Button. Εμφανίζει ένα κουμπί με καθοριζόμενη ετικέτα και προγραμματιζόμενη λειτουργία. Properties Text : το κείμενο που εμφανίζεται μέσα στο button Image : εικόνα που μπορεί να εμφανίζεται δίπλα στο κείμενο DialogResult: αποτέλεσμα πατήματος που επιστρέφει στην μητρική φόρμα (None, OK, Cancel, Abort, Retry, Ignore, Yes, No) Enabled : αν το κουμπί είναι ενεργό ή όχι. Cursor : το σχήμα του κέρσορα όταν είναι πάνω στο κουμπί Font : το font των γραμμάτων TabStop : αν με Tab πηγαίνουμε ή όχι σε αυτό Methods PerformClick() : πατάει το κουμπί. Focus() : μεταφέρει την εστίαση στο κουμπί. Refresh() : ξανασχεδιάζει το κουμπί Events Click, Enter, Leave, KeyDown, KeyPress, KeyUp, MouseDown, MouseMove, MouseUp, MouseHover,

Εισάγουμε τα Controls στην φόρμα και καθορίζουμε κατάλληλα το μέγεθός τους, την ιδιότητα Text και το Font του Label. Δημιουργούμε τους κατάλληλους Event Handlers για τα 5 buttons ώστε να μετακινούν το Label στο μέσον και στα 4 γωνιακά σημεία της φόρμας.

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; } private: System::Void button3_click(system::object^ sender, System::EventArgs^ e) { label1->left=0; label1->top=this->clientsize.height-label1->height; } private: System::Void button4_click(system::object^ sender, System::EventArgs^ e) { label1->left=this->clientsize.width-label1->width; label1->top=0; } private: System::Void button5_click(system::object^ sender, System::EventArgs^ e) { label1->left=this->clientsize.width-label1->width; label1->top=this->clientsize.height-label1->height; }

Εισάγουμε τα Controls στην φόρμα και καθορίζουμε κατάλληλα το μέγεθός τους, και την ιδιότητα Text. Δημιουργούμε τους κατάλληλους Event Handlers για τα 6 buttons ώστε να εκτελούν εργασίες Copy και Paste μεταξύ των TextBoxes. Δημιουργούμε κατάλληλο Event Handler για το κουμπί Κλείσιμο ώστε να κλείνει την φόρμα.

private: System::Void button1_click(system::object^ sender, System::EventArgs^ e) { textbox1->copy(); } private: System::Void button2_click(system::object^ sender, System::EventArgs^ e) { textbox2->copy(); } private: System::Void button3_click(system::object^ sender, System::EventArgs^ e) { textbox3->copy(); } private: System::Void button4_click(system::object^ sender, System::EventArgs^ e) { textbox1->paste(); } private: System::Void button5_click(system::object^ sender, System::EventArgs^ e) { textbox2->paste(); } private: System::Void button6_click(system::object^ sender, System::EventArgs^ e) { textbox3->paste(); } private: System::Void button7_click(system::object^ sender, System::EventArgs^ e) { this->close(); }

Δημιουργούμε νέα φόρμα (Form2) και εισάγουμε ένα Label ένα PictureBox και ένα Button. Αλλάζουμε το κείμενο και το font στο Label. Στο PictureBox φορτώνουμε μία εικόνα στην ιδιότητα Image Στο Button αλλάζουμε το Text και καθορίζουμε την ιδιότητα DialogResult σε true, ώστε να τερματίζει η φόρμα Στο Form1.h ενσωματώνουμε την εντολή: #include Form2.h ώστε η Form2 να είναι «ορατή» από την Form1 και να προσπελαστεί. Δημιουργούμε Event Handler για το κουμπί «Σχετικά με την εφαρμογή» private: System::Void button8_click(system::object^ sender, System::EventArgs^ e) { Form2^ tmp=gcnew Form2; tmp->showdialog(); }