Столкнулся с проблемой заполнения List через ParseJson.
DeclareModule Test
;
Interface NewTest
_set(*LocationList)
_set2(List LocationList())
Destroy()
EndInterface
;
Declare New()
EndDeclareModule
Module Test
Structure TestClass
*vTable
EndStructure
Structure Location
x.l
y.l
EndStructure
Procedure New() ;FUNC Global Class|Structure
Protected *obj.TestClass
*obj = AllocateStructure(TestClass)
If *obj
*obj\vTable = ?vTable_TestClass
EndIf
ProcedureReturn *obj
EndProcedure
;
Procedure _set(*this.TestClass, *LocationList) ;test 1
Protected Result.i, json.i, Input$
Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " +
"{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " +
"{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
json = ParseJSON(#PB_Any, Input$)
If IsJSON(json)
ExtractJSONList(JSONValue(json), *LocationList.Location())
FreeJSON(json)
Result = #True
Else
Result = #False
EndIf
ProcedureReturn Result
EndProcedure
;
Procedure _set2(*this.TestClass, List LocationList()) ;Test 2
Protected Result.i, json.i, Input$
Input$ = "[ {" + Chr(34) + "x" + Chr(34) + ": 10, " + Chr(34) + "y" + Chr(34) + ": 20}, " +
"{" + Chr(34) + "x" + Chr(34) + ": 30, " + Chr(34) + "y" + Chr(34) + ": 50}, " +
"{" + Chr(34) + "x" + Chr(34) + ": -5, " + Chr(34) + "y" + Chr(34) + ": 100} ]"
json = ParseJSON(#PB_Any, Input$)
If IsJSON(json)
ExtractJSONList(JSONValue(json), LocationList.Location())
FreeJSON(json)
Result = #True
Else
Result = #False
EndIf
ProcedureReturn Result
EndProcedure
Procedure Destroy(*this.TestClass)
If *this
FreeStructure(*this)
EndIf
EndProcedure
;
DataSection
vTable_TestClass:
data.i @_set()
data.i @_set2()
data.i @Destroy()
EndDataSection
EndModule
Structure Location
x.l
y.l
EndStructure
NewList Locations.Location()
Define T.Test::NewTest
T = Test::New()
t\_set(@Locations.Location())
t\_set2(Locations())
ForEach Locations()
Debug Str(Locations()\x) + ", " + Str(Locations()\y)
Next
В общем у меня в Procedure _set (Реальная процедура имеет другое имя, так для теста) поступает ответ от сервера в виде Array.Structure (mysql список записей в таблитце) и нужно передать в Procedure_set List.Structure()
Но получаю ошибку в виде:
[16:07:47] [COMPILER] Строка 91: The list doesn't match with the procedure parameter. [16:15:11] [COMPILER] Строка 40: *LocationList() is not a function, array, list, map or macro.
Есть у кого идеи.
И да вот JSON ответ сервера:
[
{"id":"1","hwid":"123","author":"test","name":"Ftest","version":"1.0.0.0","version_auth":"1.0.0.0","url_update":"http://test","update_data":"0","hash":"123","date":"0","moderate":"0","price_type":"0","price":"0","acess":"0"},
{"id":"2","hwid":"234","author":"test","name":"test2","version":"1.0.0.0","version_auth":"1.1.1.1","url_update":"http://ya.ru","update_data":"0","hash":"43543534","date":"44444","moderate":"1","price_type":"0","price":"0","acess":"0"}
]И да, я могу вернуть из Procedure JSON-ответ и обработать, но хотелось бы узнать возможно ли сделать это в Procedure.
Отредактировано Ste1nS (10.01.2021 14:37:58)

дизассемблер хочу. худо бедно парсер набросал. теперь то надо результаты показывать. они у меня построчно в массиве болтаются. и массив большой. потом надо его показывать, и не придумал ничего лучше как сделать второй массив, и переписывать в него строки, добавляя пустые строки там где надо. и после отображать уже этот второй массив, с привязкой с скроллбару. потом решил сделать листом в перспективе редактирования - добавления или удаления строк. в процессе парсинга кода добавляю в него AddElement и заполняю. но этот AddElement случаем не как аналог ReDim для массива? не будет ли быстрее сначала бахнуть большой лист, а после уже вписывать свои строки в него, не добавляя AddElement. будет ли это быстрее?