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

 

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

Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος Alex_ στις 14-10-2006, 12:23. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-09-2006, 09:41 16890

    Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Έχοντας βρεί τις δεσμευμένες λέξεις από ένα άλλο project είπα να φτοιάξω έναν λεκτικό αναλυτή για SQL και να χρωματίζω τι λέξεις και τους τελεστές.
    Έχω κάνει κάτι που δουλεύει μεν σωστά αλλά είναι τραγικά αργόSad
    Δεν γνωρίζω καλά το RichTextBox Και σκέφτηκα ότι κάτι μου διαφεύγει οπότε σας παραθέτω τι κάνω.

    Κάθε φορά που αλλάζει κάτι στον editor(OnTextChanged) , διατρέχω όλο το κείμενο ψάχνοντας για αναγνωρίσιμες λεκτικές μονάδες τις οποίες και αποθηκεύω σε ένα SortedList(aka Lex (key,value)-->(StartingIndex λεκτικής μονάδας, EndinxIndex λεκτικής μονάδας) . Μόλις τελειώσω,διατρέχω την λίστα και για κάθε λεκτική μονάδα αποφασίζω το χρώμα της. Οι αλλαγές γίνονται σε ένα dummy RichTextBox και μόλις τελειώσουν το περιεχόμενό του αντιγράφεται αυτούσιο στο κανονικό μου RichTextBox. Αυτό το κάνω γιατί παρατηρείται Flickering κατά την αλλαγή χρωμάτων.

    Από ότι παρατήρησα αυτό που αργεί είναι η απαρίθμηση των λεκτικών μονάδων και ο χρωματισμός τους που γίνεται σε αυτή τη συνάρτηση.
    private void PaintLexWords()
            {
                dummyEditor.Select(0, dummyEditor.Text.Length);
                dummyEditor.SelectionColor = Color.Black;
                dummyEditor.Select(cursorPos, 0);
               
                foreach (int index in Lex.Keys)
                {
                    string token = dummyEditor.Text.Substring(index, Convert.ToInt32(Lex[index]) - index);
                   
                    dummyEditor.Select(index, Convert.ToInt32(Lex[index]) - index);
                    dummyEditor.SelectionColor = GetTokenColor(token);
                    dummyEditor.Select(cursorPos, 0);
                    dummyEditor.SelectionColor = _defaultColor;
                }
            }

    Έχετε καμοιά ιδέα Huh?

    Βασικά αυτά τα καταραμένα τα strings (με μονά και διπλά "αυτάκια") είναι που δημιουργούν προβλήματα και με αναγκάζουν να διατρέχω όλο τον editor Κάθε φορά.
  •  19-09-2006, 10:07 16891 σε απάντηση της 16890

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Μερικές γενικές ιδέες για να βελτιστοποιήσεις την ταχύτητα:

    Δεν φαίνεται από τον κώδικα που παραθέτεις αλλά καλό είναι αν δεν το κάνεις να χρησιμοποιείς Regular Expressions για να βρίσκεις τα keywords καθώς είναι πολύ ταχύτερα από τις μεθόδους της String class. Επίσης, για intensive string manipulation καλύτερα είναι να χρησιμοποιήσεις τον StringBuilder. Τέλος, σχετικά με το flickering μπορείς να κάνεις suspend το refresh της φόρμας μέχρι να τελειώσεις και έτσι να αποφύγεις να χρησιμοποιείς διπλό control. Αυτό μπορεί να γίνει με τις SuspendLayout και ResumeLayout μεθόδους της φόρμας. Δηλαδή: γεμίζεις το SortedList με τα keywords που τα έχεις βρει με regex -> περνάς τα περιεχόμενα του RichTextBox στον StringBuilder -> κάνεις freeze την φόρμα με suspend layout -> αλλάζεις τα περιεχόμενα του string builder -> περνάς τον stringbuilder στο RichTextBox -> κάνεις unfreeze την φόρμα.

    Τώρα, ως προς την λογική της ρουτίνας, νομίζω ότι όλα αυτά θα πρέπει να τα κάνεις όχι στο OnTextChanged (δηλαδή με κάθε key press) αλλά όταν ο χρήστης πατάει πλήκτρα που εμφανίζουν χαρακτήρες όπως space, τελεία, ερωτηματικό κλπ, που σημαίνει ότι κατά πάσα πιθανότητα ο χρήστης έχει τελειώσει να πληκτρολογεί το reserved word. Φαντάσου ότι αν ο χρήστης πληκτρολογίσει <space>-S-E-L-E-C-T-I-O-N-<space> θα έχεις τρέξει την ρουτίνα 11 φορές τσάμπα και κατά τα μισά θα έχεις κάνει μπλέ το "SELECT" για να το ξανακάνεις μαύρο όταν θα πατήσει το "I". Επίσης, μπορείς να βρεις έναν τρόπο να την κάνεις πιο έξυπνη ελέγχοντας που έχουν γίνει οι τελευταίες αλλαγές ώστε να μην κάνεις το scan κάθε φορά από την αρχή ώστε να κρατήσεις την υπάρχουσα μορφοποίηση.


    Vir prudens non contra ventum mingit
  •  19-09-2006, 11:49 16905 σε απάντηση της 16890

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Μπορείς να ρίξεις μια ματιά στον Dynamica Editor.

    Νατάσα Μανουσοπούλου
  •  20-09-2006, 12:40 16971 σε απάντηση της 16890

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    mns:

    Ενδοιαφέρουσα δουλειά αλλά θα ήθελα περισσότερο να δώ "πώς" το κάνει.

    KelMan: Υπάρχει ένα πρόβλημα.Το formatting.Πώς θα πώ μέσω του StringBuilder "εσύ select, γίνε μπλέ. Εσύ AND ,γίνε γκρυ"?

    Στο richtextbox μπορώ να κάνω αλλαγές στο Text mode και αυτές να εναρμονίζονται με το formatting στο RTF mod. Ξέρω λοιπόν ότι αν κάνω αλλαγή στο χρώμα στον χαρακτήρα 25 ο χαρακτήρας θα παραμείνει στο 25.

    Το suspend layout πάντος την ώρα που έκανα αλλαγές δεν φάνεικε να δουλεύει. Εξακολουθώ να έχω flickering.

    Επιπλέον θέλω να προσωμοιώσω την λειτουργία του Editor που έχει ο SQL Managment Studio 2005 όπου οι δεσμευμένες λέξεις χρωματίζονται άμεσα άσχετα αν μετά δεν ακολουθεί κενό.

    Τώρα, για έναν πιο έξυπνο τρόπο.....το ψάχνω..
  •  20-09-2006, 13:49 16973 σε απάντηση της 16971

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Θα πρέπει να παίξεις με RTF formating. Δεν είναι δύσκολο, αρκεί να δεις πως αλλάζει το περιεχόμενο όταν κάνεις apply ένα χρώμα.

    Ως προς το flickering, δοκίμασε να κάνεις override την OnPaintBackground της φόρμας και να ελέγχεις μέσω μιας boolean αν θα περάσει η κλήση στην base. Αν δεν παίξει κι αυτό, ρίξε μια ματιά σε αυτή τη λύση: http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,6336502b-57c5-430d-9d37-7f9be484f6b3.aspx. Δεν θα την χαρακτήριζα "κομψή" αλλά αν είναι να βελτιωθεί το performance, χαλάλι. Smile


    Vir prudens non contra ventum mingit
  •  20-09-2006, 20:11 16989 σε απάντηση της 16973

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Θα μπορούσες να δεις μια μηχανή highlight που παράγει html κώδικα και να την αλλάξεις ώστε να παράγει rtf. Πχ η μηχανή που έχω προσθέσει στην rich html editor του dotNETZone.gr είναι το Thomas Johansen Highlight v2.2. Μπορείς να πάρεις το source code του και να δεις τι μπορείς να κάνεις...

     

    George J.


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

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    http://downloads.delphi32.com/2619/5220/richSyntax.zip

    Ο Serhiy Perevoznyk έχει φτιάξει ένα καταπληκτικό highlighter.

    Κατέβασέ τον από το παραπάνω link. Είναι source κώδικας.

    Είναι σε pascal για Delphi. όμως μπορείς να δείς πολύ εύκολα την λογική του και να γράψεις έναν αντίστοιχο.
  •  13-10-2006, 16:45 18572 σε απάντηση της 16890

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Δες και αυτό το Άρθρο :

    http://www.codeproject.com/cs/miscctrl/richtextboxextended.asp
    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  14-10-2006, 12:23 18594 σε απάντηση της 18572

    Απ: Φτοιάχνοντας έναν λεκτικό αναλυτή για SQL με Richtextbox

    Μια ιδέα είναι μπορεί να είναι και χαζή

    αν μπορούσες δυναμικά να κάνεις αναζήτηση με κάθε εισαγωγή χαρακτήρα

    στη δομή με τις λέξεις κλειδιά (καλά αυτό θα το ξέρεις σίγουρα ,για τη δομή χρησιμοποίησε μια γρήγορη αναζήτηση δυαδική η ότι καλύτερο βρεις)

    Για να σου δώσω να καταλάβεις πως χρησιμοποιουνε κατι μηχανές αναζήτησης

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

    (τα index τα έχεις ήδη κρατημένα οπότε να τα περνάς σε μια συνάρτηση

    όρισμα indexes[]).

    Μάλλον θα σε μπέρδεψα περισσότερο

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