Προς το περιεχόμενο

Text Editor σε c++ builder


sYn

Προτεινόμενες αναρτήσεις

Δημοσ.

Χρησιμοποιώ την Borland C++ Builder 6 για να δημιουργήσω ένα text editor (κειμενογράφο) στην φόρμα με όλα τα καλούδια (menu,toolbar,statusbar...).

Κόλλησα στο σημείο για τα bold, italic, underline. Ο κώδικας που έγραψα είναι για όλο το κείμενο, δλδ όταν πατάς το bold να γίνονται έντονοι όλοι οι χαρακτήρες του κειμένου. Προσπαθώ όταν επιλέγω κάποιο χαρακτήρα να γίνεται μόνο εκείνος έντονος.

 

>void __fastcall TForm1::Bold1Click(TObject *Sender)
{
 if (RichEdit1->Font->Style.Contains(fsBold))
   {
      RichEdit1->Font->Style=Memo1->Font->Style>>fsBold;
      Bold1->Checked=false;
      Toolbutton6->Down=false;
   }
 else
   {
      RichEdit1->Font->Style=Memo1->Font->Style<<fsBold;
      Bold1->Checked=true;
      Toolbutton6->Down=true;
   }
}

Ο παραπάνω είναι ο κώδικας που έχω για όλο το κείμενο. Ποιος είναι ο σωστός για μόνο ένα χαρακτήρα;

Δημοσ.

Για να επεξεργαστείς τα χαρακτηριστικά του επιλεγμένου κειμένου του TRichEdit component θα πρέπει να χρησιμοποιήσεις το ->SelAttributes property.

 

Ο παρακάτω κώδικας κάνει bold κείμενο που έχουμε επιλέξει:

 

>
RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold;

 

Για να εντοπίζεις τις ιδιότητες του επιλεγμένου κειμένου, δες το SelectionChange event του TRichEdit.

 

Ο παρακάτω κώδικας (δηλωμένος στο SelectionChange event) αλλάζει τον τίτλο του παραθύρου σε "BOLD STYLE DETECTED" εάν το επιλεγμένο κείμενο μας περιέχει Bold χαρακτήρες, διαφορετικά "N/A":

 

>
void __fastcall TForm1::RichEdit1SelectionChange(TObject *Sender)
{
  if(RichEdit1->SelAttributes->Style.Contains(fsBold))
   Caption = "BOLD";
  else
   Caption = "N/A";
}

 

Βελτιώνοντας τέλος τον παραπάνω κώδικα, με την βοήθεια του SelAttributes->ConsistentAttributes μπορείς να ξεχωρίζεις εάν κάθε TFont->Style εφαρμόζεται (πχ. test) ή δεν εφαρμόζεται (πχ. test) συνεχόμενο σε ολόκληρο το περιεχόμενο του SelAttributes οπότε επιστρέφει true, διαφορετικά αν το TFont->Style εφαρμόζεται διακεκομμένα με κάποιο άλλο (πχ. test) τότε το SelAttributes->ConsistentAttributes επιστρέφει false.

 

>
  if(RichEdit1->SelAttributes->ConsistentAttributes.Contains(fsBold))
   {
     if(RichEdit1->SelAttributes->Style.Contains(fsBold))
      Caption = "BOLD STYLE DETECTED";
     else
      Caption = "NO BOLD";
   }
  else
   Caption = "BOLD STYLE AND ?";

 

Καλή συνέχεια.

Δημοσ.

Ευχαριστώ πολύ φίλε μου αλλά τελικά βάζοντας από το action list σαν standard action το Bold δε χρειάστηκε να γράψω κώδικα γιατί λύνει την απορία μου. Πάντως θα το έχω υπόψην μου.

Και μια που σε βρήκα :D ήθελα να σε ρωτήσω το εξής: Όταν το αποθηκεύω το κείμενο(π.χ. insomnia) σαν txt και μετά το ανοίξω με το notepad τότε μου βγάζει:

>{\rtf1\ansi\ansicpg1253\deff0\deflang1032{\fonttbl{\f0\fswiss\fcharset0 Tahoma;}{\f1\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\lang1033\f0\fs16 insomnia\lang1032\f1 
\par }

ενώ στο Microsoft Word βγάζει κανονικά insomnia. Μήπως ξέρεις το λόγο και αν ναι πως να το διορθώσω; Σε ευχαριστώ πολύ.

P.S. Το έχω ολοκληρώσει και το μόνο πρόβλημα που εντόπισα είναι το παραπάνω.

Δημοσ.

Τα standard action είναι καλά αλλά ακόμα καλύτερα είναι να γνωρίζεις το πως κάνουν τα "μαγικά" τους :) μάλιστα η γνώση της SelAttributes μπορεί να σε ξελασπώσει σε αρκετά θεματάκια ;)

 

Για να σώσεις ή να διαβάσεις ένα αρχείο σε μορφή text αντί RTF θέσε πριν το SaveToFile / LoadFromFile το TRichEdit property PlainText σε true, διαφορετικά false.

 

πχ. Για αποθήκευση ως text.

 

>
RichEdit1->PlainText = true;
RichEdit1->Lines->SaveToFile("C:\\TEST.TXT");

Δημοσ.

Σε ευχαριστώ πάρα πολύ. Ξέρω πως όσες περισσότερες εντολές γνωρίζεις τόσο το καλύτερο αλλά είχα περιορισμένο χρόνο να το ολοκληρώσω. Μέσα σε δύο μέρες έπρεπε να δημιουργήσω ένα text editor με toolbar, statusbar και επιλογές File,Edit,Search,Format,Help γι' αυτό και διάλεξα όσο το λιγότερο κώδικα.Βασικά ο μόνος σοβαρός κώδικας είναι για τα dialog(Open,Save,Font,Print,Color,Find,Replace) που έχω βάλει.Και έχω να πιάσω την C πάνω από 2 χρόνια.

Δημοσ.

Μην ανησυχείς, καλά έκανες καθώς αυτή είναι η πεμπτουσία των εργαλείων γρήγορης ανάπτυξης (RAD) και ευτυχώς ο C/C++ Builder αλλά και η νεώτερη έκδοση του, η CodeGear Turbo C++ (και BDS 2006) τα καταφέρνουν αρκετά καλά.

 

Καλή συνέχεια ;)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...