You are getting the RichEdit line insertion error
because of check added to the Delphi 2009 version. This check verifies if the insertion of a new line has been successful and this check uses for it the selection position. Unfortunately, for the following piece of code:
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.Clear;
RichEdit1.Lines.Add('1');
end;
procedure TForm1.RichEdit1Change(Sender: TObject);
begin
if RichEdit1.Lines.Count > 0 then
RichEdit1.Lines.Delete(0);
end;
The workflow looks like this:
1. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Get the position of the first char for the line where the string will be inserted, add the linebreak to that string, setup the selection (0 length, starting at the line beginning) and insert the string by performing EM_REPLACESEL message, what except the text insertion, changes also the selection position. The check mentioned above has not been performed yet, and in the meantime that text insertion causes the OnChange event to fire, where the TRichEdit.Lines.Delete is called.
2. — TRichEdit.Lines.Delete
Delete does something similar. It gets the first character index of the deleted line, setup the selection, now in the whole line length and performs the EM_REPLACESEL message with the empty string. But it also changes the selection position of course. And that’s the problem, because we are now going back to the last line of the TRichEdit.Lines.Insert function.
3. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Now the last thing of a previous call of the TRichEdit.Lines.Insert function remains to be done, the evil check based just on the selection position. And since the position has been changed by the meantime deletion, it doesn’t match to the expected result and you are getting the error message.
Also, before someone fix this issue, don’t use even this, it will cause the same error:
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.Lines.Add('1');
end;
procedure TForm1.RichEdit1Change(Sender: TObject);
begin
RichEdit1.SelStart := 0;
end;
If you didn’t fell asleep from this boring story, then I can suggest you just to avoid the manipulation with the lines in OnChange event as much as you can (better to say, only when you know what can happen).
Содержание
- Почему я получаю сообщение об ошибке вставки строки RichEdit при вызове Delete в событии OnChange?
- 1 ответы
- Delphi richedit line insertion error
- Why am I getting RichEdit line insertion error when I call Delete in OnChange event?
- 1 Answer 1
- What could cause a «richedit line insertion error» in C++Builder when inserting text in a different language?
- 2 Answers 2
- Related
- Hot Network Questions
- Subscribe to RSS
- Почему я получаю ошибку вставки строки RichEdit при вызове события Delete в OnChange?
- 1 ответ
Почему я получаю сообщение об ошибке вставки строки RichEdit при вызове Delete в событии OnChange?
Я гуглил и проверял много мест в поисках решения, но все случаи, которые я нашел, отличались или включали что-то более сложное, чем простое добавление или удаление строк. По сути, я хочу сделать своего рода богатое редактирование с прокруткой (альтернативой было бы перемещение каретки вниз, для чего я уже нашел решение).
Я добавляю к нему строки и проверяю Lines.Count с OnChange событие богатого редактирования, и как только оно достигает значения больше 15, я хочу позвонить Lines.Delete(0) , однако я получаю сообщение об ошибке:
Может кто-нибудь сказать мне, что я делаю неправильно здесь?
задан 06 мая ’12, 23:05
Ошибка, которую вы получаете, это RichEdit line insertion error , что вы можете упомянуть в своем вопросе. Я попытаюсь понять, почему, но вы можете просто удалить строку, прежде чем вставлять новую. — TLama
Когда вы набираете слова «ошибка», самое следующее вы должны печатать это точный ошибка, которую вы получаете, с полным сообщением об ошибке. — Ken White
@KenWhite, как сказал TLama, это уже точная ошибка, если только это не предоставит вам дополнительную информацию: First chance exception at $7505b9bc. Exception class EOutOfResources with message ‘RichEdit line insertion error’. — Raith
1 ответы
Вы получаете RichEdit line insertion error из-за проверки, добавленной в версию Delphi 2009. Эта проверка проверяет, была ли вставка новой строки успешной, и эта проверка использует для этого выбранную позицию. К сожалению, для следующего фрагмента кода:
Рабочий процесс выглядит так:
1. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Получите позицию первого символа для строки, в которую будет вставлена строка, добавьте разрыв строки к этой строке, настройте выделение (длина 0, начиная с начала строки) и вставьте строку, выполнив сообщение EM_REPLACESEL, что, кроме текста вставки, изменяет также позицию выделения. Упомянутая выше проверка еще не была выполнена, а тем временем вставка текста вызывает срабатывание события OnChange, где вызывается TRichEdit.Lines.Delete.
2. — TRichEdit.Lines.Delete
Удалить делает что-то подобное. Он получает индекс первого символа удаленной строки, устанавливает выделение, теперь уже по всей длине строки, и выполняет сообщение EM_REPLACESEL с пустой строкой. Но это также, конечно, меняет положение выбора. И в этом проблема, потому что сейчас мы возвращаемся к последней строке функции TRichEdit.Lines.Insert.
3. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Теперь остается сделать последнюю вещь предыдущего вызова функции TRichEdit.Lines.Insert, проверку на зло, основанную только на позиции выбора. И поскольку позиция была изменена при удалении, она не соответствует ожидаемому результату, и вы получаете сообщение об ошибке.
Кроме того, прежде чем кто-то исправит эту проблему, не используйте даже это, это вызовет ту же ошибку:
Если вы не уснули от этой скучной истории, то могу посоветовать вам просто максимально избегать манипуляций со строками в событии OnChange (лучше сказать, только тогда, когда вы знаете, что может произойти).
Источник
Delphi richedit line insertion error
Like others here I also am having trouble with generating the reports in CSV and I get the RichEdit line insertion error. I am using Win 98 se.. Seems like this problem happens with certain versions of riched32.dll and the problem can be avoided in the programs code. Here is an excerpt from a search I did on google about the RichEdit line insertion error.
=================================================
In article , Brendon Weir wrote:
> I am having a similar problem with Delphi 3.01 and TRichEdit under Win98SE.
> In my code I use «RichEdit.Lines.Add» to add text to the richedit and get
> the same «RichEdit line insertion error», and it still occurs even if i set
> MaxLength to a really high number like 30, 000,000 right before adding
> the strings.
This is a bug (or a feature ) in some versions of the rich edit DLL, which
upends some code in the VCL wrapper class. You can work around it by not using
LInes.Add. Instead use this:
with richedit1 do begin
selstart := gettextlen;
seltext := linetoadd+#13#10
end;
If you add a great number of lines in one loop you can move the selstart :=
gettextlen line outside the loop, since each assignment to seltext will make
the caret end up after the inserted text.
Peter Below (TeamB) 100113.1101@compuserve.com)
No e-mail responses, please, unless explicitly requested!
Note: I’m unable to visit the newsgroups every day at the moment,
so be patient if you don’t get a reply immediately.
[ 06-03-2002, 03:45 AM: Message edited by: Night2000 ]
Источник
Why am I getting RichEdit line insertion error when I call Delete in OnChange event?
I’ve googled and checked many places for a solution, but all cases I found differed or involved something more advanced than simply adding or deleting lines. Basically, I want to make a sort of scrolling rich edit (alternative would be moving the caret to the bottom, which I already found a solution for).
I’m adding lines to it and checking Lines.Count with the OnChange event of the rich edit and as soon as it reaches value greater 15 I want to call Lines.Delete(0) , however I get the error:
Can someone tell me what am I doing wrong here ?
1 Answer 1
You are getting the RichEdit line insertion error because of check added to the Delphi 2009 version. This check verifies if the insertion of a new line has been successful and this check uses for it the selection position. Unfortunately, for the following piece of code:
The workflow looks like this:
1. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Get the position of the first char for the line where the string will be inserted, add the linebreak to that string, setup the selection (0 length, starting at the line beginning) and insert the string by performing EM_REPLACESEL message, what except the text insertion, changes also the selection position. The check mentioned above has not been performed yet, and in the meantime that text insertion causes the OnChange event to fire, where the TRichEdit.Lines.Delete is called.
2. — TRichEdit.Lines.Delete
Delete does something similar. It gets the first character index of the deleted line, setup the selection, now in the whole line length and performs the EM_REPLACESEL message with the empty string. But it also changes the selection position of course. And that’s the problem, because we are now going back to the last line of the TRichEdit.Lines.Insert function.
3. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Now the last thing of a previous call of the TRichEdit.Lines.Insert function remains to be done, the evil check based just on the selection position. And since the position has been changed by the meantime deletion, it doesn’t match to the expected result and you are getting the error message.
Also, before someone fix this issue, don’t use even this, it will cause the same error:
If you didn’t fell asleep from this boring story, then I can suggest you just to avoid the manipulation with the lines in OnChange event as much as you can (better to say, only when you know what can happen).
Источник
What could cause a «richedit line insertion error» in C++Builder when inserting text in a different language?
I have a C++Builder application using a TRichText control that has to display a report, running under Windows XP. The application was written in English but has been adapted to use other languages. Creating text on the TRichEdit (using the RichEdit->Lines->Add() function) is no problem as long as I am using Western languages. When I’m trying to add Russian (Cyrillic) text however the application throws an EOutOfResources exception with the «RichEdit line insertion error». Now this exception is usually thrown when the amount of text exceeds the RichEdit internal buffer (64KB) but that is certainly not the case and even adding one character fails.
It is not a unicode application so I have to switch codepages to see the application in Cyrillic.And then I can see all other texts (like menus and labels) are displayed correct.
So what else could cause this error ?
2 Answers 2
RTF expects anything outside of 7-bit ASCII to be escape sequences. See this page for more details on the escape sequences. I think the section that details control page encoding would be most useful for you.
Research shows it’s a problem that only occurs on Windows XP. Also the error does not occur when the Windows XP has the locale settings for the specific language. The problem seems to be in the RichEd32.dll that is supplied with this version of Windows. The VCL (Visual Component Library as used by C++Builder and Delphi) fails when the first character of a line of text that is added to the TRichText control is an escaped character. The solution is to use the following code to add a line:
This actually has to be done only once. After text was added to any RichEdit control in the application, all subsequent calls to ‘Lines->Add()’ will work without throwing the exception.
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.1.14.43159
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
Почему я получаю ошибку вставки строки RichEdit при вызове события Delete в OnChange?
Я искал в Google и проверил много мест для решения, но все случаи, которые я обнаружил, отличались или включали что-то более продвинутое, чем простое добавление или удаление строк. По сути, я хочу сделать своего рода прокрутку с расширенным редактированием (альтернативой было бы перемещение курсора вниз, для чего я уже нашел решение).
Я добавляю к нему строки и проверяю Lines.Count с помощью события OnChange расширенного редактирования, и как только оно достигает значения больше 15, я хочу вызвать Lines.Delete(0) , однако получаю сообщение об ошибке :
Может кто-нибудь сказать мне, что я здесь делаю не так?
1 ответ
Вы получаете RichEdit line insertion error из-за проверки, добавленной в версию Delphi 2009. Эта проверка проверяет, была ли вставка новой строки успешной, и эта проверка использует для этого позицию выбора. К сожалению, для следующего фрагмента кода:
Рабочий процесс выглядит так:
1. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Получите позицию первого символа для строки, в которую будет вставлена строка, добавьте разрыв строки к этой строке, установите выделение (длина 0, начиная с начала строки) и вставьте строку, выполнив сообщение EM_REPLACESEL, кроме текста вставка, также изменяет позицию выделения. Упомянутая выше проверка еще не была выполнена, и тем временем вставка текста вызывает событие OnChange, в котором вызывается TRichEdit.Lines.Delete.
2. — TRichEdit.Lines.Delete
Удаление делает нечто подобное. Он получает индекс первого символа удаленной строки, устанавливает выбор теперь по всей длине строки и выполняет сообщение EM_REPLACESEL с пустой строкой. Но, конечно, это также меняет позицию выбора. И в этом проблема, потому что теперь мы возвращаемся к последней строке функции TRichEdit.Lines.Insert.
3. — TRichEdit.Lines.Add → TRichEdit.Lines.Insert
Осталось выполнить последнее из предыдущего вызова функции TRichEdit.Lines.Insert, злонамеренная проверка, основанная только на позиции выбора. И так как позиция была изменена за время удаления, она не соответствует ожидаемому результату, и вы получаете сообщение об ошибке.
Кроме того, прежде чем кто-то исправит эту проблему, не используйте даже это, это вызовет ту же ошибку:
Если вы не заснули от этой скучной истории, то я могу посоветовать вам просто по возможности избегать манипуляций со строками в событии OnChange (лучше сказать, только когда вы знаете, что может случиться).
Источник
FROSYA_26 0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
||||
1 |
||||
Delphi 6-7 28.12.2022, 11:46. Показов 832. Ответов 21 Метки нет (Все метки)
Всем добрый день.В результате работы кода возникает ошибка «RichEdit line insertion error».Задача программы открывать файлы в формате cpp866 сразу перекодировать в windows 1251 и выводить информацию в RichEdit постранично.Само перекодирование работает,но с выводом есть проблемы. Буду благодарен любой помощи,прикладываю код.
__________________
0 |
Модератор 8254 / 5477 / 2248 Регистрация: 21.01.2014 Сообщений: 23,578 Записей в блоге: 3 |
|
28.12.2022, 12:26 |
2 |
Что такое TXTS? Если публикуете какие-то обрывки своего кода — озаботьтесь хотя бы, чтобы описания переменных присутствовали.
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 12:53 [ТС] |
3 |
Извините пожалуйста,сразу как-то и не подумал. TXT // имя файла с текстом
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 14:04 |
4 |
TXT // имя файла с текстом
TXT := TStringList.Create; Серьёзно? Давайте весь проект, или не ждите внятной помощи.
0 |
FROSYA_26 0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
||||
28.12.2022, 14:54 [ТС] |
5 |
|||
Простите меня ещё раз пожалуйста,виноват что сразу все не скинул.
0 |
AzAtom Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
||||||||
28.12.2022, 15:44 |
6 |
|||||||
Я программу не запускал, но вопрос по алгоритму появился:
Если даже в каждой строке по 1 символу, то так не выйдет, так как, ещё есть символы конца строки. Добавлено через 11 минут
А переменную TXTS можно вообще убрать.
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 15:56 [ТС] |
7 |
Большое спасибо AzAtom убрал лишнюю переменную так сказать,это действительно логично.
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 16:19 |
8 |
FROSYA_26, ещё желательно StringList (TXT) создавать только 1 раз, а то сейчас утечка памяти получается.
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 16:34 [ТС] |
9 |
Большое спасибо за совет,сейчас поправлю.А относительно получаемой ошибки у Вас случайно нет идей в чем она может быть? Просто у меня появилась мысль что может ошибка связанна с длиной строки по которым идёт разделение по страницам? Просто отдельно в коде и перекодирование и разделение по страницам работает,а вот в месте пока никак
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 16:48 |
10 |
А относительно получаемой ошибки у Вас случайно нет идей в чем она может быть? Это происходит потому, что при Page = 1 значение LinesOfPage * (Page — 1) равно 0, и получается пытаешься взять символ №0 из строки, TXTS[0], тут и получается ошибка.
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 16:55 [ТС] |
11 |
Получается что у перекодированной строки нет первого символа в строке? Просто с обычным тхт файлом если не использовать перекодирование то все работает,а ошибка именно в разделении перекодированных файлов.Хммм
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 17:02 |
12 |
Получается что у перекодированной строки нет первого символа в строке? Нет, это потому, что в строках (string) первый символ имеет номер 1, в отличие от остальных массивов, списков и т.д.
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 18:29 [ТС] |
13 |
Так у меня же тоже после перекодирования получаются строки.Такие же как и в обычном файле просто в кодировке другой.Или я что-то не понимаю? Добавлено через 5 минут
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 19:00 |
14 |
FROSYA_26, в первом варианте все эти строки укладывались в одну строковую переменную TXTS, вот в ней первый символ имеет индекс 1. А по замыслу нужно не отдельные символы выбирать, а целиком строки, как в исправленном варианте.
0 |
FROSYA_26 0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
||||
28.12.2022, 19:35 [ТС] |
15 |
|||
Я вроде бы понял и исправил код как Вы советовали мне,но результат тот же и ошибка та же.
0 |
AzAtom Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
||||||
28.12.2022, 19:46 |
16 |
|||||
Решение
результат тот же и ошибка та же У меня работает.
Вложения
1 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 20:02 [ТС] |
17 |
Спасибо за помощь,оно вроде как работает.Один файл я смог открыть и он нормально разбивает,но остальные почему-то даже не открываются с такой же ошибкой.Как вы думаете это может быть из-за длины строки? Миниатюры
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
28.12.2022, 21:09 |
18 |
но остальные почему-то даже не открываются Где файл, чтобы попробовать?
0 |
0 / 0 / 0 Регистрация: 22.02.2015 Сообщений: 56 |
|
28.12.2022, 21:21 [ТС] |
19 |
Извините,что сразу не скинул
0 |
Модератор 3199 / 1813 / 664 Регистрация: 15.11.2015 Сообщений: 7,259 |
|
29.12.2022, 01:44 |
20 |
FROSYA_26, здесь RTF документ и кодировка CP1251. Нужно расширение сменить на .RTF и откроется в том же word-е, только страницу сделать альбомной надо.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
29.12.2022, 01:44 |
Помогаю со студенческими работами здесь Ошибка There was an error parsing the query. [ Token line number = 1,Token line offset = 43,Token in error = записи ] using System;
Ошибка Parse error: syntax error, unexpected ‘[‘ in W:domainshospitalCateringSys-masterindex.php on line 69 ошибка в коде Parse error: syntax error, unexpected ‘{‘ in E:OpenServerdomainstest.ruindex.php on line 17 Ошибка Parse error: syntax error, unexpected T_STRING in /home/bh22299/public_html/wp-config.php on line 25 Вот участок кода из файла конфига…….
static $a = Я новичок в этом деле. Голову сломал с этой ошибкой…. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
«RichEdit line insertion error» possible cause and program solution.
Like others here I also am having trouble with generating the reports in CSV and I get the RichEdit line insertion error. I am using Win 98 se.. Seems like this problem happens with certain versions of riched32.dll and the problem can be avoided in the programs code. Here is an excerpt from a search I did on google about the RichEdit line insertion error.
=================================================
In article <3b3db741_2@dnews>, Brendon Weir wrote:
> I am having a similar problem with Delphi 3.01 and TRichEdit under Win98SE.
> In my code I use «RichEdit.Lines.Add» to add text to the richedit and get
> the same «RichEdit line insertion error», and it still occurs even if i set
> MaxLength to a really high number like 30, 000,000 right before adding
> the strings.
This is a bug (or a feature <g>) in some versions of the rich edit DLL, which
upends some code in the VCL wrapper class. You can work around it by not using
LInes.Add. Instead use this:
with richedit1 do begin
selstart := gettextlen;
seltext := linetoadd+#13#10
end;
If you add a great number of lines in one loop you can move the selstart :=
gettextlen line outside the loop, since each assignment to seltext will make
the caret end up after the inserted text.
Peter Below (TeamB) 100113.1101@compuserve.com)
No e-mail responses, please, unless explicitly requested!
Note: I’m unable to visit the newsgroups every day at the moment,
so be patient if you don’t get a reply immediately.
<small>[ 06-03-2002, 03:45 AM: Message edited by: Night2000 ]</small>
Форум программистов Vingrad
Модераторы: Snowy, MetalFan, bems, Poseidon |
Поиск: |
|
Опции темы |
Volkogriz |
|
||||
Бывалый Профиль Репутация: нет
|
Доброе время суток!
Что не так?
Зарание благодарен! ——————— («`-»-/»).___..—»»`-._`6_6 ) ,,,`-. ( »’ ).` «_-.__.’)(_Y_.)’ ._»’ ) `._ `. «-.__’.-‘_..`—‘_..-_/»’/—‘_.’ ,'(il).-»»'(li).’ ((!.-‘ |
||||
|
|||||
Volkogriz |
|
||
Бывалый Профиль Репутация: нет
|
Кто нить подскажет, хотябы намекните чтоб понять гте капать. ——————— («`-»-/»).___..—»»`-._`6_6 ) ,,,`-. ( »’ ).` «_-.__.’)(_Y_.)’ ._»’ ) `._ `. «-.__’.-‘_..`—‘_..-_/»’/—‘_.’ ,'(il).-»»'(li).’ ((!.-‘ |
||
|
|||
Volkogriz |
|
||
Бывалый Профиль Репутация: нет
|
Всем спасибо разабрался спустя ночь)))
——————— («`-»-/»).___..—»»`-._`6_6 ) ,,,`-. ( »’ ).` «_-.__.’)(_Y_.)’ ._»’ ) `._ `. «-.__’.-‘_..`—‘_..-_/»’/—‘_.’ ,'(il).-»»'(li).’ ((!.-‘ |
||
|
|||
Gwire |
|
||
Бывалый Профиль
Репутация: 1
|
Может вот так было бы проще?
|
||
|
|||
|
Правила форума «Delphi: Для новичков» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |