Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

package - klironomikotita C#

Îåêßíçóå áðü ôï ìÝëïò maria_papan. Τελευταία δημοσίευση από το μέλος Μπιρμπίλης Γεώργιος στις 14-05-2009, 23:18. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-03-2009, 09:22 49526

    package - klironomikotita C#

    Καλημέρα σας.

    Ελπίζω να σας έλλειψα εγώ και οι απορίες μου.

    Έχω την Form2 όπου έχω μέσα σε αυτή μια συνάρτηση public, και έχω και την Form3 μέσα στην οποία θέλω να καλέσω την συνάρτηση της Form2.  Στην C# βλέπω πως όλες οι Φόρμες κληρονομούν απο την FORM

    namespace Geniki_Sinelefsi

    {

       public partial class Form2 : Form

       {

    ...........

    Πως θα γίνει να καλέσω την συνάρτηση της Form2 από την Form3?????????

  •  23-03-2009, 10:24 49527 σε απάντηση της 49526

    Απ: package - klironomikotita C#

    καπου στην φορμα 3 δοκιμασε το παρακατω (ας πουμε σε ενα κουμπι)

    {
      Form2 MyForm2 = new Form2();
      MyForm2.Mypublic();
    }

    ελπιζω να ειναι αυτο που θες.Smile

    p.s το παραπανω παραδειγμα καλει μια public function απο την φορμα 2 που τυχαια της εδωσα το ονομα MyPublic. αντιστοιχα εκει θα βαλεις το ονομα της δική σου function.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  23-03-2009, 10:33 49528 σε απάντηση της 49526

    Απ: package - klironomikotita C#

    Αυτό που χρειάζεται είναι να έχεις ένα reference της καλούσας φόρμας (Form2) μέσα στην καλούμενη φόρμα (Form3). Συνήθως γίνεται βάζοντας στην Form3 ένα property τύπου Form2 στο οποίο δίνεις ως τιμή την Form2 πριν εμφανίσεις την Form3. Δηλαδή:

    Στη Form2

    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form3 calledForm = new Form3();
                calledForm.CallingForm = this;
                calledForm.ShowDialog();
            }
    
            public void DisplayMessage() 
            {
                MessageBox.Show("Hello from Form2");
            }
        }
    }

    Στην Form3

        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
    
            public Form2 CallingForm { get; set; }
    
            private void DoSomething() 
            {
                CallingForm.DisplayMessage(); 
            }
        }

    Τώρα, υπάρχουν τρία θέματα που χρειάζονται κουβέντα.

    1. Ο τύπος στο property CallingForm είναι Form2, όχι Form που είναι το base type που παρατήρησες. Με αυτόν τον τρόπο μπορούμε να έχουμε πρόσβαση στη μέθοδο DisplayMessage της Form2. Αν ο τύπος ήταν Form, τότε θα έπρεπε να κάνουμε cast της Form σε Form2.
    2. Δεν μπορούμε να χρησιμοποιήσουμε το property callingForm μέσα στον constructor της Form3 (μετά το InitializeComponent) αφού δεν θα έχει προλάβει να ορισθεί. Αν θέλουμε να γίνεται κάτι τέτοιο τότε θα πρέπει ο constructor να αποκτήσει παράμετρο.
    3. (Και σπουδαιότερο) Όταν ανακαλύπτεις ότι ένα κομμάτι κώδικα που έχεις βάλει σε μια φόρμα, χρειάζεται να κληθεί από άλλη φόρμα, τότε θα πρέπει να επανασχεδιάσεις το πρόγραμμα σου ώστε αυτό το κομμάτι κώδικα να βρίσκεται σε κάποιο ανεξάρτητο σημείο (πχ σε μια κλάση) και να μπορεί να κληθεί από όπου υπάρχει ανάγκη. Δεν είναι καλό πράγμα να εξαναγκάζεις τις φόρμες να γνωρίζουν η μία για την άλλη.

    Vir prudens non contra ventum mingit
  •  23-03-2009, 11:34 49530 σε απάντηση της 49528

    Απ: package - klironomikotita C#

    KelMan:

    1. (Και σπουδαιότερο) Όταν ανακαλύπτεις ότι ένα κομμάτι κώδικα που έχεις βάλει σε μια φόρμα, χρειάζεται να κληθεί από άλλη φόρμα, τότε θα πρέπει να επανασχεδιάσεις το πρόγραμμα σου ώστε αυτό το κομμάτι κώδικα να βρίσκεται σε κάποιο ανεξάρτητο σημείο (πχ σε μια κλάση) και να μπορεί να κληθεί από όπου υπάρχει ανάγκη. Δεν είναι καλό πράγμα να εξαναγκάζεις τις φόρμες να γνωρίζουν η μία για την άλλη.

    totally agree on that!


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  23-03-2009, 12:08 49533 σε απάντηση της 49527

    Απ: package - klironomikotita C#

    αυτό που είπες JOHNY γιατί δεν δουλεύει? δεν το αναγνωρίζει δλδ. Kelman θα δω την απάντησή σου στο σπίτι.

    ευχαριστώ ολόυς

  •  23-03-2009, 14:02 49537 σε απάντηση της 49533

    Απ: package - klironomikotita C#

    maria_papan:

    αυτό που είπες JOHNY γιατί δεν δουλεύει? δεν το αναγνωρίζει δλδ. Kelman θα δω την απάντησή σου στο σπίτι.

    ευχαριστώ ολόυς

    "σε εχασα" τωρα? τι με ρωτας ακριβως οτι δεν δουλευει, ειπα εγω οτι δεν δουλευει κατι? ενωεις γιατι αν το παρεις ετσι οπως ειναι δεν προκειτε να παιξει? αν λες αυτο λογικο ειναι βρε Μαρακι, που να ξερω τι ονοματα εχεις δοσει στις φορμες σου και στην function σου να σου γραψω το παραδειγμα κομένο και ραμενο στα μετρα σου?

    (να θυμισω οτι εγω δεν ειμαι της c# γραφω σε VB.net και αυτο ειναι απο μετατροπη κωδικα που σου εδωσα, αλλα λογικα παιζει)

    παντα ετσι μιλαμε με "γενικα" παραδειγματα αλλα δεν νομιζω οτι ειναι τοσο δυσκολο να καταλαβεις τι πρεπει να αντικατασταυθει ωστε να παιξει! στο λεω κι ολας!(κοιτα μην με παρεξηγησεις και μου τα "χωσεις" αδικα)Wink

    ειναι σαν να κανουμε μαθημα αγγλικα και λεω εγω οτι για να πεις "Γεια σου" σε καποιον με το ονομα του λεμε παραδειγμα "Hello " και το ονομα του "Hello Maria" αμα εγω σου φωναξω "Hello Bety" λογικο ειναι να μην "δουλεψει" ετσι κι εσυ ατικατεστησε τα ονοματα μου αν δεν ειναι ομοια με τα δικα σου με τα σωστα δικά σου και λογικα θα εχεις αποτελεσματα. ειναι ενας συντομος και ολιγον προχειρος τροπος αλλα λογικα θα κανει αυτο που θες. καλητερα ομως να οργανωσεις το project σου οπως ειπαι και ο συναδελφος παραπανω,

    δες το σαν να μενεις με καποιος σε ενα σπιτι και εχεται τα προσωπικα σας αντικειμενα αλλα εχεται και κατι κοινο, παραδειγμα ενα άρωμα, αυτο το άρωμα δεν ειναι και τοσο "λογικο" να ειναι μονο στο δωματιο σου και στο συρταρι σου αφου ειναι καθαρα κοινο και θα το ζηταει και ο συγκατικο σου συννεχεια! βαλτο σε ενα κοινο μερος που θα εχεται ευκολοτερα προσβαση και οι 2 οπως το μπανιο.ασε που δεν θα σου ανακατευει και το συρταρι σου και δεν θα μπαινει στο δωματιο οταν αλλαζεις (Devil hiumor Stick out tongue) φανταζομαι καταλαβαινεις το παραδειγμα.

    ετσι ειναι και με τον προγραμματισμο. μια συναρτηση μια ρουτινα οτιδηποτε ειναι κοινο σε παραπανω απο 1 φορμα μεσα στο προγραμμα σου φτιαξε στο project μια κλαση και βάλτην εκει μεσα!

    μετα μπορεις ευκολα να δηλωσεις την κλαση σε οποια φορμα την χρειαζεσαι και να την καλεις αμεσα! Γιατι αν το αφησεις εσα σε 1 φορμα καποια στιγμη θα το ξεχασεις που ειναι και θα δυσκολευεσαι να το συντηρησεις (ασε που θα φορτωνεις και αχρηστα πραγματα μαζι με την φορμα αρα μπορει να προκαλεις και κανα bug) ενω με μια κλαση η ενα module εινα πολυ ποιο οργανωμενο και ευκολο να το συντηρεις μετα και ισως ποιο γρηγορο στην εκτελεση, αλλα σιγουρα θα ειναι ποιο ασφαλες και θα μειωσεις δραστικα τις πιθανοτητες κατι να παει στραβα.

    τονιζω οτι εσυ αποφασιζεις το πως σε βολευει να το κανεις τωρα και στο μελλον.οχι εμεις, απλα ειναι μια κοινα αποδεκετη συμβουλη αυτη.μην νομιζεις ολοι καπως ετσι ξεκινησαμε, γραφαμε οπου μας βολευε η μας φαινοταν ευκολο και μετα σιγα σιγα βελτιωνομασταν δοκιμαζοντας νεους τροπους.Big Smile

     


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  14-05-2009, 23:14 50713 σε απάντηση της 49526

    Απ: package - klironomikotita C#

    Αν θα υπάρχει μόνο ενα instance της Form2 τότε μια παλιου τύπου λύση είναι να βάλεις ένα static (shared στην ορολογία της VB.net) πεδιο στην κλάση Form2, τύπου "Form2" (public static Form2 myOneAndOnlyForm2Instance;) και να πείς σε κάποιο σημείο (π.χ. constructor) όπου αρχικοποιείται η φόρμα το εξής:

    myOneAndOnlyForm2Instance = this;

    Μετά στη Form3 θα πείς Form2.myOneAndOnlyForm2Instance.doSomething(); όπου "doSomething" μια public μέθοδος της Form2


    Microsoft MVP J# 2004-2010
    Borland Spirit of Delphi 2001
    http://zoomicon.com
    Δημοσίευση στην κατηγορία: ,
  •  14-05-2009, 23:18 50714 σε απάντηση της 50713

    Απ: package - klironomikotita C#

    Στη VB.net πάντως μπορείς (στα WinForms) να μιλάς σε ένα κεντρικό collection που περιέχει τις φόρμες της εφαρμογής. Αν δεν έχεις κάτι τέτοιο στη C# εύκολα μπορείς να φτιάξεις μια κλάση FormsManager με μια μέθοδο public static addForm(Form, key) που να βάζει σε ένα HashTable/Dictionary τη φόρμα που του δίνεις με κάποιο μοναδικό όνομα (key - κλειδί) που δίνεις. Μετά από οπουδήποτε μιλάς στο manager και παίρνεις τη φόρμα που θες δίνοντας το όνομα αυτό αρκει να έχει αυτός μια μέθοδο public static Form getForm(key)

    Microsoft MVP J# 2004-2010
    Borland Spirit of Delphi 2001
    http://zoomicon.com
    Δημοσίευση στην κατηγορία: ,
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems