Вверх ↑
Ответов: 1925
Рейтинг: 172
#1: 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