Вверх ↑
Этот топик читают: Гость
Ответов: 70
Рейтинг: 1
#1: 2020-08-30 15:43:48 ЛС | профиль | цитата
Доброго времени.После перебора текста ArrayEnum из RichEdit Выходят кракозябры, Ка лечить ?

Без названия.png

Add(MainForm,2953706,476,399)
{
Width=792
Height=380
link(onActivate,6627302:doEvent1,[])
}
Add(RichEdit,7915306,748,189)
{
Left=30
Top=40
Width=330
Height=100
Strings=#5:Текст|
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
Point(doSetSelect)
Point(PHandle)
}
Add(Edit,12740447,1057,287)
{
Left=30
Top=145
Width=330
Height=30
Font=[MS Sans Serif,12,1,0,1]
}
Add(RichEdit,16223376,916,287)
{
Left=30
Top=180
Width=330
Height=105
AddType=1
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
link(onChange,12441107:doEvent1,[])
link(Str,11438320:Item,[(922,275)(846,275)(846,331)(769,331)])
}
Add(ArrayEnum,11438320,763,287)
{
link(onItem,16223376:doAdd,[])
link(Array,7915306:Array,[(769,261)(768,261)])
}
Add(Hub,12441107,987,287)
{
link(onEvent1,12740447:doText,[])
link(onEvent2,11438320:doStop,[(1009,300)(1009,358)(751,358)(751,300)])
}
Add(Hub,6627302,623,399)
{
link(onEvent1,11438320:doEnum,[(700,405)(700,293)])
link(onEvent2,12370788:doEnum,[(697,412)(697,522)])
}
Add(Edit,14500320,1050,516)
{
Left=400
Top=145
Width=330
Height=30
Font=[MS Sans Serif,12,1,0,1]
}
Add(RichEdit,9833928,909,516)
{
Left=400
Top=180
Width=330
Height=105
AddType=1
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
link(onChange,12992977:doEvent1,[])
link(Str,12370788:Item,[(915,504)(839,504)(839,560)(762,560)])
}
Add(ArrayEnum,12370788,756,516)
{
link(onItem,9833928:doAdd,[])
link(Array,7931368:Array,[])
}
Add(Hub,12992977,980,516)
{
link(onEvent1,14500320:doText,[])
link(onEvent2,12370788:doStop,[(1001,529)(1001,586)(744,586)(744,529)])
}
Add(Memo,7931368,742,411)
{
Left=400
Top=40
Width=330
Height=100
Strings=#5:Текст|
}


Редактировалось 2 раз(а), последний 2020-08-30 15:55:26
карма: 1

0
Ответов: 1926
Рейтинг: 172
#2: 2020-08-30 16:58:14 ЛС | профиль | цитата
Костыль:

Add(RichEdit,7915306,294,126)
{
Left=30
Top=40
Width=330
Height=100
Strings=#5:Текст|
Point(onMouseUp)
Point(onKeyUp)
Point(FileName)
Point(onDblClick)
Point(doSetSelect)
Point(PHandle)
}
Add(ArrayEnum,11438320,399,273)
{
link(onItem,11658717:doMessage,[])
link(Array,5206907:Array,[])
}
Add(Button,8347562,231,210)
{
Left=390
Top=300
link(onClick,7330536:doData,[])
}
Add(Message,11658717,455,273)
{
}
Add(StrList,5206907,385,189)
{
}
Add(DoData,7330536,294,210)
{
link(onEventData,14311056:doEvent1,[])
link(Data,7915306:Text,[])
}
Add(Hub,14311056,343,210)
{
link(onEvent1,5206907:doText,[])
link(onEvent2,11438320:doEnum,[(378,223)(378,279)])
}
карма: 9
0
Ответов: 70
Рейтинг: 1
#3: 2020-08-30 17:30:36 ЛС | профиль | цитата
Костыль конечно хорошо, но вот в чем проблема то зарыта? не переустанавливать винду же из за этой каки. причем кроме как в Хиасм кракозябры не проявляют себя. ( пока не видел )
карма: 1

0
Ответов: 2059
Рейтинг: 132
#4: 2020-08-31 10:40:02 ЛС | профиль | цитата
Pavel,твоя схема.

Add(MainForm,757995,315,308)
{
Width=792
Height=380
link(onActivate,6627302:doEvent1,[])
}
Add(RichEdit,7915306,574,105)
{
Left=30
Top=40
Width=330
Height=100
Strings=#5:Текст|
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
Point(doSetSelect)
Point(PHandle)
}
Add(Edit,12740447,896,196)
{
Left=30
Top=145
Width=330
Height=30
Font=[MS Sans Serif,12,1,0,1]
}
Add(RichEdit,16223376,755,196)
{
Left=30
Top=180
Width=330
Height=105
AddType=1
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
link(onChange,12441107:doEvent1,[])
}
Add(Hub,12441107,826,196)
{
link(onEvent1,12740447:doText,[])
link(onEvent2,7002217:doStop,[(852,209)(852,230)(562,230)(562,251)])
}
Add(Hub,6627302,462,308)
{
link(onEvent1,7002217:doEnum,[(525,314)(525,244)])
link(onEvent2,10134946:doEnum,[(528,321)(528,431)])
}
Add(Edit,14500320,889,425)
{
Left=400
Top=145
Width=330
Height=30
Font=[MS Sans Serif,12,1,0,1]
}
Add(RichEdit,9833928,748,425)
{
Left=400
Top=180
Width=330
Height=105
AddType=1
Point(onMouseUp)
Point(onKeyUp)
Point(doLoad)
Point(doSave)
Point(FileName)
Point(onDblClick)
link(onChange,12992977:doEvent1,[])
}
Add(Hub,12992977,819,425)
{
link(onEvent1,14500320:doText,[])
link(onEvent2,10134946:doStop,[(845,438)(845,411)(569,411)(569,438)])
}
Add(Memo,7931368,581,320)
{
Left=400
Top=40
Width=330
Height=100
Strings=#5:Текст|
}
Add(Str_Enum,7002217,574,238)
{
link(onEnum,16223376:doAdd,[(680,244)(680,202)])
link(String,7915306:Text,[])
}
Add(Str_Enum,10134946,581,425)
{
link(onEnum,9833928:doAdd,[])
link(String,7931368:Text,[])
}

карма: 6

0
Ответов: 1926
Рейтинг: 172
#5: 2020-08-31 11:06:27 ЛС | профиль | цитата
Далее - для людей разбирающихся (надеюсь, они заглянут сюда и прочтут это).
---------------------------------------------------------------------------------------------
Проблема, как всегда, в KOL.
1. Точка Array у RE (RichEdit) описана в WinList.pas, и там ф-ция function THIWinList._Get; получает строку поля через Control.Items[ind].
2. Control.Items в KOL представлен ф-цией чтения function TControl.GetItems(Idx: Integer): String;, к-я использует сообщения EM_LINELENGTH и EM_GETLINE (в KOL соотв. fCommandActions.aGetItemLength и fCommandActions.aGetItemText - это их псевдонимы).
3. Для EM_GETLINE написано:
Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer.

4. Но в TControl.GetItems почему-то указано:

  L := Perform( fCommandActions.aGetItemLength, Pos, 0 )
...
GetMem( Buf, L + 4 );
PWORD( Buf )^ := L + [b]1[/b];
Почему там первое слово установлено в L+1, а не L+4, мне неясно. Если Memo такое терпит и выдаёт строки с массива правильно, то RE - нет.

Вот, попробуйте в IC:

Add(RichEdit,7915306,490,238)
{
Left=30
Top=40
Width=330
Height=100
Strings=#5:Текст|5:абвгд|5:first|
Point(onMouseUp)
Point(onKeyUp)
Point(FileName)
Point(onDblClick)
Point(doSetSelect)
Point(PHandle)
Point(SelText)
}
Add(ArrayEnum,11438320,504,378)
{
link(onItem,11658717:doMessage,[])
link(Array,7915306:Array,[])
}
Add(Button,8347562,455,378)
{
Width=95
Caption="массив REdit"
Data=String(проба)
link(onClick,11438320:doEnum,[])
}
Add(Message,11658717,560,378)
{
}
Add(InlineCode,14926846,406,378)
{
WorkPoints=#1:a|
DataPoints=#1:h|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|16: h:THI_Event;|0:|42: procedure a(var dt:TData; index:word);|0:|5: end;|0:|14:implementation|0:|24:procedure THiAsmClass.a;|15:var c:PControl;|15: Buf: PChar;|14: L:integer;|5:begin|34: c := PControl(ReadInteger(dt,h));|39: L := C.Perform( EM_LINELENGTH, 0, 0 );|13: //_debug(L);|22: GetMem( Buf, L + 4 );|61: PWORD( Buf )^ := L + 4; //В KOL так: PWORD( Buf )^ := L + 1;|44: C.Perform( EM_GETLINE, 0, Integer( Buf ) );|13: _debug(Buf);|17: //_hi_OnEvent();|4:end;|0:|4:end.|
link(h,7915306:PHandle,[(412,330)(517,330)])
}
Add(Button,16775679,357,378)
{
Left=100
Width=95
Caption="PHandle REdit"
Data=String(проба)
link(onClick,14926846:a,[])
}
При установке L+4 всё выдаётся правильно.

Теперь вопрос: что с этим делать? У кого-то новая версия KOL, там есть та же ошибка? Или забить и пользоваться костылём?
карма: 9
0
Ответов: 4628
Рейтинг: 749
#6: 2020-08-31 11:37:56 ЛС | профиль | цитата
3042 писал(а):
Теперь вопрос: что с этим делать?
Я пытался разобраться. Поскольку для всех типов контролов в KOL используется одна и та же функция - невозможно корректно это реализовать. Поскольку для разных контролов Windows методы получения текста отличаются. Более того, они могут отличаться в разных версиях RichEdit. Пришел к выводу: в функции TControl.GetItems() надо проверять тип Self и для RichEdit вызывать один код, для остальных - другой. Но пока не смог реализовать - не нашел признака, по которому можно идентифицировать.
3042 писал(а):
Почему там первое слово установлено в L+1, а не L+4, мне неясно
Там, похоже, есть костыли когда пытались одним и тем же кодом получить текст из разных контролов. Благодаря этому +1 в одном из случаев возвращаемый текст захватывает "половинку" из перевода строки #13#10. А без него - в другом случае, вероятно, не добирает один символ. Кроме того, "не L+4" потому что, возможно, в одном случае оно "с учетом terminating null / перевода строки", а в других без. Потому лишали запас.
3042 писал(а):
У кого-то новая версия KOL, там есть та же ошибка?
Да, причем ещё, вроде, появились отличия в Unicode версии RichEdit (или в другой версии). Кроме Кладова там и в Майкрософт те ещё индусы работают.

Редактировалось 3 раз(а), последний 2020-08-31 11:41:42
карма: 26

0
Ответов: 1926
Рейтинг: 172
#7: 2020-08-31 11:49:51 ЛС | профиль | цитата
Netspirit, можно поискать по KOL-у списки fCommandActions - для разных контролов они разные. Например, тот же aGetItemLength для RE и MEMO представлен EM_LINELENGTH, для других - пустым значением.

--- Добавлено в 2020-08-31 11:53:23

Netspirit писал(а):
не нашел признака, по которому можно идентифицировать.

Как вариант - править в hiRichEdit, пользуясь только winapi, без всяких Control.Items[ind]. Но это надо обмозговать.

Редактировалось 1 раз(а), последний 2020-08-31 11:53:23
карма: 9
0
Ответов: 4628
Рейтинг: 749
#8: 2020-08-31 12:11:49 ЛС | профиль | цитата
3042 писал(а):
списки fCommandActions - для разных контролов они разные
Конкретно, вопрос в fCommandActions.aGetItemText и в fCommandActions.aGetItemLength - они действительно разные, и поведение у них разное, а запихнули в одну функцию.
Например, CB_GETLBTEXT (combobox) не включает null-терминатор, зато LB_GETTEXT (listbox) включает. И ни один не требует указания длины в первом слове буфера, как EM_GETLINE.
3042 писал(а):
Как вариант - править в hiRichEdit, пользуясь только winapi, без всяких Control.Items[ind]
Там могут быть трудности, потому что получение строки реализовано у его класса-предка, общего с остальными нашими контролами - надо думать как перекрыть в hiRichEdit.

Редактировалось 2 раз(а), последний 2020-08-31 12:14:28
карма: 26

0
Ответов: 1926
Рейтинг: 172
#9: 2020-08-31 12:28:39 ЛС | профиль | цитата
Netspirit писал(а):
надо думать как перекрыть в hiRichEdit

Ну, метод _Set с успехом перекрыт в hiRichEdit, а в WinList он - virtual. Думается, с _Get проблем тоже не будет (только, пожалуй, его в WinList тоже стоит сделать virtual). Ну а код для этого метода практически готов - он в моём IC выше.

ps. Вот только я не разобрался, зачем в KOL, в TControl.GetItems ещё и ф-ции Item2Pos и Pos2Item. Вроде индекс строки известен, он передаётся в параметре, зачем такое двойное конвертирование - неясно.
карма: 9
0
Ответов: 4628
Рейтинг: 749
#10: 2020-08-31 15:34:20 ЛС | профиль | цитата
3042 писал(а):
Вроде индекс строки известен
Возможно, существует какой-то контрол, который не имеет понятия "индекс строки" и он вычисляется вручную путем подсчета переводов строки в полном тексте. Возможно, для нестандартных компонентов.
карма: 26

0
Ответов: 2059
Рейтинг: 132
#11: 2020-08-31 20:14:47 ЛС | профиль | цитата
Вы можете сидеть хоть тут до ночи, а плёнка уже кончилася ВСЯ!

Редактировалось 2 раз(а), последний 2020-08-31 20:19:18
карма: 6

0
Ответов: 1926
Рейтинг: 172
#12: 2020-09-01 14:31:02 ЛС | профиль | цитата
Итак, предлагаю следующие правки:
1. В файле WinList.pas заменить сроку function _Get(Var Item:TData; var Val:TData):boolean; на строку function _Get(Var Item:TData; var Val:TData):boolean; virtual;.
2. Файл hiRichEdit.pas заменить на прилагаемый.

Конечно, с обновлением на SVN.

Редактировалось 1 раз(а), последний 2020-09-01 14:31:59
карма: 9
0
файлы: 1hiRichEdit1.rar [2.4KB] [427]
Разработчик
Ответов: 26113
Рейтинг: 2126
#13: 2020-09-01 15:59:21 ЛС | профиль | цитата
3042 писал(а):
Итак, предлагаю следующие правки:

Ввел правки, проверил на первом примере и получил вот это



Кстати, у тебя не обновленный компонент RichEdit, там нет некоторых правок.

Редактировалось 1 раз(а), последний 2020-09-01 16:01:35
карма: 22

0
Ответов: 1926
Рейтинг: 172
#14: 2020-09-01 20:24:53 ЛС | профиль | цитата
М-да, давно не обновлялся
Но у меня всё норм.

Так тоже проблемы:

Add(RichEdit,7915306,490,238)
{
Left=30
Top=40
Width=330
Height=100
Strings=#5:Текст|5:абвгд|5:first|
Point(onMouseUp)
Point(onKeyUp)
Point(FileName)
Point(onDblClick)
Point(PHandle)
Point(SelText)
}
Add(ArrayEnum,11438320,504,378)
{
link(onItem,11658717:doMessage,[])
link(Array,7915306:Array,[])
}
Add(Button,8347562,455,378)
{
Width=95
Caption="массив REdit"
Data=String(проба)
link(onClick,11438320:doEnum,[])
}
Add(Message,11658717,560,378)
{
}
?
--- Добавлено в 2020-09-01 20:33:15

Закинул обновлённый с SVN с моими правками.

Редактировалось 1 раз(а), последний 2020-09-01 20:33:15
карма: 9
0
файлы: 1hiRichEdit2.rar [2.4KB] [433]
Разработчик
Ответов: 26113
Рейтинг: 2126
#15: 2020-09-01 22:37:15 ЛС | профиль | цитата
Почему изменен диапазон символов, с чем это связано?

   while(i > 0)and(p[i] in ['a'..'y','A'..'?','a'..'z','A'..'Z'])do
...
while(i < Length(p))and(p[i] in ['a'..'y','A'..'?','a'..'z','A'..'Z'])do
...
вместо вот этого в оригинальной версии
   while(i > 0)and(p[i] in ['а'..'я','А'..'Я','a'..'z','A'..'Z'])do
...
while(i < Length(p))and(p[i] in ['а'..'я','А'..'Я','a'..'z','A'..'Z'])do
...

Проверил дома на Win10x64 -- работает. А вот на работе, на Win7x64 -- не работает, хотя я добавил в оригинал только твои подписанные правки, а вот диапазоны не менял.

Редактировалось 3 раз(а), последний 2020-09-01 22:48:04
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)