Obsługa plików z formatami w C#

0

Witam. Piszę prosty program do obsługi i formatowania plików tekstowych, taki bardzo uproszczony Word. Dodam, że jest to mój pierwszy program w języku C#. Poprzez formatowanie rozumiem proste operacje na fragmencie tekstu, tj. zmiana rozmiaru, koloru, pogrubienie, pochylenie itp. Program ma umieć wczytywać plik, sformatować tekst i zapisać go z formatem. Nie pytam tu o sam fakt operacji na plikach, tylko jak rozwiązać zapamiętanie formatu? Pierwszy (choć nie wiem czy dobry) pomysł był taki, że jak np. chcę pogrubić fragment tekstu, to de'facto obudowuję go znacznikami, np znanymi z html < b > ... < /b >. Tylko jak to zrobić, żeby był widoczny efekt, a nie znaczniki? Jakiego rozszerzenia pliki polecacie do rozwiązania tego problemu? Pliki *.txt oczywiście odpadają co się rozumie samo przez się, zastanawiam się tylko, czy bazować tu np. na *.rtf czy może zaimplementować jakieś własne rozszerzenie? Z góry dziękuję za wszelkie porady.

1

Myślę, że RTF Ci starczy i nie ma sensu wprowadzać nowego formatu i pisać do niego silnika. Chyba, że masz zamiar się trochę pobawić to owszem, możesz spróbować. A do RTF istnieje dużo bibliotek, które pozwolą Ci obsłużyć ten format.

0

Dzięki za szybką odpowiedź. A czy mógłbyś polecić kilka takich bibliotek? To sobie przejrzę co one potrafią i co mi się przyda :)

0

Możesz użyć RichTextBox z Windows Forms.

0

co zrobić, żeby po zaznaczeniu odpowiedniego fragmentu tekstu i naciśnięciu przycisku odpowiadającego za pogrubienie, zdarzenie zostało obsłużone? Tak jak w wordzie - możemy zaznaczyć tekst i użyć skrótu ctrl+B albo wcisnąć przycisk mając zaznaczony tekst. Mamy tu do czynienia ze zdarzeniem w zdarzeniu - zdarzeniem "zewnętrznym" jest zaznaczenie tekstu, a zdarzeniem "wewnętrznym" jest kliknięcie w przycisk. Jak to ogarnąć? I jeszcze jedno. Przeglądając klasę RichTextBox chciałam na start zrobić cokolwiek na zaznaczonym tekście. Użyłam więc metody:

 private void poleTekstowe_SelectionChanged(object sender, EventArgs e)
        {

            ((RichTextBox)sender).SelectedText.ToUpper();
        }

która wydaje mi się, że powinna zaznaczony ciąg znaków przerobić na duże litery, jednak tak się nie dzieje. Dlaczego?

0

Tak, to są 2 zdarzenia, ale myślę, że wystarczy w zdarzeniu przycisku pogrubić czcionkę, po prostu użyć właściwości i zwyczajnie pogrubić. Drugie zdarzenie SelectionChanged nie jest tu potrzebne. I Wydaje mi się, że źle robisz zmienianie na duże litery. SelectedText zwraca tylko zaznaczony tekst w formie stringu. Nic tym nie zrobisz. Musisz przypisać nowy string, który jest już zamieniony na duże litery.

0

Witam ponownie :) dzięki za podpowiedzi. Trochę nad tym siedziałam, ale to rozpracowałam, faktycznie RichTextBox to wprost idealne narzędzie do tego typu problemu. Pozdrawiam

0

Mam jeszcze jedno pytanie odnośnie tego tematu. Jak ręcznie (kodowo) ustawić, żeby czcionka była jednocześnie np pogrubiona i pochylona?
Samo pogrubienie ustawiam tak:

 private void pogrubienie_przycisk_Click(object sender, EventArgs e)
        {
            if (poleTekstowe.SelectionFont.Style == FontStyle.Bold)
                poleTekstowe.SelectionFont = new Font(poleTekstowe.SelectionFont.FontFamily,
                                                  poleTekstowe.SelectionFont.Size, FontStyle.Regular);
            else
                poleTekstowe.SelectionFont = new Font(poleTekstowe.SelectionFont.FontFamily,
                                                  poleTekstowe.SelectionFont.Size, FontStyle.Bold);
        } 

z kursywą jest analogicznie tylko ustawiam

 FontStyle.Italic

Gmatwam się natomiast jak czcionka już była pogrubiona i chcę dodać kursywę. Jak to osiągnąć?

1

FontStyle.Bold | FontStyle.Italic

Nie używam C#, ale... http://bit.ly/Y6qmPo

0

Dzięki :) ja używałam && i nie chciało przejść ;) teraz działa

2

A wiesz dlaczego nie łączy się tych wartości logicznym ANDem, tylko robi się to bitowym ORem?

Załóżmy, że identyfikator Italic to (dwójkowo) 0001, a identyfikator Bold to 0010, jak zrobisz nawet bitowego AND, to otrzymasz 0000, jak zrobisz bitowego OR, to otrzymasz 0011, zaś jak zrobisz logicznego ANDa, to otrzymasz prawdopodobnie True, bo obie liczby są różne od 0 i ich wartość logiczna to True.

0

Dzięki za pomoc i wyjaśnienie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1