отдаются в скрипты. При этом скрипты могут эти обертки держать живыми очень долго, например положив в глоьальную переменную. Ну а jscript их вообще никогда не освобождает.
Возникает вопрос о зомби-состоянии, чтобы обёртка знала, что её объекта больше не существует.
С компонентами понятно, там free notification есть. А вот например tcollection или tstrings - там ни фига такого нет... Как им задним числом добавить проперть ondestroy? Пересобрать rtlXXX.bpl и всех остальных не предлагайте. Я ***нутый, но не настолько ещё
1) Смотрел другие обертки? 2) В указанных тобой контейнерах есть методы/события о удалении итемов, можно реагировать когда удаляться последний элемент, ТК у них(контейнеров) в Destroy вызываеться Clear. В комбинации с Component State полисам желание. Без Delphi под рукой, но выглядит похоже на желаемое. 3) наследник и хук RTL чтобы создавал наследников, вместо оригиналов, примеры есть.
нет, придется много легаси переписывать, время никто не даст. Кроме того, это ничего не решит: и в VBS и в JS есть глобальные переменные 2) обертка не поверх итема, а повех самой коллекции! Обертка над Strings[1] - это просто переменная типа Variant, в которую скопировали строку. Не о чем говорить. А вот что делать, когда объект TStrings удалили, а потом обертка пытается из него что-то прочитать? 3) вариант интересный, если бы был исчерпывающий список таких классов, чтобы над каждым ищ них делать наследника. Но скрипт может получить доступ к любому published свойству и через него к любому дельфи-объекту, которые такое свойство вернет... То есть потенциально надо хукать и создавать наследников для ВСЕХ существующие классов, это жестоко. Лучше уж TObject хукать один раз 😊
П1 про то, что может решали такие вопросы. Я вот, например TStrings не отдавал, там же спецом своя интерфейсная коллекция есть, и обёртка для нее в RTL. С п2 я думал, что тебе для TCollection и TStrings onDestroy нужен.
потенциально любой объект...
ну и например TDataSet - Fields, FieldDefs, Parameters - все это коллекции и так просто ты вместо них потомка не подсунешь 😊
Потом, там же все одно взаимодействие не напрямую идёт. Объекты же регистрируются.
Неверное предположение 😊
не объекты, а твои обертки, в этом и проблема... твоя обертка будет жить столько, сколько захочет скрипт и его движок а объект будет жить столько, сколько захочет программа и объект может умереть задоооолго до смерти обертки
Ладно, давай так, я подниму старые архивы, посмотрю, что там, На мой взгляд, добавить/эмулировать onDestroy можно для любого объекта. Пропатчив FreeInstance, например. Мб интерфейс добавить придеться.
так про пропатчить freeinstance я и сам говорил 😃 😃 😃 с него родного и начали
https://t.me/Delphi_Lazarus/323688 дык, ты же примерно это предложишь 😊
можно ещё тупо вести TObjectList для каждого класса в отдельности, создавая в рантайме классам проперти, и туда закладывая эту коллекцию, если она потребуется плюс - не придется добавлять 4 байта каждому объекту минус - удаление оскриптованного объекта станет заметно медленнее что лучше - я хз, так пока лениво в фоне перебираю варианты
С другой стороны где MSC и где скорость... PAXCOMPILER уже умер. Но у него был и JavaScript.
uses Spring.VirtualClass; procedure NotifyFree(const Self: TObject); var freeInstance: TFreeInstance; begin freeInstance := GetClassData(Self.ClassParent).FreeInstance; Writeln('Object of class ', Self.ClassName, ' destroyed'); freeInstance(Self); end; var vc: TVirtualClasses; o: TObject; begin vc := TVirtualClasses.Create; try o := TObject.Create; try vc.Proxify(o); GetClassData(o.ClassType).FreeInstance := NotifyFree; finally o.Free; end; finally vc.Free; end; end.
uses Spring.VirtualClass; procedure NotifyFree(const Self: TObject); var freeInstance: TFreeInstance; begin freeInstance := GetClassData(Self.ClassParent).FreeInstance; Writeln('Object of class ', Self.ClassName, ' destroyed'); freeInstance(Self); end; var vc: TVirtualClasses; o: TObject; begin vc := TVirtualClasses.Create; try o := TObject.Create; try vc.Proxify(o); GetClassData(o.ClassType).FreeInstance := NotifyFree; finally o.Free; end; finally vc.Free; end; end.
Обсуждают сегодня