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

 

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

Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

Îåêßíçóå áðü ôï ìÝëïò pantelee. Τελευταία δημοσίευση από το μέλος KelMan στις 10-02-2006, 08:27. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-01-2006, 02:45 8999

    Hmm [^o)] Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Χρησιμοποιώ ένα textbox το οποίο αφορά μία διαδρομή (π.χ http://www.dotnetzone.gr/cs/forums/AddPost.aspx?ForumID=25). Επειδή τέτοιες διαδρομές είναι πολλές φορές μεγάλες, για να αποφύγω ένα ιδιαίτερα μακρόστενο textbox δίνω την εντολή...

    Private Sub Text1_Change()
    Text1.ToolTipText = Text1.Text
    End Sub

    ...ώστε να μπορεί κάποιος να βλέπει τη διαδρομή μέσα από το ToolTipText παρά να κάνει scroll.Το ερώτημά μου είναι:
    Θα μπορούσα να ξέρω πότε πράγματι χρειάζεται κάτι τέτοιο; Υπάρχει κάποια boolean ιδιότητα του ελεγκτηρίου TextBox (ή μία εντολή, οτιδήποτε) που να μου δείχνει αν το κείμενο είναι μεγαλύτερο από τις διαστάσεις του TextBox; Για να μπορώ να κάνω κάτι σαν το παρακάτω.

    Private Sub Text1_Change()
    If Text1.TextIsLong Then
      Text1.ToolTipText = Text1.Text
    Else
      Text1.ToolTipText = ""
    End If
    End Sub

    Ευχαριστώ

  •  28-01-2006, 19:36 9004 σε απάντηση της 8999

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    H παρακάτω συνάστηση, επιστρέφει το μήκος ενός string σε pixels.



        Public Function GetStringPixelLength(ByVal strText As String, ByVal fnt As Font) As Integer
            Dim intStrLen As Integer
            Dim g As Graphics = CreateGraphics()

            intStrLen = g.MeasureString(strText, fnt).ToSize.Width()
            g.Dispose()

            Return intStrLen
        End Function

    Μπορείς να την καλέσεις από ένα TextChanged event όπως λες

       Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
            If TextBox1.Width < GetStringPixelLength(TextBox1.Text, TextBox1.Font) Then
                TextBox1.ToolTipText = TextBox1.Text
            Else
                TextBox1.ToolTipText = ""
            End If
        End Sub

    Αν θες να μπορείς να πεις κάτι σαν If Text1.TextIsLong... , τότε θα πρέπει να φτιάξεις ένα δικό σου TextBox που να έχει ένα extra Property ή Method που θα έχει τον ίδιο κώδικα με τo παραπάνω function. Η διαφορά είναι ότι δεν θα χρειάζεται να έχει παραμέτρους αφού τις τιμές θα τις παίρνει το ίδιο το control από τον εαυτό του. Μπορείς να δεις το άρθρο μου στο http://www.dotnetzone.gr/cs/blogs/mkelaiditis/articles/8929.aspx για περισσότερες πληροφορίες.


    Vir prudens non contra ventum mingit
  •  06-02-2006, 00:39 9279 σε απάντηση της 8999

    Confused [*-)] Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    KelMan καταρχήν να σ' ευχαριστήσω. Από το όνομα της συνάρτησης καταλαβαίνω πως είναι αυτό που ψάχνω. Οι γραμμές εντολών μου είναι κατανοητές στο τί κάνουν παρ' ότι μου ήταν άγνωστες πριν την απάντησή σου. Επίσης και ο τρόπος που χρησιμοποιείς τη συνάρτηση μέσα στο event Text1_Change() μου είναι κατανοητός (παρεπιπτόντως τί είναι όλο αυτό το TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged; Μία - μία οι ερωτήσεις, ε;)

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

    Συγκεκριμένα μου βγάζει τα εξής:
    Dim g As Graphics = CreateGraphics() -> Expected: End Of Statement (στο ίσον)
    g.Dispose() -> Expected: =
    Return intStrLen -> Expected: End of Statement (και χρωματισμένο το intStrLen)

    Και:
    Στο άρθρο που με παρέπεμψες βλέπω πως χρησιμοποιείς τις γραμμές αυτές, και τονίζεις: Μην ξεχάσετε να κάνετε Import το Namespace System.Drawing.Drawing2D.

    Να κάνω Import το Namespace System.Drawing.Drawing2D δεν μπορώ, δεν ξέρω τι είναι και πώς γίνεται. Και μην έχοντας να αποδώσω σε κάτι άλλο τα σφάλματα που μου βγάζει στα προαναφερθέντα, εικάζω πως τα δύο αυτά έχουν κάποια σχέση.

    Τελικά αυτά τα δύο έχουν κάποια σχέση (οπότε πες μου σε παρακαλώ πώς γίνεται αυτό το Import)
    ή
    καμμία σχέση; (οπότε πες μου σε παράκαλώ πώς γίνεται το Import αλλά και τι φταίει και μου βγάζει σφάλματα στις γραμμές αυτές)

    Ευχαριστώ και πάλι.
  •  06-02-2006, 01:20 9280 σε απάντηση της 9279

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Λοιπόν, για το import του Namespace δεν χρειάζεται να κάνεις τίποτα παραπάνω πέρα από το να γράψεις στον κώδικά σου, πάνω-πάνω, έξω από το "Public Class ..." το:

    Imports System.Drawing.Drawing2D

    Μπορεί να έχει και άλλα τέτοια imports statements εκεί. Δοκίμασε να το βάλεις, και λογικά δεν θα έχεις λάθη πλέον.

    Το TextChanged είναι event που ενεργοποιείται οποτεδήποτε αλλάζει το κείμενο του textbox (πχ όταν γράφουμε ένα νέο γράμμα). Σε αυτό το event συνδέουμε μία ρουτίνα που την ονομάζουμε Textbox1_TextChanged. H σύνδεση γίνεται μέσω του keyword "Ηandles", δηλαδή:

    Private Sub Textbox1_TextChanged (...) Handles Textbox1.TextChanged

    Με αυτόν τον τρόπο δεν χρειάζεται να καλούμε εμείς τη ρουτίνα, καλείται αυτόματα όταν αλλάζει το κείμενο. Τώρα, όλο αυτό το πράγμα μέσα στις παρενθέσεις είναι οι παράμετροι του event. H ρουτίνα που αντιστοιχεί στο event πρέπει να δέχεται συγκεκριμένες παραμέτρους ώστε το event όταν την καλεί να μπορεί να περάσει extra πληροφορίες. Δεν χρειάζεται να κάνουμε τίποτα το ιδιαίτερο γιατί αυτά μπαίνουν αυτόματα όταν φτιάχουμε το event. Πχ κάνε διπλό-κλικ πάνω στο text box και θα σου ετοιμάσει όλον αυτόν τον κώδικα.

     


    Vir prudens non contra ventum mingit
  •  06-02-2006, 21:23 9328 σε απάντηση της 9280

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Ahem!

    KelMan - είμαστε στο forum της VB6! Wink [;)]

    Patrick
  •  06-02-2006, 23:09 9331 σε απάντηση της 9328

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Μμμμ, ναι! Να σώσουμε την κατάσταση...

    Δεν είναι ακριβώς το ζητούμενο, αλλά δείχνει τον τρόπο αντιμετώπισης παρόμοιου προβλήματος με το την λίστα του combobox - πολλές φορές δεν είναι όσο πλατιά χρειάζεται και πρέπει να την μεγαλώσουμε.

    Σε αυτό το άρθρο "GetTextExtentPoint32: Change Combo List Width Based on Contents", έχει την λύση του δεύτερου προβλήματος.

    Παρόμοια, χρησιμοποιώντας τις ίδιες συναρτήσεις του WinAPI μπορείς να βρεις το πλάτος του κειμένου μέσα στο textbox. Μετά από σύγκριση με το πλάτος του textbox μπορείς να αποφασίσεις αν χρειάζεται να χρησιμοποιήσεις το tooltip ή όχι...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-02-2006, 01:01 9332 σε απάντηση της 9328

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Ωωωωωω! Χίλια συγνώμη για την ταλαιπωρία pantelee! Κεκτημένη ταχύτητα γαρ!

    Πω-πω-πω τύφλα!!!


    Vir prudens non contra ventum mingit
  •  10-02-2006, 01:12 9491 σε απάντηση της 8999

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Είχα μπει με σκοπό να εκφράσω κάποιες απορίες, αλλά μου τις λύσατε όλες. Τελικά όλα καλά. Χρησιμοποίησα τη συνάρτηση GetTextExtentPoint32. Πάντως, θα με βόλευε να είχε δίκιο ο Kelman με τη συνάρτησή του GetStringPixelLength διότι σε αυτή ήταν παράμετρος και η γραμματοσειρά, ενώ η GetTextExtentPoint32 ζητάει hDC όπου (αν κατάλαβα καλά) δίνεις το hDC της φόρμας και έτσι η μέτρηση του κειμένου σε pixels γίνεται με βάση τη γραμματοσειρά της φόρμας.

    Επάνω εδώ έχω μία ερώτηση:
    Άν το TextBox έχει άλλη γραμματοσειρά από αυτή της φόρμας τι πρέπει να κάνεις; Άν αλλάξεις τη γραμματοσειρά της φόρμας, όπως παρακάτω, υπάρχει περίπτωση να επηρρεάσει κάποιο άλλο ελεγκτήριο;
    Font.Name = Text1.Font.Name
    Font.Size = Text1.Font.Size
    Font.Bold = Text1.Font.Bold
    Font.Italic = Text1.Font.Italic
    Font.Underline = Text1.Font.Underline
    Call GetTextExtentPoint32(hdc, Text1.Text, Len(Text1.Text), sz)
    txtWidth.Text = sz.cx
    txtHeight.Text = sz.cy

    Τον παραπάνω κώδικα σκέφτηκα αρχικά (μετράει τις διαστάσεις του κειμένου που βρίσκεται στο ελεγκτήριο Text1 και επιστρέφει τις τιμες στα ελεγκτήρια txtWidth και txtHeigth)
    Στη συνέχεια, για να ξεπεράσω το πρόβλημα της γραμματοσειράς (που να ξαναπώ: θα υπήρχε πρόβλημα στον προηγούμενο κώδικα;) έφτιαξα ένα ελεγκτήριο ActiveX, έβαλα μέσα ένα ελεγκτήριο TextBox, αντιστοίχισα τις ιδιότητες του UserControl που αφορούν τη γραμματοσειρά με αυτές του TextBox, και έτσι καθορίζω τη γραμματοσειρά του ελεγκτηρίου και όχι της όλης φόρμας.

    Τι λέτε; Μήπως υπάρχει πιο εύκολος τρόπος;

    Σας ευχαριστώ πολύ όλους για το ενδιαφέρον σας.
  •  10-02-2006, 08:27 9494 σε απάντηση της 9491

    Απ: Πώς μπορώ να ξέρω αν το TextBox έχει γεμίσει;

    Αν και δεν έχω VB6 πρόχειρη, υποθέτω ότι το μόνο πρόβλημα που θα σου παρουσιαστεί αν αλλάξεις το default font της φόρμας είναι, αν προσθέσεις δυναμικά κάποια controls αυτά να εμφανιστούν έχοντας το νέο font.

    Πάντως, εναλλακτικά, μέσω του Win32 API και της function CreateFontIndirect, μπορείς να ορίσεις ένα "logical" font το οποίο θα χρησιμοποιήσεις για τις μετρήσεις σου. Μπορείς να δεις περισσότερες πληροφορίες σε αυτό http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8f6t.asp καθώς και σε αυτό http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8f6t.asp το link.

    Τα παραδείγματα είναι σε C++ αλλά είναι απλός ο κώδικας και θα καταλάβεις τι γίνεται. Επίσης, μεγάλη βοήθεια για το Win32 API και πως μπορείς να καλέσεις τις functions μέσα από τη VB6 μπορείς να βρεις στο http://www.mentalis.org/agnet/apiguide.shtml.

     


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems