Вверх ↑
Этот топик читают: Гость
Ответов: 5227
Рейтинг: 587
#16: 2020-07-22 16:41:17 ЛС | профиль | цитата
Нашли чему удивятся. Вся поддержка и развитие HiAsm в данный момент зависит от "добавлятеля" (чего-то там. т.е от человека с медалькой) Чего только стоит сырбор когда просто попросил в батон добавить верхнюю точку Data/ (ну ведь дебилизм полный прыгать из вкладки интерфейс во вкладку инструменты и наращивать этим ебонуд... свои схемы) Второй типа начальник транспортного цеха решил в листах точки doSave, doLoad зазвездить (когда допустим я предлагал это сделать [х.. знает сколько лет назад зазвездили меня в обратном смысле этого слова) и т.д и т.п Короче куда ни плюнь от меня все как от КОИ-19 шарахаются
Так что flint2, тут просто дело принципа (а принцип простой непрофессиональный, личная неприязнь, потому что я фиги в кармане не ношу а говорю прямо)
Вот поэтому мои компоненты в купи-продай (зае.... всё), на поклонную ко всяким добавлятелям чего либо не пойду Вот такой HiAsm ваш молчаливые пользователи.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1535
Рейтинг: 176
#17: 2022-02-10 07:30:08 ЛС | профиль | цитата
Суть моей проблемы не в максимальном количестве текста, но, видимо, это те же ворота.
В примере ниже, если добавить, скажем, пять строк, то значения длины строк при переборе будет ОГРАНИЧЕНА ПЕРВОЙ СТРОКОЙ. Добавляйте с клавиатуры ЛЮБОЙ символ в первую строку, и все остальные строки будут так же увеличивать свои значения ОТНОСИТЕЛЬНО ПЕРВОЙ СТРОКИ.
ПРИМЕР С ОШИБКОЙ

Add(MainForm,8593311,77,84)
{
Width=898
Height=551
Caption="Пример проблемы с кириллицей"
}
Add(RichEdit,5282393,336,147)
{
Left=5
Top=35
Width=805
Height=235
ScrollBars=3
link(onChange,8783507:doEvent1,[(380,153)(380,189)(303,189)(303,209)])
link(Str,1491810:Var2,[])
}
Add(ArrayEnum,15274287,350,217)
{
link(onItem,14757344:doEvent1,[])
link(Array,5282393:Array,[])
}
Add(Memo,14842045,518,217)
{
Left=815
Top=35
Width=60
Height=235
ScrollBars=2
}
Add(Hub,8783507,315,203)
{
OutCount=3
link(onEvent1,14842045:doClear,[(507,209)(507,230)])
link(onEvent2,1603189:doClear,[(495,216)(495,279)])
link(onEvent3,15274287:doEnum,[])
}
Add(Length,13614396,441,217)
{
link(onLength,14842045:doAdd,[])
}
Add(For,1394810,217,84)
{
End=20
InData=0
link(onEvent,8796751:doData,[])
link(onStop,5282393:doAdd,[(272,97)(272,153)])
}
Add(StrCat,2411114,343,84)
{
Point(doClear)
link(Str1,1491810:Var1,[(349,72)(337,72)(337,128)])
}
Add(GetDataEx,1491810,336,123)
{
Angle=1
link(Data,2411114:Result,[(349,128)])
}
Add(DoData,8796751,287,84)
{
Data=String(S)
link(onEventData,2411114:doStrCat,[])
}
Add(Button,9755395,154,84)
{
Left=5
Top=10
Width=375
Caption="Добавить строку"
link(onClick,1394810:doFor,[])
}
Add(Memo,1603189,518,266)
{
Left=5
Top=275
Width=810
Height=235
ScrollBars=3
}
Add(Hub,14757344,392,217)
{
link(onEvent1,13614396:doLength,[])
link(onEvent2,1603189:doAdd,[(417,230)(417,272)])
}


Как это исправить? Может, где-то уже обсуждалось, укажите.

Редактировалось 4 раз(а), последний 2022-02-10 20:07:58
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 2059
Рейтинг: 132
#18: 2022-02-10 10:12:42 ЛС | профиль | цитата
ser_davkin, у меня работает, как и должно работать по схеме.
Сначала строки увеличиваются на 21. Потому что
Add(RichEdit,5282393,525,133)
{
Left=5
Top=35
Width=805
Height=235
ScrollBars=3
link(Str,1491810:Var2,[])
}
Add(StrCat,2411114,532,70)
{
Point(doClear)
link(Str1,1491810:Var1,[(538,58)(526,58)(526,114)])
}
Add(GetDataEx,1491810,525,109)
{
Angle=1
link(Data,2411114:Result,[(538,114)])
}
Add(DoData,8796751,476,70)
{
Data=String(S)
link(onEventData,2411114:doStrCat,[])
}



Потом печатаю "qwerty"

Если опять добавлять строки, то они будут увеличиваться опять на 21.
Вроде всё работает.
с кириллицей

Add(MainForm,8593311,112,147)
{
Width=898
Height=551
Caption="Пример проблемы с кириллицей"
}
Add(RichEdit,5282393,371,210)
{
Left=5
Top=35
Width=805
Height=235
ScrollBars=3
link(onChange,8783507:doEvent1,[(415,216)(415,252)(338,252)(338,272)])
link(Str,1491810:Var2,[])
}
Add(Memo,14842045,553,280)
{
Left=815
Top=35
Width=60
Height=235
ScrollBars=2
}
Add(Hub,8783507,350,266)
{
OutCount=3
link(onEvent1,14842045:doClear,[(542,272)(542,293)])
link(onEvent2,1603189:doClear,[(530,279)(530,342)])
link(onEvent3,9627760:doEnum,[(376,286)(376,352)(331,352)(331,419)])
}
Add(Length,13614396,476,280)
{
link(onLength,14842045:doAdd,[])
}
Add(For,1394810,252,147)
{
End=20
InData=0
link(onEvent,8796751:doData,[])
link(onStop,5282393:doAdd,[(307,160)(307,216)])
}
Add(StrCat,2411114,378,147)
{
Point(doClear)
link(Str1,1491810:Var1,[(384,135)(372,135)(372,191)])
}
Add(GetDataEx,1491810,371,186)
{
Angle=1
link(Data,2411114:Result,[(384,191)])
}
Add(DoData,8796751,322,147)
{
Data=String(S)
link(onEventData,2411114:doStrCat,[])
}
Add(Button,9755395,189,147)
{
Left=5
Top=10
Width=375
Caption="Добавить строку"
link(onClick,1394810:doFor,[])
}
Add(Memo,1603189,553,329)
{
Left=5
Top=275
Width=810
Height=235
ScrollBars=3
}
Add(Hub,14757344,427,280)
{
link(onEvent1,13614396:doLength,[])
link(onEvent2,1603189:doAdd,[(452,293)(452,335)])
}
Add(Str_Enum,9627760,343,413)
{
Delimiter="\r"
link(onEnum,3584474:doReplace,[])
link(String,5282393:Text,[(349,327)(377,327)])
}
Add(Replace,3584474,413,413)
{
SubStr="\n"
link(onReplace,14757344:doEvent1,[(457,419)(457,353)(415,353)(415,286)])
}


Редактировалось 5 раз(а), последний 2022-02-10 12:26:17
карма: 6

0
Ответов: 207
Рейтинг: 14
#19: 2022-02-10 14:14:16 ЛС | профиль | цитата
ser_davkin писал(а):
В примере ниже, если добить, скажем, пять строк, то значения длины строк при переборе будет ОГРАНИЧЕНА ПЕРВОЙ СТРОКОЙ. Добавляйте с клавиатуры ЛЮБОЙ символ в первую строку, и все остальные строки будут так же увеличивать свои значения ОТНОСИТЕЛЬНО ПЕРВОЙ СТРОКИ.

Подтверждаю, проблема появилась в ревизии SVN 2356, после добавления "fix: Get Array Correction"
карма: 2

0
Ответов: 1535
Рейтинг: 176
#20: 2022-02-10 19:02:18 ЛС | профиль | цитата
flint2, меня не интересует длины строк, а то, что первая строка ограничивает длины других, оттого возникают "бракозябры". Ладно, так, проходил мимо.

Редактировалось 1 раз(а), последний 2022-02-10 19:08:05
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#21: 2022-02-10 19:11:14 ЛС | профиль | цитата
Joiner писал(а):
Подтверждаю, проблема появилась в ревизии SVN 2356, после добавления "fix: Get Array Correction"

Да там вообще бардак происходит. Добавляем чуть ли не удвоенную строку, а на выходе получаем почти в два раза меньше. Начинаешь добавлять символы -- внизу видим, что все растут до своих исходных длин в основном окне.
Но это к Netspirit-у, это он правил метод массива _Get. Все последние правки делал не я, я только добавлял уже готовые от наших уважаемых пользователей -- 3042, Netspirit, andrestudio, flint2

Редактировалось 2 раз(а), последний 2022-02-10 19:17:16
карма: 22

0
Ответов: 2059
Рейтинг: 132
#22: 2022-02-10 19:23:32 ЛС | профиль | цитата
ser_davkin писал(а):
что первая строка ограничивает длины других, оттого возникают "бракозябры".

Не надо путать мягкое с тёплым!
"бракозябры" - это неправильное отображение кириллицы.
Пример, как надо, я выше привёл.
Вот https://forum.hiasm.com/getfile/39389 ставь и все дела.

Редактировалось 1 раз(а), последний 2022-02-10 19:30:03
карма: 6

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#23: 2022-02-10 19:39:47 ЛС | профиль | цитата
flint2 писал(а):
Вот https://forum.hiasm.com/getfile/39389 ставь и все дела.

Да, но у тебя отключен метод _Get от Netspirit-a, которая как раз была связана с кракозябрами. И здесь что-то не то. У тебя в примере не используется массив, а интересен именно он. ser_davkin, прав -- это баг чтения массива. Надо, все же, что бы Netspirit посмотрел.

Редактировалось 2 раз(а), последний 2022-02-10 19:45:36
карма: 22

0
Ответов: 2059
Рейтинг: 132
#24: 2022-02-10 19:48:57 ЛС | профиль | цитата
Я понимаю,что это баг чтения массива.
Вот по этому я и выложил компонент без метода _Get от Netspirit-a.
А кракозябы даже с моим компонентом будут, если брать строки в кириллице через ArrayEnum и по моему ArrayRW(но про ArrayRW это не точно) . Они всегда были. Я предложил другое схемное решение.
так понял, что речь шла о:
ser_davkin писал(а):

то значения длины строк при переборе будет ОГРАНИЧЕНА ПЕРВОЙ СТРОКОЙ.
А про кириллицу ни слова. Это я уж потом увидел проблему.
Мы обсуждаем две ошибки.

Редактировалось 7 раз(а), последний 2022-02-10 20:05:11
карма: 6

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#25: 2022-02-10 20:10:47 ЛС | профиль | цитата
flint2 писал(а):
Они всегда были

Вот тут -- https://forum.hiasm.com/topic/67772, эту проблему попытались решить, и вроде что-то получилось. Но, видимо, не до конца. И интересен был именно баг, а не решение вопроса.Правильно тут отметили:
Joiner писал(а):
проблема появилась в ревизии SVN 2356, после добавления "fix: Get Array Correction"
Это я добавил последний код из той темы.
Решение, решением, а баг надо исправлять.

Редактировалось 2 раз(а), последний 2022-02-10 20:12:18
карма: 22

0
Ответов: 2059
Рейтинг: 132
#26: 2022-02-10 20:25:38 ЛС | профиль | цитата
nesco, ну, я, по простоте душевной, думал, что ser_davkin чего то ваяет и решил наложить пластырь на пробоину.
Решение, решением, а баг надо исправлять.
Ясное дело, что с пробоиной кораблю надо идти в док.
карма: 6

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#27: 2022-02-11 00:06:27 ЛС | профиль | цитата
Короче, Netspirit не до конца дочитал MSDN и поторопился с выводами. Правильное определение длины строки по индексу должно выглядеть вот так:

function THIRichEdit._Get(var Item: TData; var Val: TData): Boolean;
var
Ind, aInd, L: Integer;
Text: string;
begin
Ind := ToIntIndex(Item);
Result := (Ind >= 0) and (Ind < Control.Count);

if Result then
begin
aInd := Control.Perform(EM_LINEINDEX, Ind, 0); // Определить абсолютный номер начального символа в нужной строке
L := Control.Perform(EM_LINELENGTH, aInd, 0); // Посчитать длину строки от начального символа до конца строки
if L > 0 then
begin
Inc(L, 2); // Размер буфера с запасом SizeOf(Word) (иначе не работает)
SetLength(Text, L);
PWord(Pointer(Text))^ := L; // В первом Word буфера - размер буфера
L := Control.Perform(EM_GETLINE, Ind, Longint(Pointer(Text)));
if (L <> 0) and (Text[L] = #13) then Dec(L); // Выдаёт также символ #13 в конце
if (L <> Length(Text)) then SetLength(Text, L); // В L - действительная длина строки (обычно меньше выделенного размера)
end
else
Text := '';

dtString(Val, Text);
end;
end;
Те, сначала определяется абсолютный номер первого символа в нужной строке, а затем уже определяется длина строки, которая отсчитывается от этого символа до перевода строки.
Может у Netspirit-a и есть уже исправленная версия, но я ее не видел.

--- Добавлено в 2022-02-11 00:15:40

Исправления на SVN.

Редактировалось 5 раз(а), последний 2022-02-11 05:47:44
карма: 22

0
Ответов: 19
Рейтинг: 7
#28: 2022-02-11 01:25:16 ЛС | профиль | цитата
nesco, Ошибка
2022-02-11_03-17-40.png
карма: 0

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#29: 2022-02-11 02:28:29 ЛС | профиль | цитата
Buns писал(а):
Ошибка

Помимо компонента RichEdit, надо обновить с SVN еще и модуль WinList.pas. Он был выложен одновременно с этим компонентом в ревизии 2356 от 31-12-2021
карма: 22

0
Ответов: 19
Рейтинг: 7
#30: 2022-02-11 02:54:35 ЛС | профиль | цитата
nesco, Спасибо всё работает.
карма: 0

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