С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/65: Рейтинг темы: голосов - 65, средняя оценка - 4.74
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142

RichEdit форматирование и не только

24.02.2011, 19:06. Показов 14113. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток в общем имеется задача : необходимо введеный и отформатированный текст(жирный,курсив,подчеркивание,измене ние цвета)обработать и заменить нужное тегами...тоесть в итоге вместо такого текста я должен получить <b>такой текст</b> и далее по аналогии

вот так от я делаю текст жирным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void __fastcall TForm1::RzToolButton4Click(TObject *Sender)
{
if(MemoText->Focused())
{
InsertTag("<b>","</b>",4);
}
if(RichEdit1->Focused())
{
    if(!RichEdit1->SelLength == 0)
    {
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;
    RichEdit1->SelLength = 0;
    RichEdit1->SelStart = RichEdit1->Text.Length();
    RichEdit1->SelAttributes->Style = RichEdit1->DefAttributes->Style;
    }
    else
    {
        if(RzToolButton4->Transparent == true)
        {
            RzToolButton4->Transparent = false;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;
        }
        else
        {
            RzToolButton4->Transparent = true;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >>fsBold;
        }
    }
 
}
}
собственно тут у меня имеется упрощенный вариант для простого обрамления выделенного текста в теги через мемо этот вариант конечно проще но он мне не нравится...

P.S если имеется выделенный текст он ожирняется и сбрасывается выделение...если выделенного текста нету то включается режим жирной печати...хотя это и так видно

Добавлено через 2 минуты
Пы.Сы вложил этот код так как ничего другого нету хоть он к вопроу напрямую не относится но совсем без кода начинать тему...как то не солидно))))

Добавлено через 2 минуты
еще раз Пы.Сы
пытался текс разбить на слова и проверить на наличие атрибутов на столкнулся с проблемой...если текст выносить из рич эдита даже в другой рич эдит форматировани сбрасывается)в общем буду благодарен любой помощи
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2011, 19:06
Ответы с готовыми решениями:

Форматирование текста в RichEdit
if(RichEdit-&gt;SelAttributes-&gt;Style == RichEdit-&gt;SelAttributes-&gt;Style &lt;&lt; fsBold) { ...

Форматирование и перенос данных из RichEdit в StringGrid
Здравствуйте!Делаю первые робкие попытки в программировании ),поэтому не судите строго. Собственно цель:В RichEdit есть некий текст... ...

Записывает текст в файл только из последнего RichEdit
Здравствуйте. Я пишу программу-тестер знаний, и у меня 11 вопросов. Я сделал один RichEdit и при клике на кнопку &quot;Дальше&quot; он...

32
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
24.02.2011, 21:15
вот так человек делал подсветку тегов HTML. Смотрите, как он искал теги и вместо замены цветы делайте замену тега :
HTML5
1
LALALA <!-- на --> <P>LALALA</P>
и т.д.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//On header(FWDesign.h) define
TStringList *htmltag;
TStringList *atribut;
 
//On FormCreate
void __fastcall TFWDesign::FormCreate(TObject *Sender)
      {
      htmltag = new (TStringList);
      atribut = new (TStringList);
      htmltag->Add("html");
      htmltag->Add("body");
      htmltag->Add("h1");
      htmltag->Add("h2");
      htmltag->Add("h3");
      htmltag->Add("h4");
      htmltag->Add("h5");
      htmltag->Add("h6");
      htmltag->Add("p");
      htmltag->Add("br");
      htmltag->Add("hr");
      htmltag->Add("b");
      htmltag->Add("big");
      htmltag->Add("blockquote");
      htmltag->Add("center");
      htmltag->Add("code");
      htmltag->Add("font");
      htmltag->Add("i");
      htmltag->Add("pre");
      htmltag->Add("s");
      htmltag->Add("small");
      htmltag->Add("strike");
      htmltag->Add("strong");
      htmltag->Add("u");
      htmltag->Add("Address");
      htmltag->Add("form");
      htmltag->Add("input");
      htmltag->Add("textarea");
      htmltag->Add("button");
      htmltag->Add("select");
      htmltag->Add("option");
      htmltag->Add("frame");
      htmltag->Add("frameset");
      htmltag->Add("iframe");
      htmltag->Add("img");
      htmltag->Add("map");
      htmltag->Add("a");
      htmltag->Add("link");
      htmltag->Add("ul");
      htmltag->Add("ol");
      htmltag->Add("li");
      htmltag->Add("table");
      htmltag->Add("th");
      htmltag->Add("tr");
      htmltag->Add("td");
      htmltag->Add("style");
      htmltag->Add("div");
      htmltag->Add("span");
      htmltag->Add("head");
      htmltag->Add("title");
      htmltag->Add("meta");
      htmltag->Add("script");
      htmltag->Add("marquee");
 
      atribut->Add("align");
      atribut->Add("valign");
      atribut->Add("width");
      atribut->Add("height");
      atribut->Add("border");
      atribut->Add("bgcolor");
      atribut->Add("background");
      atribut->Add("cellpadding");
      atribut->Add("cellspacing");
      atribut->Add("href");
      atribut->Add("src");
      atribut->Add("target");
      atribut->Add("rowspan");
      atribut->Add("colspan");
      atribut->Add("type");
      atribut->Add("rows");
      atribut->Add("cols");
      atribut->Add("method");
      atribut->Add("action");
      atribut->Add("name");
      atribut->Add("value");
      atribut->Add("language");
      atribut->Add("id");
      atribut->Add("class");
      atribut->Add("alt");
      atribut->Add("rel");
      atribut->Add("content");
      atribut->Add("http-equiv");
      atribut->Add("charset");
      atribut->Add("face");
      atribut->Add("color");
      atribut->Add("size");
      }
 
      //on RichEdit Change
 
      void __fastcall TFWDesign::RichEdit1Change(TObject *Sender)
      {
      ::SendMessage(RichEdit1->Handle, WM_SETREDRAW, false, 0);//disable richedit
      if ( RichEdit1->Modified )
      {
      int pawal;
      AnsiString teks;
 
      pawal = RichEdit1->SelStart;
 
      RichEdit1->SelStart = ::SendMessage( RichEdit1->Handle,EM_FINDWORDBREAK,
      WB_MOVEWORDLEFT,pawal );
 
      RichEdit1->SelLength = ::SendMessage( RichEdit1->Handle,EM_FINDWORDBREAK,
      WB_MOVEWORDRIGHT,RichEdit1->SelStart ) -
      RichEdit1->SelStart ;
 
      teks = RichEdit1->SelText;
 
      teks = teks.TrimLeft();
      teks = teks.TrimRight();
 
      for(int i=0;i<htmltag->Count;i++)
      {
      if (teks==htmltag->Strings[i])
      {
      RichEdit1->SelAttributes->Color=clBlue;
      }
      }
      for(int i=0;i<atribut->Count;i++)
      {
      if (teks==atribut->Strings[i])
      {
      RichEdit1->SelAttributes->Color=clRed;
      }
      }
      RichEdit1->SelStart=pawal;
      RichEdit1->SelAttributes->Color=clBlack;
      }
 
      ::SendMessage(RichEdit1->Handle, WM_SETREDRAW, true, 0);//enable richedit
      ::InvalidateRect(RichEdit1->Handle, 0, true);//setfocus richedit
}
код не мой, консультации в разумных пределах .

Добавлено через 9 минут
и вот это - RzToolButton4Click - я так понимаю, какая-то лабуда от Reize Software - в данном случае не так уж и критично, но если вы выкладываете код на форуме, учитывайте, что данных "левых" компонентов может не быть, да и , в большинстве случаев, просто нет у других участников, поэтому проанализировать ваш код будет невозможно, как в данном примере - ваше RzToolButton4->Transparent = false; у меня не сработает, а устанавливать не нужные мне на данный момент компоненты, сами понимаете, я не буду , да и просто перебивать ваш RzToolButton4->Transparent = false; на понятный моему Билдеру Button4->Visible = false; как-то лениво .
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
25.02.2011, 00:46  [ТС]
LK, Спасибо буду думать над тем что вы мне дали =) насчет компонетов согласен но тут в купе с моим описанием вполне понятно что Transparent отвечает за определение вкл и выкл режима жирного или иного ввода) да и визуально становится видно что сейчас вкл или выкл)но впредь буду описывать более подробно

Добавлено через 3 часа 1 минуту
Просдил весь вечер но что то ничего не получается нифига нисколько не сдвинулся с места исходный код проверяет на соответствие вводимого с тегами в реальном времени мне же нежно просканить уже готовый отформатированный текст если я пытаюсь разбить его на слова то теряется форматирование пытаюсь поправить этот код ничего не получается вообще)))

подтолкните как можно сделать 1:найти первое слово проверить его на атрибуты
2:если атрибутов нету записываем его в строку идем далее если атрибут есть записываем открывающий тег(например <b>) + слово и ищем далее
3:если слово иммет тоже форматирование то плюсуем его в строку если нет закрываем тег(</b>) и плюсуем слово

и в общем то вот таким макаром проверить весь текст...но как разбить текст в RichEdit сохранив форматирование?прям незнаю что делать)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
25.02.2011, 01:11
Цитата Сообщение от Arnike Посмотреть сообщение
0. исходный код проверяет на соответствие вводимого с тегами в реальном времени мне же нежно просканить уже готовый отформатированный текст если я пытаюсь разбить его на слова то теряется форматирование пытаюсь поправить этот код ничего не получается вообще)))

подтолкните как можно сделать 1:найти первое слово проверить его на атрибуты
2:если атрибутов нету записываем его в строку идем далее если атрибут есть записываем открывающий тег(например <b>) + слово и ищем далее
3:если слово иммет тоже форматирование то плюсуем его в строку если нет закрываем тег(</b>) и плюсуем слово

и в общем то вот таким макаром проверить весь текст...но как разбить текст в RichEdit сохранив форматирование?прям незнаю что делать)
1. Проблемы нет: грузите текст в Рич, проверяете. Отформатированный - это надо работать с тегами RTF, посмотрите формат RTF, подозреваю, морока будет, вот пример:
В своё время я не делал оформление текста, как ты, а напрямую вставлял RTF-текст, т.е. сразу с его тегами и пр.
Вот примерный код. Примерный, потому что старый код где-то на работе валяется, а это по памяти писал, но проверенный - 50тыс строк грузит долговато на моём ноуте (сек 20), но это и в debug, и ноут слабенький, да и практически всё время - это парсинг самим TRichEdit'ом - если по-немногу добавлять, то не так заметны тормоза будут.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::Button1Click(TObject*)
{
   RichEdit1->Text = _T("");
   AnsiString s = "{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}{\\f1\\fswiss\\fcharset204{\\*\\fname Arial;}Arial CYR;}}\n\
{\\colortbl ;\\red255\\green0\\blue0;}\n";
   TMemoryStream* m = new TMemoryStream;
   m->Write(s.c_str(), s.Length());
   const char* templ = "\\viewkind4\\uc1\\pard\\cf1\\lang1033\\b\\f0\\fs20 %012d \\cf0\\b0 line line line\\par\n";
   for(int i = 0, cnt = CSpinEdit1->Value; i != cnt; ++i) {
     AnsiString ss = AnsiString().sprintf(templ, i);
     m->Write(ss.c_str(), ss.Length());
     if( i % 1000 == 0 ) {
       Label1->Caption = i;
       Application->ProcessMessages();
     }
   }
   m->Write("}", 1);
   m->Seek(0, 0);
   RichEdit1->Lines->LoadFromStream(m);
   delete m;
   Label1->Caption = RichEdit1->Lines->Count;
}
Код заносит строки в TRichEdit с номером строки, который выделен как красный жирный.
2. Вы сами все расписАли
подтолкните как можно сделать 1:
так и делать. Для поиска используйте FindText() или API:
C++
1
2
3
4
5
6
FINDTEXT tf;
int nextMatch;
tf.chrg.cpMin = 0;  // позиция начала поиска
tf.chrg.cpMax = RE1.TextLength; // позиция завершения поиска
tf.lpstrText := 'text to find'; // текст, который ищем
nextMatch = RE->Perform(EM_FINDTEXT, FR_WHOLEWORD, (LPARAM) &tf);
как-то так
Инфы по теме - море.
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
27.02.2011, 14:55  [ТС]
Подскажите пожалуйста еще одну вещь:как можно узнать былали строка оборвана допустим нажатием Enter а не WordWrap-ом и еще как можно выследить табуляцию текста?)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
27.02.2011, 15:32
Если строка "оборвана" Enter'ом - в конце строки будет \n или \r\n (скрытые символы, записит от версии РичЭдит), также и табуляция - \t.
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
27.02.2011, 20:23  [ТС]
Спасибо LK, дело осталось за малым

Добавлено через 4 часа 45 минут
С тегами разобрался все работает способ может и не самый лучший но все таки он работает и делает то что надо)

вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    int StartPos,SelLength,i,FStartPos = 0;
    int TextL = Memo->Text.Length();
    int Formating = 0;
    bool StateB = false,StateI = false,StateU = false,StateExample = false;
 
    TStringList *WCount = new TStringList();
    WCount->DelimitedText = Memo->Text;
    WordCount = WCount->Count;
 
    AnsiString ResultString;
    ResultString = Memo->Text;
 
    TSearchTypes mySearchTypes = TSearchTypes();
    mySearchTypes << stWholeWord;
 
    for(i = 0;i<WordCount;i++)
    {
    AnsiString FText = WCount->Strings[i];
 
    StartPos = Memo->FindTextW(FText,FStartPos,TextL,mySearchTypes);
    if(StartPos != -1)
    {
        Memo->SelStart = StartPos;
        Memo->SelLength = FText.Length();
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsBold)
        {
            if(StateB != true)
            {
            ResultString.Insert("<b>",StartPos + Formating);
            Formating = Formating + 3;
            StateB = true;
            }
        }
        else
        {
            if(StateB != false)
            {
                ResultString.Insert("</b>",StartPos + Formating);
                Formating = Formating + 4;
                StateB = false;
            }
        }
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsItalic)
        {
            if(StateI != true)
            {
            ResultString.Insert("<i>",StartPos + Formating);
            Formating = Formating + 3;
            StateI = true;
            }
        }
        else
        {
            if(StateI != false)
            {
                ResultString.Insert("</i>",StartPos + Formating);
                Formating = Formating + 4;
                StateI = false;
            }
        }
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsUnderline)
        {
            if(StateU != true)
            {
            ResultString.Insert("<u>",StartPos + Formating);
            Formating = Formating + 3;
            StateU = true;
            }
        }
        else
        {
            if(StateU != false)
            {
                ResultString.Insert("</u>",StartPos + Formating);
                Formating = Formating + 4;
                StateU = false;
            }
        }
        if(Memo->SelAttributes->Color != Memo->Font->Color)
        {
            if(StateExample != true)
            {
            ResultString.Insert("<div id = example>",StartPos + Formating);
            Formating = Formating + 18;
            StateExample = true;
            }
        }
        else
        {
            if(StateExample != false)
            {
                ResultString.Insert("</div>",StartPos + Formating);
                Formating = Formating + 6;
                StateExample = false;
            }
        }
 
    }
    FStartPos = StartPos + FText.Length();
    }
если есть идеи по улучшению этого момента то я буду очень благодарен осталось сделать определение обрывов строк и табуляций но это я наверное оложу до завтра

Добавлено через 1 минуту
ПыСы не обращайте внимания на имя указателя Memo просто раньше все это происходило в Мемо и на этом указателе много чего завязано поэтому я не сал менять его имя а просто стал записывать в него рич эдит
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
27.02.2011, 20:32
Цитата Сообщение от Arnike
1. если есть идеи по улучшению этого момента то я буду очень благодарен
2. осталось сделать определение обрывов строк и табуляций но это я наверное оложу до завтра
1. что вы имеете ввиду?
2. Вот кусок кода (когда-то делал совсем по другому поводу), может, натолкнет на мысль.
C++
1
2
3
4
5
6
7
8
9
10
11
wchar_t buf[4];
::TEXTRANGE tr;
    
j = RichEdit->Perform(EM_LINEINDEX,i,0); // номера строк
tr.chrg.cpMin=j-1;
tr.chrg.cpMax=j;
tr.lpstrText=buf;
// Перенос строк по \r\n используется только в RichEdit 1.0,
// а в старших версиях только по \r. Поэтому нужно добавить условие:
if ( RichEdit->Perform(EM_GETTEXTRANGE,0,long(&tr))
     &&(buf[0]!='\n')&&(buf[0]!='\r') ) { //проверяем пред.символ на \n
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
27.02.2011, 20:37  [ТС]
1.Имею в виду может я делаю это не совсем рационально и можно как то упростить мое решение
2.Спасибо еще как наталкивает вы уже можно сказать долбанули меня об эту мысль
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
27.02.2011, 20:44
Цитата Сообщение от Arnike Посмотреть сообщение
1.Имею в виду может я делаю это не совсем рационально и можно как то упростить мое решение
- по этому поводу расскажу вам один анекдот:
Сынок - отцу программисту:
- Пап, а пап ? Ты видел, какое красивое восходящее солнце?
Папаша:
- Красивое? Ты проверял?
- Да, папа!
- Каждый день проверял?
- Да, папа!!
- Каждый день - красивое, и - восходит?
- Да, папа!!!
- Я тебя умоляю - только ничего не меняй!!!
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
27.02.2011, 20:49  [ТС]
Наверное вы правы
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
27.02.2011, 20:53
посмотрел, да нормально все
1
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
03.03.2011, 13:51
копирую этот кусок кода, и получаю 3 ошибки

C++
1
2
3
TStringList *WCount = new TStringList();
        WCount->DelimitedText = Memo->Text;
        WordCount = WCount->Count;
[BCC32 Error] Parser.cpp(15): E2238 Multiple declaration for 'WCount'
[BCC32 Error] Parser.cpp(14): E2344 Earlier declaration of 'WCount'
[BCC32 Error] Parser.cpp(15): E2141 Declaration syntax error
[BCC32 Error] Parser.cpp(16): E2303 Type name expected
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.03.2011, 14:16
[BCC32 Error] Parser.cpp(15): E2238 Многочисленное объявление 'WCount'
[BCC32 Error] Parser.cpp(14): E2344 Ранне объявлен 'WCount'
[BCC32 Error] Parser.cpp(15): E2141 Declaration syntax error Синтаксическа ошибка Недостаточн окода для диагноза
[BCC32 Error] Parser.cpp(16): E2303 Type name expected Ожидается имя типа Недостаточно кода для диагноза
1. Есть хорошее правило показывать строку, на которую указывает ошибка
2. Предоставлять больше кода
Можно посоветовать, исходя из скудности предоставленной информации:
C++
1
2
3
WCount = new TStringList;
        WCount->DelimitedText = Memo->Text;
        WordCount /*Это что и где*/ = WCount->Count;
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
03.03.2011, 15:00
а код тут в темке, на первой страничке.

RichEdit форматирование и не только

я его даже пальцем не тронул
ну только мышкой... чуточку потаскал
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.03.2011, 15:05
а как я сказал - сделал, или только мастак вопросы задавать ?
ну и исправь на
C++
1
int WordCount = ...
. или проси у Arnike весь код

Добавлено через 1 минуту
исходя из того кода - вот этого
[BCC32 Error] Parser.cpp(15): E2238 Multiple declaration for 'WCount'
не может быть никак, была твоя отсебятина или мышкой тюкал несколько раз.
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
06.03.2011, 11:28  [ТС]
Собственно вот что у меня получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    int StartPos,SelLength,i,FStartPos = 0;
    int TextL = Memo->Text.Length();
    int Formating = 0;
    bool StateB = false,StateI = false,StateU = false,StateExample = false;
 
    TStringList *WCount = new TStringList();
    WCount->DelimitedText = Memo->Text;
    WordCount = WCount->Count;
 
    AnsiString ResultString;
    ResultString = Memo->Text;
 
    TSearchTypes mySearchTypes = TSearchTypes();
    mySearchTypes << stWholeWord;
 
    for(i = 0;i<WordCount;i++)
    {
    AnsiString FText = WCount->Strings[i];
 
    StartPos = Memo->FindTextW(FText,FStartPos,TextL,mySearchTypes);
    if(StartPos != -1)
    {
        Memo->SelStart = StartPos;
        Memo->SelLength = FText.Length();
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsBold)
        {
            if(StateB != true)
            {
            ResultString.Insert("<b>",StartPos + Formating);
            Formating = Formating + 3;
            StateB = true;
            }
        }
        else
        {
            if(StateB != false)
            {
                ResultString.Insert("</b>",StartPos + Formating);
                Formating = Formating + 4;
                StateB = false;
            }
        }
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsItalic)
        {
            if(StateI != true)
            {
            ResultString.Insert("<i>",StartPos + Formating);
            Formating = Formating + 3;
            StateI = true;
            }
        }
        else
        {
            if(StateI != false)
            {
                ResultString.Insert("</i>",StartPos + Formating);
                Formating = Formating + 4;
                StateI = false;
            }
        }
        if(Memo->SelAttributes->Style == Memo->SelAttributes->Style << fsUnderline)
        {
            if(StateU != true)
            {
            ResultString.Insert("<u>",StartPos + Formating);
            Formating = Formating + 3;
            StateU = true;
            }
        }
        else
        {
            if(StateU != false)
            {
                ResultString.Insert("</u>",StartPos + Formating);
                Formating = Formating + 4;
                StateU = false;
            }
        }
        if(Memo->SelAttributes->Color != Memo->Font->Color)
        {
            if(StateExample != true)
            {
            ResultString.Insert("<div id = example>",StartPos + Formating);
            Formating = Formating + 18;
            StateExample = true;
            }
        }
        else
        {
            if(StateExample != false)
            {
                ResultString.Insert("</div>",StartPos + Formating);
                Formating = Formating + 6;
                StateExample = false;
            }
        }
 
    }
    FStartPos = StartPos + FText.Length();
    }
    if(StateB == true)
    {
        ResultString.Insert("</b>",ResultString.Length());
    }
    if(StateI == true)
    {
        ResultString.Insert("</i>",ResultString.Length());
    }
    if(StateU == true)
    {
        ResultString.Insert("</u>",ResultString.Length());
    }
    if(StateExample == true)
    {
        ResultString.Insert("</div>",ResultString.Length());
    }
переводит форматированный текст из RichEdit в хтмл все работает нормально =) но вот с обрывами строк и табуляцией я все равно не разобрался...не совсем понимаю что требуется)вот еще код форматирования в RichEdit'e

Кнопка для ожирнения выделеного текста или включения режима ввода жирного текста если выделение пустое

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if(RichEdit1->Focused())//Для начала проверяем в фокусе ли RichEdit
{
    if(!RichEdit1->SelLength == 0)//Узнаем есть ли у нас выделенный текст
    {
        if(RichEdit1->SelAttributes->Style == RichEdit1->SelAttributes->Style >> fsBold)//Проверяем выделеный текст на наличие атрибта fsBold        {
            int Sel = RichEdit1->SelStart;
            int SelL = RichEdit1->SelLength;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;//Делаем выделеный текст жирным
            RichEdit1->SelLength = 0;
            RichEdit1->SelStart = Sel+SelL;//Сбрасывем выделение на конец отформатированного текста
            RichEdit1->SelAttributes->Style = RichEdit1->DefAttributes->Style;//Сбрасываем атрибуты для дальнейшего ввода текста в обычном режиме
        }
        else //Если текст уже имеет атрибут fsBold то тем же способом его сбрасываем
        {
            int Sel = RichEdit1->SelStart;
            int SelL = RichEdit1->SelLength;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
            RichEdit1->SelLength = 0;
            RichEdit1->SelStart = Sel+SelL;
            RichEdit1->SelAttributes->Style = RichEdit1->DefAttributes->Style;
        }
    }
    else//Выделение равно 0(текста нет указана позиция)
    {
        if(RzToolButton4->Transparent == true)//Индикатором вкл и выкл режима я выбрал свойство Transparent на Райз тул баре это так же еще служит и визуальным определением
        {
            RzToolButton4->Transparent = false;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;
            RzToolButton4->Font->Color = clWhite;
        }
        else
        {
            RzToolButton4->Transparent = true;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >>fsBold;
            RzToolButton4->Font->Color = clBlack;
        }
    }
 
}
и проверка активных режимов при перемещении курсора в RichEdit сделал в OnMouseUp
C++
1
2
3
4
5
6
7
8
    if(RzToolButton4->Transparent == true)
    {
        RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
    }
    else
    {
        RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;
    }
по аналогии делаетс и остальное(курсив подчеркивание)

вопрос по обрывам строк и табуляции активен благодарен любой помощи
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2011, 18:55
вопрос по обрывам строк и табуляции активен
напомните, что с ними не так?
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
06.03.2011, 19:35  [ТС]
Ну вы скинули мне отрывок из своего кода я не совсем понимаю что там к чему)не могу адаптировать попробовал просто посмореть чтоже у нас получается в в переменной buf получил какето непонятные символы...в общем неизученный материал это)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2011, 19:42
Цитата Сообщение от Arnike Посмотреть сообщение
Ну вы скинули мне отрывок из своего кода я не совсем понимаю что там к чему)не могу адаптировать попробовал просто посмореть чтоже у нас получается в в переменной buf получил какето непонятные символы...в общем неизученный материал это)
а поконкретней низзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2011, 19:42
Помогаю со студенческими работами здесь

Из RichEdit в RichEdit без потери форматирования
Есть RichEdit1 с форматированным текстом(цвет, стиль и тп.) нужно передать этот текст в переменную а затем в RichEdit2 чтобы при вставке в...

RichEdit или RTF форматирование текста, а лучше HTML форматирование
Привет формучани. Подскажите бесплатный компонент который позволил бы выводить текст в формате RTF или HTML. Очень хорошо подходит TMS...

Форматирование в RichEdit
Доброго времен суток. Помогите пожалуйста, решить одну проблемку. Нужно дописать форматированный текст из RichEdit в файл формата .rtf....

Форматирование в RichEdit
Как в RichEdit программно форматировать текст подскажите команды

RichEdit форматирование
Есть в бд есть поле blop,в нем хранится rtf текст. Вывожу в простой richedit: var text:AnsiString ; stream:TMemoryStream; begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru