CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB C++] edytor WYSIWYG

[BCB C++] edytor WYSIWYG

dział ogólny

[BCB C++] edytor WYSIWYG

Nowy postprzez shepard » czwartek, 4 października 2012, 13:12

Witam;
Jako początkujący mam kolejny problem, który może okazać się albo banalny i tuzinkowy albo nierozwiązywalny. Oby te pierwsze. Ale tak na serio. Nie wiedziałem jak nazwać ten temat, więc nazwałem go edytor WYSIWYG, bo to co chcę osiągnąć może coś takiego przypominać, do rzeczy:

- Mam dwa pola tekstowe (np memo i rich edit), chodzi o to, że w jednym piszę jakiś tekst, a w drugim pojawia się, ten sam tekst tylko z tagami html, np. w rich edit pogrubiam wizualnie kawałek tekstu a w memo jest ten sam tekst tylko z tagami. Wiem temat wielokrotnie wałkowany. Mi udało się zrobić tak, że wprowadza mi tagi tylko raz, tzn. wiem czemu tak, bo za każdym razem wkleja cały tekst z rich edit - o to mój kod:

Kod: Zaznacz cały
  String pamiec;
      int a;
    pamiec = Memo1->Text; // zapisuje się w pamięci tekst z memo1
    Memo1->SelLength != 0;  // gdy zaznaczony tekst

        a = Memo1->SelStart; // a przyjmuje pozycje początku zaznaczenia (czyli gdzie ma znajdować sie kursor)
       Memo2->Text = pamiec; // wrzuca tekst z pamięci do Memo2
       Memo2->SelStart += a; // przesuwa kursor o wartość z Memo1
       Memo2->SelLength = Memo1->SelLength;
      Memo2->SelText = AnsiString("<b>") + Memo2->SelText + "</b>" ;



A chciałbym, żeby pamiętał, że w danym miejscu jest już tag, jeśli miałby dodawać tag w innym miejscu, a także nie usuwał tagu <b> jakbym dodał np. <i> (czyli drugi przycisk)

Memo1 - jest to kontrolka rich edit, tylko nazwałem ją Memo1.

Jeszcze mam drugie pytanie z innej beczki, czy da się w ComboBox o ustawieniach style csOwnerDrawVariable, wyświetlać TEXT (ComboBox->Text = "cośtam"), bo opcja text znika jak wybierze się ten styl. Może są jakieś metody albo coś mam zbugowanego.

Pozdrawiam
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Mironas » czwartek, 4 października 2012, 14:58

Sugerował bym raczej przeformatowanie kodu RTF z RichEdit na HTML.
Kod RTF podejrzysz tak:
KOD cpp:     UKRYJ  
  TStream* strm = new TMemoryStream();
  RichEdit1->Lines->SaveToStream(strm);
  strm->Position = 0;
  Memo1->Lines->LoadFromStream(strm);
  delete strm;
 

Może jest prostszy sposób, ale ja go nie znam :(
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » czwartek, 4 października 2012, 15:12

Hmm nie wiem, czy akurat dobrze rozumiem, ale wolałbym pominąć pisania parsowania (chyba, że coś prostego*), gdyż ze mną to kompletna amatorszczyzna :D.

* -> co do parsowania, jeśli już to dużo z tym zachodu bo o ile pogrubienia, podkreślenia byłyby sprawą prostą, tak kolor, czcionka, nazwa czcionki były by kłopotliwe, wiem na razie, że dla rtf \b, \b0, to dla hrml <b> </b>, gorzej z kolorami i w ogóle zadanie wymagające dobrej znajomości, myślę, że trudnoby mi było stworzyć klasę, dlatego wymyśliłem sobie by kod był przerabiany w czasie rzeczywistym i odrazu bez wnikania w strukturę formatowania stosowaną w rtf, bo przecież mogę zainicjować pod przyciskiem bold by mi dodawał do tego samego tekstu tagi. Problem by nie usuwał wcześniejszych tagów. Hmm
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » czwartek, 4 października 2012, 15:27

Mironas napisał(a):Sugerował bym raczej przeformatowanie kodu RTF z RichEdit na HTML.


Hmm tylko jak... :mrgreen:
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Mironas » czwartek, 4 października 2012, 15:29

Wg mnie to ślepa uliczka. Ale może się mylę.
Parsowanie wcale nie musi być takie trudne, spróbuj.
Zacznij od prostych rzeczy typu: \b -> <b>
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » czwartek, 4 października 2012, 15:50

Mironas napisał(a):Wg mnie to ślepa uliczka.

Zauważyłem właśnie ;)
Z <b>, <i>, <u>, w Twojej logice nie będzie problemu - sam tak pomyslałem nad takim zastosowaniem, aby zamienił np. \b w <b>, problem natomiast pojawia się przy kolorach i fontach, bowiem, z tego co zdążyłem się zorientować rtf kolory podaje razem
Kod: Zaznacz cały
{\colortbl ;\red0\green0\blue160;\red64\green128\blue128;}
a html przy tekście
Kod: Zaznacz cały
<font color="red">cośtam</font>
i zapis koloru rtf używa RGB ale zapis jest bynamniej problematyczny: \red0\green0\blue160; a nie RGB(0,0,160). Jedyny plus, że zdaje się ale HTML formatuje w RGB, tylko nikt tego nie używa, można natomiast przejść do kolorów HTML z pozycji colordialog:

KOD cpp:     UKRYJ  
 RichEdit1->SelAttributes->Color = ColorDialog1->Color;
 TColor Color = ColorDialog1->Color ;
       int RGB = ColorToRGB(Color) ;
       TVarRec ColorArgs[3] = {GetRValue(RGB), GetGValue(RGB), GetBValue(RGB)};
       Memo2->Text = Format("#%.2x%.2x%.2x", ColorArgs, 3);


Uszczypnąć to można ale jak rozwinąć i sfinalizować to za grosz nie wiem :roll: . Szacunek dla programistów :!:
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Mironas » czwartek, 4 października 2012, 16:03

I właśnie dlatego:
1. jest tak mało edytorów WYSIWYG
2. istniejące edytory WYSIWYG tak strasznie zaśmiecają kod HTML
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » czwartek, 4 października 2012, 16:18

Dlatego też, próbował jakoś oszukać z drugim komponentem textowym, który byłby ukryty, a w nim byłoby formatowanie tekstu w html ale odbywałoby to się w czasie rzeczywistym, czyli w samym momencie formatowania pola rich do memo dawałby tagi, bo parsowanie budzi wiele pytań i wątpliwości, tzn myślałem, że ów tamta metoda jest prostsza ale chyba się myliłem...
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Mironas » czwartek, 4 października 2012, 16:45

shepard napisał(a):[...]drugim komponentem textowym, który byłby ukryty


Zamiast umieszczać ukryte TMemo lepiej utworzyć obiekt klasy TStrings:

KOD cpp:     UKRYJ  
TStrings* lista = new TStringList();
[...]
delete lista;


lub jako obiekt prywatny lub publiczny:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
  TStrings* lista;


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  lista = new TStringList();
]
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  delete lista;
}
Taki obiekt działa tak samo jak Memo1->Lines.

Dodane przez Cyfrowy Baron: Metoda Lines obiektu TMemo jest typu TStrings, dlatego zamiast Memo można użyć klasy TStringList, która dziedziczy po TStrings.
Ostatnio edytowano piątek, 5 października 2012, 09:43 przez Cyfrowy Baron, łącznie edytowano 4 razy
Powód: Poprawiłem opis i uporządkowałem kod. Odpowiadając na pytanie osoby początkującej należy pisać przejrzyście i unikać ogólników i skrótów myślowych.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Cyfrowy Baron » piątek, 5 października 2012, 08:44

shepard napisał(a):Jeszcze mam drugie pytanie z innej beczki, czy da się w ComboBox o ustawieniach style csOwnerDrawVariable, wyświetlać TEXT (ComboBox->Text = "cośtam"), bo opcja text znika jak wybierze się ten styl


Kontrolka TComboBox w tym trybie tak ma właśnie działać. W tym trybie można tylko wybierać elementy z listy, czyli wyświetlać tylko tekst znajdujący się na liście. Jeżeli tekst, który chcesz wyświetlić znajduje się na liście to możesz to zrobić tak:

KOD cpp:     UKRYJ  
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("jakiś tekst");



W kwestii parsowania tekstu. Sam tego kiedyś próbowałem, ale tagów jest tak dużo i parsowanie z każdym nowym tagiem stawało się coraz bardziej skomplikowane, i coraz mniej wydajne. Bez parsowania się nie da.

Istnieje biblioteka DLL przeprowadzająca konwersję plików zapisanych z formatowaniem RFT na kod HTML. Podłączenie biblioteki i korzystanie z funkcji jest bardzo proste, ale nie mam mowy o konwersji w czasie rzeczywistym... chociaż, może dałoby się to tak zrobić, gdyż funkcja tak naprawdę konwertuje łańcuch znaków ze zmiennej string (nie mylić ze String). To jednak może być za trudne dla osoby początkującej, za jaką się podajesz, ale to najprostsza metoda i łatwiej już nie będzie. Biblioteka wraz z przykładami w C++, w załączniku.

Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
shepard
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » piątek, 5 października 2012, 13:37

Tzn programowałem trochę kiedyś w Visual Basic, to były takie początki, więc pewne nawyki, konwertuje sobie na c++. Oczywiście C++ a tym bardziej środowisko Borland jest dla mnie nowością. Na konsoli programowałem niedługo w devC++ i to wszystko, dlatego uważam się za początkującego. Dzięki wielkie Cyfrowy Baron kolejny raz ratujesz mój projekt :).
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » piątek, 5 października 2012, 23:47

Kurcze nie mogę rozgryźć tej biblioteki. Nie umiem wykorzystać jej prawidłowo w Borland.
Pomyślałem, że pójdę na piechotę do Rzymu przez Krym i zobaczę jak działa biblioteka. By sprawdzić jej działanie uruchomiłem Dev C++, skopiowałem kod źródłowy z katalogu c++, skopiowałem 'rtftohtml_sautinsoft.dll' do katalogu z projektem, dodałem do projektu, kompiluje i wywala mi błąd w linii:

KOD cpp:     UKRYJ  
  strRtf = GetString("D:\\test.rtf");



Leżę razem z tą biblioteką i płaczę :cry: .

P.S
Na partycji "D:\" zapisałem plik test.rtf a błąd jaki mi wywala:

53 35 C:\Users\Łukasz\Desktop\Nowy folder (8)\main.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Pomysły z tą biblioteką miałem dwa: Pierwszy to z obiektu tekstowego, w którym byłby tekst rtf miał zamieniać na html lub za pomocą dwóch plików. Tak jak pokazane jest w pomocy do biblioteki, jednak tam interpretacja kodu przedstawiona jest na Visual Basic, tu znowu problem z przeniesieniem :roll:

Przepraszam ale ogłupiałem :P

P.S2
Dzięki za kod do TComboBox'a działa!!!! :) o to mi chodziło!

Pozdrawiam
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez Cyfrowy Baron » sobota, 6 października 2012, 00:04

shepard napisał(a):a błąd jaki mi wywala:

53 35 C:\Users\Łukasz\Desktop\Nowy folder (8)\main.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]


Zwracam uwagę na słowo Warning, to nie błąd lecz ostrzeżenie o tym, że konwersja ze string na char* jest przestarzała.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] edytor WYSIWYG

Nowy postprzez shepard » niedziela, 28 października 2012, 02:57

A czy ktoś może korzystał biblioteki (rtftohtml_sautinsoft.dll) i wie jak ją użyć w C++Builder 6, tak aby bez błędnie działała?
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości