Zapisywanie tekstu sformatowanego

Zapisywanie tekstu sformatowanego
cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

Witam!
Mam aplikację, która umożliwia formatowanie tekstu w kontrolce RichTextBox. Problem polega na tym, że muszę teraz ten tekst zapisać w pliku o specjalnym rozszerzeniu. Zapisać / odczytać umiem, jednak chciałbym dowiedzieć się w jaki najlepszy sposób mogę zaznaczyć w pliku tekstowym w którym miejscu tekst jest sformatowany, tak aby przy odczycie móc w prosty i szybki sposób odtworzyć sformatowany, zapisany tekst w niezmienionej postaci. Proszę o pomoc.

edytowany 1x, ostatnio: cPlusPlus
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
0

Druga część posta jest niezrozumiała, ale co do pierwszej, to RichTextBox zapisuje w formacie RTF; jeśli potrzebujesz innego, to trzeba zaimplementować konwersję.

cPlusPlus
Proszę podaj który konkretnie fragment jest niezrozumiały, mogę go opisać wyraźniej.
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:14 dni
  • Postów:2792
0

NA dyskietkach z lat 80-tych i 90-tych mam pełno plików z rozszerzeniem .doc. Nie znaczy to jednak, że są to pliki WORDa.
A bez parafraz, to nie ważne z jakim rozszerzeniem zapiszesz te pliki - ważne, byś je prawidłow otworzył.

cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

Być może wyraziłem się niezbyt jasno, więc opiszę problem jeszcze raz. Mam sobie przykładowo edytor tekstu i nazywam go sobie "a". Ustawiam sobie w nim okienko z wyborem czcionki, więc użytkownik może sobie pisać czcionką, jaką tylko zapragnie. Teraz jednak chcę zapisać sobie tekst wprowadzony przez użytkownika do pliku "plik.a".
Sprawa jest taka, że wprowadzony przez użytkownika tekst może wyglądać np. tak:
febe: ferbfebfhew, fejfnjekbfj
, a nie jestem przecież w stanie zapisać w formie czystego tekstu, ponieważ przez to utracę formatowanie. W związku z tym muszę w pliku, do którego zapiszę tekst oznakować jakoś formatowanie. Myślałem o takiej formie zapisu:
<.b.>febe</b>: <.i.>ferbfebfhew</i>, <.u.>fejfnjekbfj</u>"
(bez kropek np. przed i po b, tak jak to wygląda w HTML-u), jednak nie wiem jak łatwo przetworzyć to na postać tego typu, a później odtworzyć ją podczas odczytywania pliku, więc zwracam się do was, czy nie istnieje może jakaś prostsza metoda na dokonanie tego.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
1

Wyważasz otwarte drzwi.

Zapisz plik jako .rtf

Kopiuj
 richTextBox2.SaveFile("plik.rtf");

a będzie miał zachowane formatowanie.
Możesz go sobie pod WordPadem albo Wordem otworzyć.

edytowany 1x, ostatnio: Azarien
cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

Wiem, ale chciałbym, napisać do tego własny kod, gdyż ma to być plik kojarzony bezpośrednio z moją aplikacją, o wybranym przeze mnie rozszerzeniu.

edytowany 1x, ostatnio: cPlusPlus
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
1

No to użyj:

Kopiuj
richTextBox2.SaveFile("plik.a");

Rozszerzenie pliku naprawdę nie ma żadnego związku z jego zawartością.

cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

@somekind
Metoda działa przy zapisie, jednak gdy próbuję odczytać plik używając:

Kopiuj
 RTB.LoadFile("scierzka\\plik.rozszerzenie"); 

Otrzymuję wystąpienie:
Format pliku nie jest prawidłowy.

edytowany 2x, ostatnio: cPlusPlus
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
0

No co ja Ci mogę napisać... Coś skopałeś i dlatego nie działa. Wygląda na to, że nie odczytujesz pliku w formacie RTF.

cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

No przecież wyraźnie napisałem, że nie chcę używać formatu rtf, tylko swojego własnego

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
0

No przecież wyraźnie napisałem, że nie chcę używać formatu rtf, tylko swojego własnego

No to co ja ci poradzę. Bierzesz RTF-a (z pamięci, nie musisz zapisywać), parsujesz, konwertujesz, zapisujesz na co chcesz.
Specyfikację RTF znajdziesz tutaj.

Wspominałem coś o wyważaniu otwartych drzwi?
A o porywaniu się motyką na słońce?

Nie zagłębiałem się w wewnętrzne mechanizmy richedita (RichTextBoxa). Ale jeśli jedyne co potrzebujesz to pogrubienie, pochylenie i podkreślenie, to możliwe że łatwiej będzie napisać własną kontrolkę od zera...

edytowany 2x, ostatnio: Azarien
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
0

PS. Zauważ, że złośliwy użytkownik™ może otworzyć złożony dokument w Wordzie, z tabelkami i obrazkami, skopiować do schowka i wkleić do twojego RichTextBoksa. I rtb to łyknie.
Dlatego nie możesz nawet zakładać, że w rtb będzie tylko to co zakładasz że będzie…

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
0
cPlusPlus napisał(a):

No przecież wyraźnie napisałem, że nie chcę używać formatu rtf, tylko swojego własnego

Pisałeś też, że zależy Ci na innym rozszerzeniu pliku. Czy na pewno odróżniasz format pliku od rozszerzenia?

Bo jeśli faktycznie chcesz użyć swojego własnego formatu, to musisz po swojemu zaimplementować zapis i odczyt, więc gotowe metody klasy RichTextBox do niczego Ci się nie przydadzą. Tylko to jest wynajdowanie koła na nowo i kupa raczej niepotrzebnej roboty.

Twierdzisz też, że zapis standardowymi metodami Ci działa, a odczyt nie, co już zakrawa na cud, więc fajnie byłoby zobaczyć kod, który to powoduje.

Azarien
całkiem możliwe że „własny format” to część zadania…
cPlusPlus
Przepraszam, pisałem to szybko i popełniłem błąd, miało być rozszerzenie
cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

Proszę, oto kod:

Legenda:
filePath - ścieżka do zapisana pliku określona przez użytkownika, np. plik.aaaa (przykładowe rozszerzenie aaaa jest obranym przeze mnie rozszerzeniem domyślnym i kojarzonym z moją apką)
text - mój RTF

Kod zapisu pliku:

Kopiuj
 text.SaveFile(filePath); 

Kod odczytu pliku:

Kopiuj
 text.LoadFile(filePath); 
edytowany 2x, ostatnio: cPlusPlus
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
0

Proszę, oto kod:

Działa.

cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

Błąd w załączniku.

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:14 dni
  • Postów:2792
0
Kopiuj
text.LoadFile(filePath, RichTextBoxStreamType.RichText)

Przy zapisie również. Stałe z VB.NET, bo c# nie mam pod ręką. Działa.

somekind
To niczego nie zmienia, bo SaveFile i LoadFile domyślnie działają w formacie RTF.
Marcin.Miga
Wiem, ale gdyby z jakiegokolwiek powodu mu sie popieprzyło, to może to wymusić. Oczywiście popieprzyło mu się gdzie indziej...
cPlusPlus
  • Rejestracja:około 12 lat
  • Ostatnio:około 6 lat
  • Postów:99
0

@Marcin.Miga Ten sam błąd, to samo miejsce...

edytowany 1x, ostatnio: cPlusPlus
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
0
cPlusPlus napisał(a):

Kod zapisu pliku:

Kopiuj
 text.SaveFile(filePath); 

Kod odczytu pliku:

Kopiuj
 text.LoadFile(filePath); 

Miałeś podać kod, kawałek kodu ze swojej aplikacji, w którym coś namotałeś, skoro nie działa. KOD, nie dwie oczywiste linijeczki, które oczywiście u każdego działają.

cPlusPlus napisał(a):

Błąd w załączniku.

No i przypadkiem podałeś kod jako screenshot... Genialne!
Czemu tak bardzo nie chcesz, żeby Ci pomóc?

W każdym razie, po co wyciągasz nazwę pliku ze ścieżki do pliku z OpenFileDialog? Czemu nie używasz po prostu:

Kopiuj
text.LoadFile(d.FileName);

?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.