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

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

24.02.2011, 19:06. Показов 14247. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru