theoamd Δημοσιεύτηκε Μάϊος 9, 2013 #1 Δημοσιεύτηκε Μάϊος 9, 2013 Κατ' αρχάς Χριστός Ανέστη και Χρόνια Πολλά.Ουδεμία σχέση είχα με τη VB, μέχρι που 3 εβδομάδες νωρίτερα, ένας φίλος, ζήτησε βοήθεια για μια εργασία του.Η εργασία δεν ζητούσε κάτι εξαιρετικό και έτσι οι 150 γραμμές κώδικα, παρήχθησαν σχετικά άνετα, εξαιρώντας ορισμένες μικροδυσκολίες της γλώσσας.Τώρα, όμως, κόλλησε κάπου το όλο θέμα στη δεύτερη εργασία του, η οποία ζητάει, εν ολίγοις :- εισαγωγή και έλεγχο εγκυρότητας δεδομένων σε 4 text fields- εμφάνισή τους σε ένα άλλο text field- έλεγχο μικρότερης και μεγαλύτερης παρουσιασθείσας τιμής(η οποία παράγεται σαν πηλίκο 2 αριθμητικών τιμών από τα text fields), ο οποίος θα γίνεται αντιληπτός από τις συνεχείς ανανεώσεις 2 σχετικών text fields, κατά την εισαγωγή δεδομένων.Το κώλυμα, είναι στο τελευταίο ζητούμενο, γιατί μάλλον θέλει πίνακα και δε μπορώ να καταλάβω πως θα λειτουργήσει ο βρόχος και ο πίνακας.Για όποιον δεν έγινα κατανοητός, ιδού και η εκφώνηση http://elearning.teiser.gr/file.php/80/ergasies/ef-pli-II-ask2-12-13E.pdf
nucleus Μάϊος 9, 2013 #2 Μάϊος 9, 2013 Χρόνια πολλά και σε εσένα.Ας γράψουμε μερικά κιλά κώδικα Από ότι βλέπω από την εκφώνηση το αντικείμενο (class) είναι αρκετά προφανές. Αν θες να το κάνεις με καθαρό αντικειμενοστρεφή προγραμματισμό αρκεί να ορίσεις τις private και τις public ιδιότητες που θέλεις σαν πεδία και στον constructor απλώς να βάζεις τις τιμές.Μην ξεχάσεις να ορίσεις και την μέθοδο που θα σου επιστρέφει σαν ένα ενιαίο string της πληροφορίες του αντικειμένο (για συνένωση string ξέρεις υποθέτω ) Εναλλακτικά μπορείς να φτιάξεις properties με Get (για να παίρνεις τις τιμές) και Set (για να βάζεις τιμές) παράδειγμα property Private _CategoryId As IntegerPublic Property CategoryId() As IntegerGet Return _CategoryIdEnd GetSet(ByVal value As String) _CategoryId = valueEnd SetEnd Property To "καλό" με τα properties είναι ότι δεν χρειάζεται να υπολοποιήσεις contructor. O παραπάνω κώδικας θα μπει μέσα σε ένα απλό vb αρχείο. Μετά ξεκινάς το window application project sto visual studio.Φτιάχνεις την φόρμα όπως την έχει το pdf. Bάζεις περιγραφικά ονόματα στα textboxes για την δημιουργία του νεόυ δήμου μην βάλεις κανένα textbox1,textbox2,textbox3,textbox4. Στο onclick event του button θα κάνεις πρώτα τους ελέγχους που ζητάει. Κατά την εισαγωγή των 4 στοιχείων θα πρέπει •ο κωδικός και το όνομα να μην είναι κενά αλφαριθμητικά, •η έκταση (σε τετραγωνικά χιλιόμετρα) να είναι πραγματικός,μη αρνητικός αριθμός και •ο πληθυσμός να είναι μη αρνητικός ακέραιος. Αν κάποια από αυτές τις συνθήκες δεν ισχύει, θα πρέπει να φροντίσετε να μη δέχεται το πρόγραμμα την εισαγωγή του δήμου Για την εμφάνιση μηνύματος στον χρήστη υπάρχει η συνάρτηση MsgBox("Test Me!") Για την τιμή που έχει βάλει ο χρήστης στο textbox κοίτα την ιδιότητα Text του textbox. Η πραγματοποίηση των ελέγχων αφήνεται σαν άσκηση στον αναγνώστη. Αφού όλοι οι έλεγχοι είναι αρνητικοί τότε θα φτιάχνεις ένα νέο αντικείμενο του τύπου που ορίσαμε αρχικά στο vb αρχείο απλώς καλώντας τον constructor με τις τιμές των textboxes.Kαι εδώ φτάνουμε στο πρόβλημα:Που θα κρατάς τα αντικείμενα που ίσως έφτιαξες νωρίτερα? Σε ένα πίνακα που είναι και το πιο απλό αλλά που θα αρχικοποιείται αυτός? Hint:και η φόρμα σου είναι στην ουσία ένα αντικείμενο (class) που μπορεί να έχεις ιδιοτητες και μεθόδους που έχεις ορίσει εσύ. Αφού ξεπεράσεις και το παραπάνω "εμπόδιο" περνάς στην φάση των επιπλέον στοιχείων που πρέπει να υπολοποιήσεις Αν η πυκνότητα πληθυσμού του δήμου είναι μεγαλύτερη όσων δήμων έχουν εξεταστεί μέχρι στιγμής, θα ενημερώνεται επίσης το label με τίτλο Μέγιστη πυκνότητα πληθυσμού και εάν είναι μικρότερη όσων έχουν εξεταστεί,θα ενημερώνεται το label με τίτλο Ελάχιστη πυκνότητα πληθυσμού. Θα χρησιμοποιήσεις το for each For Each...Next Statement (Visual Basic) Hint: For Each element [ As datatype ] In group Οι έλεγχοι που πρέπει να γίνουν μέσα στο for each αφήνονται επίσης σαν άσκηση.
theoamd Μάϊος 9, 2013 Author #3 Μάϊος 9, 2013 Θα χρησιμοποιήσεις το for eachFor Each...Next Statement (Visual Basic)Hint: For Each element [ As datatype ] In groupΟι έλεγχοι που πρέπει να γίνουν μέσα στο for each αφήνονται επίσης σαν άσκηση.Δυστυχώς, δεν έγινε κατανοητό το αρχικό post κι έτσι νομίζω άδικα έγραψες οτιδήποτε βρισκόταν πιο πάνω από το block της απάντησής σου που παραθέτω.Βέβαια, στον προγραμματισμό, τίποτε και ποτέ δεν είναι χαμένος χρόνος, καθώς πολλές φορές, μπορούμε να υποδείξουμε/ανακαλύψουμε νέες μεθόδους/διεξόδους χωρίς να το καταλάβουμε.Anyway, το ζητούμενο είναι ότι έχουν γίνει όλα τα απαραίτητα πρωτού δημιουργηθεί το post και το μόνο που έχει μείνει είναι το τελευταίο κομμάτι, δηλαδή αυτό στο οποίο αναφέρεται και η παράθεσή μου, αλλααααααά...αν σου πω ότι δεν κατάλαβα σχεδόν τίποτα σχετικά με το for each(δεν με βοήθησαν ιδιαίτερα και τα παραδείγματα)?ίσως φταίει και η δεύτερη συνεχόμενη βραδινή προπόνηση :hang2:Μπορείς να γίνεις λίγο πιο συγκεκριμένος?
nucleus Μάϊος 9, 2013 #4 Μάϊος 9, 2013 Πως έχεις ονομάσεις την κλάσση που φτιάξατε?Dhmos?for each dhmos as Dhmos in (όνομα πίνακα που κρατάει τους δήμους) [εδώ κάνεις τους ελέγχους κάθε στοιχείο του πίνακα είναι η μεταβλητή dhmos]Νext
theoamd Μάϊος 10, 2013 Author #5 Μάϊος 10, 2013 Χαχ δεν μπορώ να καταλάβω γιατί δεν παίζει.Νομίζω θα χρειαστούμε αναγκαστικά list για dynamic προσπέλαση των αντικειμένων.Βασικά η λίστα θα αφορά μόνο την ποσότητα που θέλουμε να εξετάσουμε, δηλαδή την πυκνότητα, οπότε θα έχουμε σίγουρα κάτι του στυλ Dim lista As New List(Of Double).Αρχικά, έκανα την παραπάνω δήλωση στην κλάση και εντός του constructor κάνω ένα lista.Add(getPP()), όπου getPP(), η getter την πυκνότητας πληθυσμού.Το σφάλμα είναι ότι συντάσσοντας το for each μου πετάει ότι το lista δεν είναι declared. Που κολλάει αυτό;
nucleus Μάϊος 10, 2013 #6 Μάϊος 10, 2013 Dim lista As New List(Of Double).Αρχικά, έκανα την παραπάνω δήλωση στην κλάση και εντός του constructor κάνω ένα lista.Add(getPP()), όπου getPP(), η getter την πυκνότητας πληθυσμού.Σε ποιά κλάση έβαλες την δήλωση της λίστας? Στην κλάση του form που περιέχει την φόρμα για το application ή στην κλάση Dhmos στο ξεχωριστό vb αρχείο?Πρέπει να μπει στην κλάση του form.Και εκεί δεν χρειάζεται καν να μπει στον constructor.επίσης κάνεις αυτό lista.Add(getPP()) η getPP() είναι public function στην κλάση Dhmos?Αν όχι εκεί πρέπει να την βάλεις.Αν ναι τότε την καλείς λάθος,δεν ορίζεις το αντικείμενο στο οποίο θα σου επιστρέψει την τιμή της πυκνότητας πληθυσμού. θέλει να την καλέσεις έτσιDim dhmosKallitheas as new Dhmos()Dim pyknothtaPlithismoy = dhmosKallitheas.getPP()Ελπίζω να κατάλαβα σωστά αυτή την φορά.
theoamd Μάϊος 10, 2013 Author #7 Μάϊος 10, 2013 Κάτι έχω σήμερα, δεν εξηγείται αλλιώς.Edit, λοιπόν!Αυτό που έπρεπε να αναφέρεται στο προηγούμενο ποστ είναι : lista.Add(acc.getPP()), όπου acc το εν λόγω αντικείμενο.Έβγαλα από την κλάση Dhmos τη λίστα-υπάρχει πλέον μόνο στην κλάση της φόρμας.Public Class Form1Dim lista As New List(Of Double)Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim acc As New Dhmos() <<<@!1!@>>> acc = New Dhmos(TextBox1.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text) lista.Add(acc.getPP()) TextBox2.Text = acc.getInfo() For Each dhmos As Dhmos In [S]lista[/S] NextEnd SubEnd Classτα ονόματα των tb μην τα κοιτάς, πίστευα θα την έβγαζα σ' ένα βράδυ χαχGetting an error like this :Value of type 'Double' cannot be converted to 'Project2.Dhmos' .
nucleus Μάϊος 11, 2013 #8 Μάϊος 11, 2013 Dim acc As New Dhmos()acc = New Dhmos(TextBox1.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text)Λάθος 1:2 φορές ορίζεις το ίδιο αντικείμενο? Dim acc as New Dhmos(TextBox1.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text)Λάθος 2:Oρίζεις αρχικά την μεταβλητή lista σαν list(Of Double) και στο for each κάνεις αυτό For Each dhmos As Dhmos In lista NextΑφού η lista είναι τύπου Double το Αs γιατί είναι Dhmos? For Each pyknothtaPlithismoy as Double In lista NextΜε το λάθος 2 λογικό το cast error.Επίσης στο For each το [As Τύπος] είναι προαιρετικό.Αλλά καλό είναι να το χρησιμοποιείς για τον έλεγχο λαθών.Αν πχ έγγραφες For Each dhmos In lista NextΣτον κώδικα σου η μεταβλητή dhmos θα γινόταν αυτόματα τύπου double γιατί η λίστα είναι τύπου Of Double
theoamd Μάϊος 11, 2013 Author #9 Μάϊος 11, 2013 Dim acc as New Dhmos(TextBox1.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text)Οπότε καλά το είχα, αρχικά.Νόμιζα κατέληξα σε λύση, αλλά οι παρακάτω γραμμές ~μάλλον~ δουλεύουν για δυάδες :For Each pp As Double In lista largest = Math.Max(largest, pp) smallest = Math.Min(smallest, pp) NextΚάτι πιο βέλτιστο;
nucleus Μάϊος 11, 2013 #10 Μάϊος 11, 2013 Αν αυτό το for each σου φέρνει σωστά αποτελέσματα δεν μπορείς να κάνεις κάτι πιο βέλτιστο.
theoamd Μάϊος 11, 2013 Author #11 Μάϊος 11, 2013 Δικό μου λάθος ήταν, μια χαρά δουλεύει τελικά. Mission accomplished. Thanks a lot. PS* γ@_ _ σε το for each
Recommended Posts
Archived
This topic is now archived and is closed to further replies.