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

 

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

Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 03-03-2012, 22:28. Υπάρχουν 17 απαντήσεις.
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-03-2012, 16:56 69516

    Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Καλησπέρα,

    Ψάχνω στο διαδίκτυο τις τελευταίες μέρες να βρω τρόπο με τον οποίο μπορώ να περάσω σε μια μεταβλητή τύπου form() όλες τις φόρμες που έχει το πρόγραμμά μου και ταυτόχρονα τα ονόματα αυτών σε ένα combobox.

    Διαλέγοντας μια φόρμα από το combo box θα εμφανίζονται όλα τα ονόματα των controls της εκάστοτε φόρμας σε ένα άλλο combobox. Για αυτή την κίνηση ξέρω τη να κάνω. Δηλαδή μπορώ να αντλήσω όλα ta controls μιας φόρμας και να τα περάσω σε combobox.

    Αυτό που δεν μπορώ να κάνω είναι να βρω όλες τις φόρμες.. Εύκολα βρίσκεις όλες τις ανοιχτές φόρμες αλλά δεν αρκεί.


    Με την έρευνά μου έχω βρει διάφορες θεωρίες.. και έχω δοκιμάσει διάφορους κώδικες, οι τελευταίοι εκ των οποίων είναι:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
        Private Sub frmSkinCreator_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Try
    
                Dim Count As Integer = -1
                Dim Forms() As Form
    
                Dim formType As Type = Type.GetType("System.Windows.Forms.Form")
                For Each t As Type In sender.GetType().Assembly.GetTypes()
                    If Not IsNothing(t.BaseType) AndAlso UCase(t.BaseType.ToString) = "SYSTEM.WINDOWS.FORMS.FORM" Then
                        'cbSelForms.Items.Add(t.Name)
                        Count += 1
                        ReDim Preserve Forms(Count)
                        Forms(Count) = DirectCast(getfromFromName(t.Name), Form)
                        MsgBox(DirectCast(getfromFromName(t.Name), Form).Name)
                    End If
                Next
    
                MsgBox(Forms(0))
    
                'MsgBox(Forms.Count)
                'For i = 0 To Forms.Count - 1
                '    MsgBox(Forms(i).Name)
                'Next
                'For Each frm As Form In Forms
                '    'If TypeOf frm Is Form Then
                '    cbSelForms.Items.Add(frm.Name)
                '    'End If
                'Next
    
            Catch ex As Exception
                MsgBox(ex.ToString)
                CreateCrushFile(ex.ToString)
            End Try
        End Sub

    Το πρώτο που έχω commented-out δουλεύει, και πράγματι μου περνά τα ονόματα όλων των form στο combobox, αλλά δεν με αφήνει να περάσω τις ίδιες τις forms σε μεταβλητή ώστε να μπορώ να αντλήσω τα controls του απο εκεί....

    γιατί θα πρέπει μετά να γράψω κάτι του τύπου:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Public Sub Όνομα(ByVal frm As Form)
    
            With frm
    
                        For Each MainCtrl As Control In .Controls
                            If TypeOf MainCtrl Is ............
    
                            ElseIf TypeOf MainCtrl Is ............
    
    και τα λοιπά..

    Άρα η ερώτησή μου είναι..


    πως τελικά να περάσω όλες τις φόρμες του προγράμματος σε μια μεταβλητή? για να κάνω όλο αυτό??

    και μια ρητορική ερώτηση.. γιατί δεν μπορούσε να ήταν τόσο απλό όσο ένα "For Each frm as Form in Forms" ???


  •  02-03-2012, 19:59 69517 σε απάντηση της 69516

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Κάνοντας ένα γρήγορο search αφού το μυαλό μου πήγε κατευθείαν σε Reflection. Βρήκα αυτό.

    try {
          Assembly myAssembly = Assembly.GetExecutingAssembly();
          Form myForm = myAssembly.CreateInstance(txtFormName.text) as Form;
          myForm.ShowDialog(); 
          }
      catch (System.NullReferenceException exNull) {
          MessageBox.Show ("Invalid Form name. Please note that Form names " + 
                           "are case sensitive.", "Form not found");

          System.Diagnostics.Trace.WriteLine("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-" + 
                                             Environment.NewLine + "Project Load" +
                                             Environment.NewLine + exNull.ToString());
          }
      catch (Exception ex) {
          MessageBox.Show (ex.ToString());
          }

    Δοκίμασε το, ίσως σου κάνει δουλειά, από ότι βλέπω τα ονόματα των φορμών τα έχεις ποιο πάνω.



  •  02-03-2012, 20:19 69518 σε απάντηση της 69517

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Όχι, δυστυχώς δεν δουλεύει..
  •  02-03-2012, 21:44 69519 σε απάντηση της 69516

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Θες να κάνεις όλα αυτά χωρίς να κάνεις instantiate τις φόρμες;

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  02-03-2012, 22:02 69520 σε απάντηση της 69516

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

                foreach(var frmtype in Assembly.GetExecutingAssembly().GetTypes())
                {
                    if(frmtype.IsSubclassOf(typeof(System.Windows.Forms.Control)))
                    {
                        Console.WriteLine(frmtype.Name);
                        var members = frmtype.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                        foreach(var item in members)
                        {
                            Console.WriteLine("                " + item.Name);
                        }
                    }
                }

  •  02-03-2012, 22:13 69521 σε απάντηση της 69520

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Markos:
    Θες να κάνεις όλα αυτά χωρίς να κάνεις instantiate τις φόρμες;

    Όχι, θέλω να τα κάνω με όποιον τρόπο γίνεται. είμαι ανοιχτός σε κάθε ιδέα.


     

    nikos123:
    Μου βγάζει πρόβλημα στο "as var". 

    Δοκίμασα να το αλλάξω σε Object αλλά μου έβγαλε άλλο πρόβλημα (Option Strict On dissallows late binding)..

    δεν δουλεύει..


  •  02-03-2012, 22:17 69522 σε απάντηση της 69521

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Χωρίς var και με έλεγχο για Control μόνο.

                foreach(Type frmtype in Assembly.GetExecutingAssembly().GetTypes())
                {
                    if(frmtype.IsSubclassOf(typeof(Form)))
                    {
                        Console.WriteLine(frmtype.Name);
                        FieldInfo[] members = frmtype.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
                        foreach(FieldInfo item in members)
                        {
                            if(item.FieldType.IsSubclassOf(typeof(Control)))
                                Console.WriteLine("                " + item.Name);
                        }
                    }
                }


  •  02-03-2012, 22:32 69523 σε απάντηση της 69522

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Οκ, τώρα κάτι γίνεται.

    Το θέμα είναι ότι θέλω στο πρώτο combobox να έχει όλες τις φόρμες, και στο δεύτερο να εμφανίζονται τα control της φόρμας που διάλεξε ο χρήστης από το πρώτο combobox.

    γιαυτό θέλω να αποθηκεύω τις φόρμες σα reference σε μια μεταβλητή array.

    Έτσι ώστε μετά να μπορώ να γράψω:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Public Sub Όνομα(ByVal frm As Form)
    
            With frm
    
                        For Each MainCtrl As Control In .Controls
                            If TypeOf MainCtrl Is ............
    
                            ElseIf TypeOf MainCtrl Is ............
    
    και τα λοιπά..
     

    το οποίο δεν έχω πρόβλημα στο να γράψω.


    Άλλαξα λίγο τον κώδικά σου για να μπορέσω να τον προσαρμόσω σε αυτό που θέλω, αλλά δεν τα κατάφερα.

    Έκανα να βάζει τα ονόματα απο τις φόρμες στο πρώτο combobox αλλά χρειάζομαι να μπαίνουν οι φόρμες σαν φόρμες μέσα μια μεταβλητή array για να τις καλώ μετά με index το ComboBox.SelectedIndex


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
                For Each frmtype As Type In Assembly.GetExecutingAssembly.GetTypes
                    If frmtype.IsSubclassOf(GetType(Form)) Then
                        Count += 1
                        ReDim Preserve Forms(Count)
                        Forms(Count) = --->frmtype<---
    cbSelForms.Items.Add(frmtype.Name) Dim members() As FieldInfo = frmtype.GetFields((BindingFlags.NonPublic Or BindingFlags.Instance)) For Each item As FieldInfo In members If item.FieldType.IsSubclassOf(GetType(Control)) Then 'cbSelForms.Items.Add(item.Name) End If Next End If Next


  •  02-03-2012, 22:52 69524 σε απάντηση της 69523

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Προσθεσε τα όλα σε ενα Dictionary.
     Dictionary<string, List<string>> formAndControls = new Dictionary<string, List<string>>();
    
                foreach(Type frmtype in Assembly.GetExecutingAssembly().GetTypes())
                {
                    if(frmtype.IsSubclassOf(typeof(Form)))
                    {
                         cmbFrm.Items.Add(frmtype.Name);
                        formAndControls[frmtype.Name] = new List<string>();
                        FieldInfo[] members = frmtype.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
                        foreach(FieldInfo item in members)
                        {
                            if(item.FieldType.IsSubclassOf(typeof(Control)))
                                formAndControls[frmtype.Name].Add(item.Name);
                        }
    
                        var k = typeof(Control);
                    }
                }
    Μετά στο SelectedIndex της cmbForm

               cmbControls.Items.Clear();
               cmbControls.Items.AddRange(formAndControls[cmbFrm.Text].ToArray());

  •  02-03-2012, 23:21 69525 σε απάντηση της 69524

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Σχεδόν δουλεύει!

    το πρώτο δουλεύει τέλεια:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
                Dim formAndControls As New Dictionary(Of String, List(Of String))()
    
                For Each frmtype As Type In Assembly.GetExecutingAssembly().GetTypes()
                    If frmtype.IsSubclassOf(GetType(Form)) Then
                        cbSelForms.Items.Add(frmtype.Name)
                        formAndControls(frmtype.Name) = New List(Of String)()
                        Dim members As FieldInfo() = frmtype.GetFields(BindingFlags.NonPublic Or BindingFlags.Instance)
                        For Each item As FieldInfo In members
                            If item.FieldType.IsSubclassOf(GetType(Control)) Then
                                formAndControls(frmtype.Name).Add(item.Name)
                            End If
                        Next
    
                        Dim k = GetType(Control)
                    End If
                Next

    Απλώς στο δεύτερο έχουμε ένα πρόβλημα, δεν υπάρχει το "formAndControls"

    1
    2
    3
    4
     
        Private Sub cbSelForms_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cbSelForms.SelectedIndexChanged
            cbSelControls.Items.Clear()
            cbSelControls.Items.AddRange(--->formAndControls<---(cbSelForms.Text).ToArray())
        End Sub



  •  02-03-2012, 23:29 69526 σε απάντηση της 69525

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Το Dictionary δήλωσε το έξω από τη συνάρτηση που το γεμίζεις για να έχει εμβέλεια σε όλες Stick out tongue.
  •  02-03-2012, 23:54 69527 σε απάντηση της 69526

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    xa0ax0xa0 απίστευτο :Ρ

    Σόρρυ ε. απλώς έχει γίνει το κεφάλι μου καζάνι απο το πρωί και δεν πήρα καν γραμμή ότι αυτό ήταν το όνομα της μεταβλητής.. Νόμιζα ότι είναι της visula basic κάτι.


    Ευχαριστώ πολύ ! δουλεύει μια χαρά. Το έβαλα και σαν επιλυμένο :)


    Αν μπορείς να με βοηθήσεις και σε κάτι τελευταίο θάταν τέλεια. αν δεν έχεις χρόνο δεν πειράζει.

    Θέλω να κάνω έναν έλεγχο για το αν είναι συγκεκριμένο control type. (θέλω να μπαίνουν τα button, label, groupbox και splitseparators μόνο).

    Συνήθως ελέγχο με το "If TypeOf ΌνομαΜεταβλητής Is ΤύποςControl Then". Όμως εδώ έχεις χρησιμοποιήσει ένα δύσκολο κώδικα. Για παράδειγμα το "Dictionary" το βλέπω πρώτη φορά στη ζωή μου... (σα τύπο μεταβλητής, όχι σα λεξικό :Ρ )

    Πήγα να γράψω:

    1
     
    If item.FieldType.IsSubclassOf(GetType(Button)) Or item.FieldType.IsSubclassOf(GetType(Label)) Or .... Then

    Αλλά δεν βγάζει τίποτα μετά.

    Άρα σκέφτομαι ότι μέσα στο "If item.FieldType.IsSubclassOf(GetType(Control)) Then" , πρέπει να βάλω άλλο ένα If που να ελέγχο το καθένα που πέρασε (και άρα ήταν "control" έχει και TypeOf κουμπιού ή οτιδήποτε χρειαστώ.

    και λογικά θα πρέπει να χρησιμοποιήσω ένα DirectCast κάπου μέσα στο Dictionary... αλλά δεν μου έρχεται καμιά ολοκληρωμένη ιδεά..


  •  03-03-2012, 00:03 69528 σε απάντηση της 69527

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Διότι δεν είναι SubClass.

     if(item.FieldType == typeof(Label) || item.FieldType == typeof(Button))
    Θα μάθω vb σε λίγο .
  •  03-03-2012, 00:20 69529 σε απάντηση της 69528

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    χαχα. Το ίδιο κι εγώ (για C#) :Ρ


    Δυστυχώς όμως δεν δουλεύει αυτό στη vb


    δοκίμασα μεταξύ άλλων τα εξής:

    1
     
    If TypeOf (item.FieldType.GetType) Is Label Then
    Error 1 Expression of type 'System.Type' can never be of type 'System.Windows.Forms.Label'. 

    1
     
    If item.FieldType = TypeOf(Label) Then
    Error 1 'Label' is a type and cannot be used as an expression. 
    Error 2 'Is' expected. 

    1
     
                                If item.FieldType is TypeOf(Label) Then
    Error 1 'Label' is a type and cannot be used as an expression. 
    Error 2 'Is' expected. 

    1
     
                                If item.FieldType.IsEquivalentTo(TypeOf(Label)) Then
    Error 1 'Label' is a type and cannot be used as an expression. 
    Error 2 'Is' expected. 


    και άλλα δοκίμασα όμως δε φαίνεται να το δέχεται..


  •  03-03-2012, 01:10 69530 σε απάντηση της 69529

    Απ: Πως βλέπω όλες τις φόρμες που έχει το πρόγραμμά μου (σα φόρμες)?

    Δοκίμασε:      If item.FieldType Is GetType(Label) Then

    Ερώτηση: Έχεις controls που προσθέτεις ή αφαιρείς δυναμικά στις φόρμες; Αν ναι πρέπει να ενημερώνεις τα
    collections...

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems