Вверх ↑
Этот топик читают: Unnowny, Гость
Ответов: 10
Рейтинг: 0
#526: 2020-12-08 07:05:06 ЛС | профиль | цитата
Netspirit, логика работы компонента hiArrayFind.pas изменилась в сравнении с основной версией Hiasm. В списке строк вида "Цифры;Какой-то текст" при поиске с частичным совпадением "92521;" теперь находятся строки "10191", "10192" и т.д.
Сравнил версии компонента.
старая (работает как я ожидаю):
77.   if _prop_Partial and (Pos(S1, S2) <> 0) then

новая (находит то, что мне не нужно):
77.   if _prop_Partial and (Pos(S1^, string(S2)) <> 0) then

Если убрать ^ - возвращается старое поведение.
Вопрос - что меняет этот символ в работе компонента? Это новая логика работы или ошибка?

Схема для проверки (каждое нажатие FindNext ищет следующую "подходящую" строку):
Add(StrList,14592800,406,70)
{
Strings=#16:10056;НЕ находит|13:10191;Находит|13:10192;Находит|16:10363;НЕ находит|16:10581;НЕ находит|19:92521;Нужная строка|
}
Add(ArrayEnum,4774859,420,126)
{
link(onItem,1505494:doAdd,[])
link(Array,14592800:Array,[])
}
Add(Button,10040569,364,126)
{
Left=15
Top=10
Caption="Load"
Flat=0
link(onClick,4774859:doEnum,[])
}
Add(StringTable,1505494,567,126)
{
Left=15
Top=40
Width=305
Height=220
Columns=#5:Числа|5:Текст|
ColumnClick=1
Point(Strings)
Point(doSelect)
Point(onColumnClick)
Point(doSortDigit)
Point(doEnsureVisible)
link(onClick,6145534:doWork1,[(611,132)(611,117)(470,117)])
link(onColumnClick,1505494:doSortDigit,[(610,139)(610,193)(542,193)(542,160)])
}
Add(Edit,9366271,700,126)
{
Left=75
Top=10
Width=185
WinStyle=2
Text="92521;"
}
Add(Button,9582991,427,238)
{
Left=265
Top=10
Caption="Find Next"
Flat=0
link(onClick,9905309:doData,[])
}
Add(ArrayFind,5092659,581,238)
{
Partial=0
link(onFind,9326268:doEvent1,[])
link(Array,1505494:Strings,[])
link(Value,9366271:Text,[(601,223)(706,223)])
}
Add(Memory,5186600,483,168)
{
Default=Integer(0)
}
Add(DoData,9905309,483,238)
{
link(onEventData,5092659:doFind,[])
link(Data,5186600:Value,[])
}
Add(Hub,9326268,630,238)
{
OutCount=3
link(onEvent1,1505494:doSelect,[(659,244)(659,203)(530,203)(530,153)])
link(onEvent2,1505494:doEnsureVisible,[(668,251)(668,184)(551,184)(551,167)])
link(onEvent3,5716089:doCase,[])
}
Add(Case,5716089,672,252)
{
Value=Integer(-1)
DataOnTrue=Integer(0)
link(onNextCase,11905089:doCalc,[])
link(onTrue,4428785:doWork3,[(779,265)])
}
Add(HubEx,4428785,775,252)
{
Angle=3
link(onEvent,6145534:doWork3,[(779,213)(470,213)])
}
Add(FastMathParse,11905089,728,252)
{
DataCount=1
MathStr="%1 + 1"
ResultType=0
link(onResult,4428785:doWork2,[])
}
Add(HubEx,6145534,466,168)
{
link(onEvent,5186600:doValue,[])
}


--
С уважением

Редактировалось 4 раз(а), последний 2020-12-08 07:58:00
карма: 0

0
Ответов: 4444
Рейтинг: 711
#527: 2020-12-08 12:15:11 ЛС | профиль | цитата
Посмотрю. Вообще не понимаю откуда взялась та строка.
карма: 26

0
Ответов: 4444
Рейтинг: 711
#528: 2020-12-09 14:32:06 ЛС | профиль | цитата
Aroyl, попробуй замени процедуру THIArrayFind._work_doFind0() на эту:

procedure THIArrayFind._work_doFind0;
var
i, idx: Integer;
S1, S2: string;
begin
ItemIdx := -1;

ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

idx := ReadInteger(_Data, _data_Index, _prop_Index);
if idx < 0 then exit;

S1 := ReadString(_Data, _data_Value, Share.ToString(_prop_Value));
if not _prop_CaseSensitive then S1 := AnsiLowerCase(S1);

for i := idx to ArrIn._Count - 1 do
begin
S2 := Share.ToString(GetArrayVal(i));
if not _prop_CaseSensitive then S2 := AnsiLowerCase(S2);

if (_prop_Partial and (Pos(S1, S2) <> 0)) or (S1 = S2) then
begin
ItemIdx := i;
break;
end;
end;

_hi_CreateEvent(_Data, @_event_onFind, ItemIdx);
end;
Проверь будут ли какие-либо проблемы.
карма: 26

1
Голосовали:Aroyl
Ответов: 10
Рейтинг: 0
#529: 2020-12-10 07:53:19 ЛС | профиль | цитата
Netspirit, so far so good, у меня всё работает, спасибо! Плюс новый код выглядит аккуратнее предыдущего
карма: 0

0
Ответов: 10
Рейтинг: 0
#530: 2020-12-13 15:17:50 ЛС | профиль | цитата
Netspirit, обнаружилась проблемка: с новым кодом компонент не выдаёт -1 при ненахождении искомой строки в массиве строк, если массив пустой, а просто падает. Похоже блок TRY - FINALLY - END в старом компоненте использовался для обхода этой ситуации. Добавил его в новый код - всё работает.

Редактировалось 1 раз(а), последний 2020-12-14 11:40:00
карма: 0

0
Ответов: 4444
Рейтинг: 711
#531: 2020-12-14 11:53:58 ЛС | профиль | цитата
Aroyl писал(а):
Похоже блок TRY - FINALLY - END в старом компоненте использовался для обхода этой ситуации.
Ну, он скрывал проблему, но не решал. По идее, пустой массив должен отсекаться на строке
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;
Надо проверить верно ли ArrIn._Count=0. Кроме того, судя по коду - нет проверки на idx >= ArrIn._Count. Попробуй
if (idx < 0) or (idx >= ArrIn._Count) then exit;

А, и была проблемка с выдачей -1 из-за предварительного exit. Попробуй такой код:

procedure THIArrayFind._work_doFind0;
var
i, idx: Integer;
S1, S2: string;
begin

ItemIdx := -1;

ArrIn := ReadArray(_data_Array);
idx := ReadInteger(_Data, _data_Index, _prop_Index);

if (ArrIn = nil) or (ArrIn._Count = 0) or
(idx < 0) or (idx >= ArrIn._Count)
then
begin
_hi_CreateEvent(_Data, @_event_onFind, -1);
exit;
end;

S1 := ReadString(_Data, _data_Value, Share.ToString(_prop_Value));
if not _prop_CaseSensitive then S1 := AnsiLowerCase(S1);

for i := idx to ArrIn._Count - 1 do
begin
S2 := Share.ToString(GetArrayVal(i));
if not _prop_CaseSensitive then S2 := AnsiLowerCase(S2);

if (_prop_Partial and (Pos(S1, S2) <> 0)) or (S1 = S2) then
begin
ItemIdx := i;
break;
end;
end;

_hi_CreateEvent(_Data, @_event_onFind, ItemIdx);
end;

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

1
Голосовали:Aroyl
Ответов: 10
Рейтинг: 0
#532: 2020-12-14 14:47:26 ЛС | профиль | цитата
Netspirit, работает. Благодарю!
карма: 0

0
Ответов: 187
Рейтинг: 12
#533: 2021-01-14 16:31:27 ЛС | профиль | цитата
Netspirit, В FPC-64 для такого выражения 3 * (exp(3 * ln(255))) результат 49744124.9999999
У всех остальных компиляторов 49744125

Add(MainForm,13268906,679,133)
{
Width=306
Height=67
Position=1
link(onCreate,2834044:dotest,[])
}
Add(InlineCode,2834044,735,147)
{
WorkPoints=#6:dotest|
EventPoints=#5:onRes|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|19: onRes:THI_Event;|50: procedure dotest(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmUnit.dotest;|6:begin |42:_hi_OnEvent(onRes,3 * (exp(3 * ln(255))));|0:|4:end;|4:end.|
link(onRes,13268906:doCaption,[(774,153)(774,125)(669,125)(669,139)])
}

карма: 1

0
Ответов: 4444
Рейтинг: 711
#534: 2021-01-14 17:22:10 ЛС | профиль | цитата
Там всё ещё есть проблема в функции перевода вещественного числа в строку.

Хочу написать свою функцию перевода вещественного числа в десятичный вид, поэтому если кто-то знает - подскажите алгоритм. Имеется 80-битное число типа Extented precision, могу получить числовые значения мантиссы и экспоненты. Нужно перевести числовое значение мантиссы в десятичное строковое представление.
В стандартной функции FPC используется оператор Str() с последующим парсингом текстового представления из инженерного представления в человеческий - выглядит очень уж костыльно.

Редактировалось 1 раз(а), последний 2021-01-14 17:26:43
карма: 26

0
Ответов: 187
Рейтинг: 12
#535: 2021-01-14 18:26:56 ЛС | профиль | цитата
Netspirit писал(а):
Проблема в портированной функции KOL.Extended2Str() - разное поведение в 32 и 64 битах. Дефайном включил другую точность - вроде работает.

Понизил еще точность до 21 - вроде работает нормально.
карма: 1

0
Ответов: 33
Рейтинг: 0
#536: 2021-01-20 22:33:05 ЛС | профиль | цитата
При использовании компонента

Add(PNG,4682955,826,364)
{
Point(doLoadFromStream)
Point(doBitmap)
Point(FileName)
}


выдает такие ошибки


E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(64) Error: '(' expected but ';' found

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(65) Error: Constant expression expected

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(65) Error: '(' expected but ';' found

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(72) Error: Constant expression expected

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(2515) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(3364) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4247) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4268) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4269) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4270) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4289) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4290) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4291) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4334) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4335) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4741) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLPng.pas(4749) Error: Left side cannot be assigned to

E:\SoftWare\HiAsm_new\Elements\delphi\code\hiPNG.pas(5) Fatal: Could not compile used unit 'KOLPng.pas'
Сборка завершена.


--- Добавлено в 2021-01-20 22:41:42

Так же


Compiling E:\SoftWare\HiAsm_new\Elements\delphi\code\KOLSHDocVw.pas
KOLSHDocVw.pas(48,11) Fatal: Can't find unit ActiveKOL used by KOLSHDocVW

Спасибо заранее)

--- Добавлено в 2021-01-20 22:42:39


Compiling err.pas
err.pas(479,3) Error: Identifier not found "EnumResourceModules"
err.pas(479,51) Error: Illegal expression
err.pas(504,13) Error: Identifier not found "Format"
err.pas(545,14) Error: Identifier not found "FindResourceHInstance"
err.pas(546,20) Error: Variable identifier expected
err.pas(549,27) Error: Identifier not found "Format"
err.pas(598,15) Error: Identifier not found "Format"
err.pas(632,15) Error: Identifier not found "Format"
err.pas(639,15) Error: Identifier not found "Format"
err.pas(777,17) Error: Unknown identifier "SYSTEM.RAISEEXCEPT"
err.pas(777,17) Error: Asm: [jmp ???] invalid combination of opcode and operands
err.pas(922,73) Warning: Procedure type "FAR" ignored
err.pas(942,3) Error: Identifier not found "ExceptionClass"
err.pas(944,3) Error: Identifier not found "ExceptClsProc"
err.pas(946,3) Error: Identifier not found "ExceptObjProc"
err.pas(968,3) Error: Identifier not found "ExceptionClass"
err.pas(970,3) Error: Identifier not found "ExceptObjProc"
err.pas(1079,14) Error: Identifier not found "PLibModule"
err.pas(1079,24) Error: Error in type definition
err.pas(1087,18) Error: Identifier not found "LibModuleList"
err.pas(1088,21) Error: Operator is not overloaded
err.pas(1090,23) Error: Illegal qualifier
err.pas(1090,23) Error: Expression type must be class or record type
err.pas(1092,40) Error: Identifier not found "Instance"
err.pas(1092,63) Error: Identifier not found "Instance"
err.pas(1096,30) Error: Illegal qualifier
err.pas(1187) Fatal: There were 25 errors compiling module, stopping


--- Добавлено в 2021-01-20 22:53:55

Еще проблема в работе FPC и https://forum.hiasm.com/topic/62708

--- Добавлено в 2021-01-20 23:20:57

ПРОБЛЕМУ РАБОТЫ FPC и HTTPClient исправил при помощи замены функции ToString такой: Share.ToString

Так же часть ошибок вызывало наличие компонента WebBrowser

Редактировалось 4 раз(а), последний 2021-01-20 23:20:57
карма: 0

0
Ответов: 4444
Рейтинг: 711
#537: 2021-01-21 11:33:29 ЛС | профиль | цитата
MBO писал(а):
Так же ... KOLSHDocVw.pas
Компонент WebBrowser не будет работать.
MBO писал(а):
ПРОБЛЕМУ РАБОТЫ FPC и HTTPClient исправил при помощи
... при помощи установки для нового FPC компонентов из папки "Unicode version".

С PNG - посмотрю. При установке компилятора заменял также папку Elements\Delphi на ту, что в архиве?
карма: 26

0
Ответов: 33
Рейтинг: 0
#538: 2021-01-21 16:52:06 ЛС | профиль | цитата
Netspirit писал(а):
MBO писал(а):
Так же ... KOLSHDocVw.pas
Компонент WebBrowser не будет работать.
MBO писал(а):
ПРОБЛЕМУ РАБОТЫ FPC и HTTPClient исправил при помощи
... при помощи установки для нового FPC компонентов из папки "Unicode version".

С PNG - посмотрю. При установке компилятора заменял также папку Elements\Delphi на ту, что в архиве?


Сделал все по инструкции


Так же заметил что программа скомпилированная через 32-версию на виркстотал показывает 3+ вируса, в т.ч. Виндовс защитник

64-версия показывает 0

Можно как то исправить 32-версию?

Код тот же
карма: 0

0
Ответов: 4444
Рейтинг: 711
#539: 2021-01-21 17:45:02 ЛС | профиль | цитата
"Исправив" антивирусники разве что. Писать разработчикам антивирусов что их антивирусы туфту показывают.
Как только 64-битные программы станут чуть популярнее, может и на них будут показывать.
Но если это какие-то нонейм-антиврусы, то не стоит переживать.

Редактировалось 1 раз(а), последний 2021-01-21 17:46:19
карма: 26

0
Ответов: 33
Рейтинг: 0
#540: 2021-01-21 18:45:12 ЛС | профиль | цитата
Netspirit писал(а):
"Исправив" антивирусники разве что. Писать разработчикам антивирусов что их антивирусы туфту показывают.
Как только 64-битные программы станут чуть популярнее, может и на них будут показывать.
Но если это какие-то нонейм-антиврусы, то не стоит переживать.

Редактировалось 1 раз(а), последний 2021-01-21 17:46:19


Да, вы правы
Закинул майкам файл, удалили обнаружение
карма: 0

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