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

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

24.02.2011, 19:06. Показов 14122. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru