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

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

24.02.2011, 19:06. Показов 14343. Ответов 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
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
06.03.2011, 19:49  [ТС]
Студворк — интернет-сервис помощи студентам
Попробую конкретней)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
слабо понимаю что это делает)ну я так думаю что GETTEXTRANGE извлекает текст вместе с элементами форатирования перед определялись строки откуда извлекаем и се это записывается в buf но кажется мне что понимаю я все неверно или просто обычным поиском в тексте в wchar_t нельзя?)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2011, 19:59
это структура API, задающая диапазон текста, можете пробовать использовать RichEdit->SelStart, RichEdit->SelLength, а в буфере символ, с которым идет сравнение
C++
1
обычным поиском в тексте в wchar_t нельзя?
пробуйте , мне как-то сподручней было так
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
07.03.2011, 10:50  [ТС]
Тема форматирования раскрыта =) вот что полчилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    wchar_t buf[4];
    int i;
        for(i = 0;i < RichEdit1->Text.Length();i++)
        {
            RichEdit1->SelStart = i;
            RichEdit1->SelLength = 1;
 
            if(RichEdit1->GetSelTextBuf(buf,4) != 0)
            {
                if(buf[0] == '\t')
                {
                    ShowMessage("Табуляция");
                }
                if(buf[0] == '\r')
                {
                    ShowMessage("Обрыв строки");
                }
            }
    }
комментарии излишни спасибо LK,
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.03.2011, 19:17
разобрался сам, сделал дело - получи (+)
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
12.05.2011, 22:55  [ТС]
Апну тему очередным вопросом)переделываю свою программулину в связи с возникновением необходимости некоторых возможностей которые к сожалению на том что было реализовать невозможно...ну это не интересно в общем то сам вопрос)необходимо хранить форматированный текст из RichEdit'a в каком то контейнере так как в процессе использование программы он может потребоваться(для его редактирования) хранение в фале конечно же не подходит можно TMemoStream но проблема в том что таких текстов может быть несколько и они должны быть само собой не в одном стриме...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.05.2011, 06:26
а сделать несколько стримов - свой для каждого ричэдита нельзя ?
C++
1
2
3
TMemoryStream * stream1;
TMemoryStream * stream2;
TMemoryStream * stream3;
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
13.05.2011, 19:10  [ТС]
Можно но как мне ими пользоваться в других местах программы когда они создаются динамически?может это и элементарно но я незнаю как

Добавлено через 3 минуты
да и их количество неизвестно они могут удаляться изменяться и собственно добавляться новые в этом то и есть вся загвоздка =)
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
04.06.2011, 22:04  [ТС]
Вопрос был решен использованием невидимых RichEdit'ов Собственно продолжение темы)добрался таки до ртф а именно таблиц)ртф теги таблицы формируются но в RichEdit отображаются как обычный текст ну а я конечно же хочу совсем не так)
вот очень простой код без сбора каких либо данных простое формирование таблицы с заданным наполнением
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TStringList *StrRtf;
StrRtf = new TStringList;
StrRtf->Add("{\\rtf1\\ansi\\ansicpg1251");
StrRtf->Add("\\trowd\\trgaph50");
int i,j;
for(j=1;j<=StrToInt(Rowses->Text);j++)
{
    for(i=1;i<=StrToInt(Colums->Text);i++)
    {
        StrRtf->Add("\\clbrdrt\\brdrs\\clbrdrl\\brdrs\\clbrdrb\\brdrs\\clbrdrr\\brdrs\\cellx" + IntToStr(i) + "000");
    }
    StrRtf->Add("\\pard\\intbl");
    for(i=1;i<=StrToInt(Colums->Text);i++)
    {
        StrRtf->Add("Col_1\\cell");
    }
    StrRtf->Add("\\row");
}
StrRtf->Add("}");
Table->Visible = false;
RzRichEdit1->Lines->AddStrings(StrRtf);
ну размеры разве что тут меняются так вот такой способ конечно же оказался не рабочим)PlainText = false...уж и не знаю как тут решать)
P.S специально для уважаемого L.K ваш код в другой теме по этому поводу смотрел но совершенно нифига не понял
0
12 / 12 / 2
Регистрация: 22.10.2010
Сообщений: 134
05.06.2011, 05:02
Arnike, я тоже недавно искал способ сохранения rtf в HTML, и вот вижу, что вы тут с LK нашли его. Можете выложить исходник этой формой? Буду благодарен
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.06.2011, 06:12
вообще-то, нормальные герои всегда идут в обход - можно пообщаться с оле-сервером ворд и сохранить в хтмл, обратив внимание на это:
typedef enum WdSaveFormat
{
wdFormatDocument = 0,
wdFormatTemplate = 1,
wdFormatText = 2,
wdFormatTextLineBreaks = 3,
wdFormatDOSText = 4,
wdFormatDOSTextLineBreaks = 5,
wdFormatRTF = 6,
wdFormatUnicodeText = 7,
wdFormatEncodedText = 7,
wdFormatHTML = 8
} WdSaveFormat;
1
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
05.06.2011, 10:45  [ТС]
ух ты нифига но мне ведь в любом случае надо таблицу сначала как то создать)ну создать теги вроде как получается отобразить не получается...а так получается что я занимался всем этим рукоблудием просто так

Добавлено через 2 минуты
а вообще вот функция которая переводит ртф(только жирный текст курсив подчеркивание табуляцию и обрыв строки...ну плюс еще одна штучка которая у меня делает особое форматирование в хтмл по созданному там классу)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
UnicodeString Convert(TRzRichEdit *RichEdit)
{
    bool StateB = false, StateI = false, StateU = false,StateE = false;
    int i;
    String Result;
    wchar_t buf[4];
    try {
        RichEdit->SelStart = 0;
        for (i = 0; i < RichEdit->Text.Length(); i++) {
            RichEdit->SelStart = i;
            RichEdit->SelLength = 1;
            if(RichEdit->SelAttributes->Color != RichEdit->DefAttributes->Color)
            {
                if(StateE == false)
                {
                    StateE = true;
                    Result = Result + "<div id = example>";
                }
            }
            if ((RichEdit->SelAttributes->Style !=
                RichEdit->SelAttributes->Style << fsBold) && (StateB == true)) {
                StateB = false;
                Result = Result + "</b>";
            }
            if ((RichEdit->SelAttributes->Style !=
                RichEdit->SelAttributes->Style << fsItalic) && (StateI == true))
            {
                StateI = false;
                Result = Result + "</i>";
            }
            if ((RichEdit->SelAttributes->Style !=
                RichEdit->SelAttributes->Style << fsUnderline) &&
                (StateU == true)) {
                StateU = false;
                Result = Result + "</u>";
            }
            if((RichEdit->SelAttributes->Color == RichEdit->DefAttributes->Color)&&(StateE == true))
            {
                StateE = false;
                Result = Result + "</div>";
            }
            if(RichEdit->SelText == "<")
            {
                Result = Result + "&lt;";
            }
            if(RichEdit->SelText == ">")
            {
                Result = Result + "&gt;";
            }
            if(RichEdit->GetSelTextBuf(buf,4) != 0)
            {
                if(buf[0] == '\r')
                {
                    Result = Result + "<br>";
                }
                if(buf[0] == '\t')
                {
                    Result = Result + "&nbsp;&nbsp;&nbsp;";
                }
            }
 
            if (RichEdit->SelAttributes->Style !=
                RichEdit->DefAttributes->Style) {
                if (RichEdit->SelAttributes->Style ==
                    RichEdit->SelAttributes->Style << fsBold) {
                    if (StateB == false) {
                        StateB = true;
                        Result = Result + "<b>";
                    }
                    if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsItalic) {
                        if (StateI == false) {
                            StateI = true;
                            Result = Result + "<i>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsUnderline) {
                            if (StateU == false) {
                                StateU = true;
                                Result = Result + "<u>";
                            }
                        }
                    }
                    else if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsUnderline) {
                        if (StateU == false) {
                            StateU = true;
                            Result = Result + "<u>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsItalic) {
                            if (StateI == false) {
                                StateI = true;
                                Result = Result + "<i>";
                            }
                        }
                    }
                    Result = Result + RichEdit->SelText;
                }
                else if (RichEdit->SelAttributes->Style ==
                    RichEdit->SelAttributes->Style << fsItalic) {
                    if (StateI == false) {
                        StateI = true;
                        Result = Result + "<i>";
                    }
                    if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsBold) {
                        if (StateB == false) {
                            StateB = true;
                            Result = Result + "<b>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsUnderline) {
                            if (StateU == false) {
                                StateU = true;
                                Result = Result + "<u>";
                            }
                        }
                    }
                    else if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsUnderline) {
                        if (StateU == false) {
                            StateU = true;
                            Result = Result + "<u>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsBold) {
                            if (StateB == false) {
                                StateB = true;
                                Result = Result + "<b>";
                            }
                        }
                    }
                    Result = Result + RichEdit->SelText;
                }
                else if (RichEdit->SelAttributes->Style ==
                    RichEdit->SelAttributes->Style << fsUnderline) {
                    if (StateU == false) {
                        StateU = true;
                        Result = Result + "<u>";
                    }
                    if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsBold) {
                        if (StateB == false) {
                            StateB = true;
                            Result = Result + "<b>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsItalic) {
                            if (StateI == false) {
                                StateI = true;
                                Result = Result + "<i>";
                            }
                        }
                    }
                    else if (RichEdit->SelAttributes->Style ==
                        RichEdit->SelAttributes->Style << fsItalic) {
                        if (StateI == false) {
                            StateI = true;
                            Result = Result + "<i>";
                        }
                        if (RichEdit->SelAttributes->Style ==
                            RichEdit->SelAttributes->Style << fsBold) {
                            if (StateB == false) {
                                StateB = true;
                                Result = Result + "<b>";
                            }
                        }
                    }
                    Result = Result + RichEdit->SelText;
                }
            }
            else {
                if (StateB == true) {
                    StateB = false;
                    Result = Result + "</b>";
                }
                if (StateI == true) {
                    StateI = false;
                    Result = Result + "</i>";
                }
                if (StateU == true) {
                    StateU = false;
                    Result = Result + "</u>";
                }
                Result = Result + RichEdit->SelText;
            }
        }
        if (StateB == true) {
            Result = Result + "</b>";
        }
        if (StateI == true) {
            Result = Result + "</i>";
        }
        if (StateU == true) {
            Result = Result + "</u>";
        }
        if(StateE == true)
        {
            StateE = false;
            Result = Result + "</div>";
        }
        return (Result);
    }
    catch (...)
    {
 
    }
}
Добавлено через 1 минуту
в общем то и ртф таблицу конвертировать проблем не составить я бы все таки хотел сделать это сам)ведь у меня используются классы для более "чоткого" отображения)
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
09.06.2011, 03:58  [ТС]
с таблицей разобрался но есть одно но ячейки не "плавающие" изменять их размеры на лету нельзя это конечно понятно что делать надо ручками...но как?)подтолкните)
вот так делаю таблицу
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
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* StrRtf = new TMemoryStream;
StrRtf->Write(s.c_str(), s.Length());
for(int i = 0, cnt = StrToInt(Rowses->Text); i != cnt; ++i)
{
    const char* templ = "\\clbrdrt\\brdrs\\clbrdrl\\brdrs\\clbrdrb\\brdrs\\clbrdrr\\brdrs\\cellx";
    const char* cells = "\\cell\n";
    for(int i = 0,count = StrToInt(Colums->Text);i !=count;++i)
    {
        AnsiString row = AnsiString().sprintf(templ, i);
        AnsiString Cell = IntToStr(i+1) + "000\n";
        StrRtf->Write(row.c_str(), row.Length());
        StrRtf->Write(Cell.c_str(),Cell.Length());
    }
    StrRtf->Write("\\pard\\intbl\n",13);
    for(int j = 0,count = StrToInt(Colums->Text);j !=count;++j)
    {
        AnsiString Colum = AnsiString().sprintf(cells, j);
        StrRtf->Write(Colum.c_str(), Colum.Length());
    }
    StrRtf->Write("\\row\n",5);
}
StrRtf->Write("}",1);
StrRtf->Seek(0, 0);
RzRichEdit1->Lines->LoadFromStream(StrRtf);
delete StrRtf;
Table->Visible = false;
0
 Аватар для Arnike
23 / 23 / 4
Регистрация: 26.12.2008
Сообщений: 142
10.06.2011, 22:49  [ТС]
Или никто не знает или всем поф)
очередной вопрос)в чем измеряется ширина и высота ячеек?не могу понять сколько это в пикселях
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.06.2011, 22:49

Из 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 ...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru