Еще один вариант - работать с указателями на указатели.
В скрипт передавать PObject - указатель на TObject.
При освобождении TObject вызывать FreeAndNil(TObject).
Тогда проверка PObject^<>nil будет проверкой на валидность.
Модератор: Модераторы
Лекс Айрин писал(а):MiniQ, не забывайте, что указатель на указатель тоже может быть невалидным... например, указывать на уже удаленную переменную. Так что все равно приходим к сборке мусора и массиву активных ссылок.
zub писал(а):Я вот слабо представляю жизнь без указателей
Application.Components
zub писал(а):Рад. чесно! но чеж ты стесняешся нам решением то похвастать?
скалогрыз писал(а):ну так тебе и говорят об этом. zub, все зубы уже обломал, пытаясь тебе помочь!
скалогрыз писал(а):Тест следующий. Выполни, пожалуйста, вот такой код в скрипте (т.к. мы синтаксис не знаем, то будем импровизировать):
- Код: Выделить всё
b = CreateButton;
componentDelete(b);
componentDelete(b);
как после этого кода себя ведёт программа? И не стесняйся поделиться результатами.
Лекс Айрин писал(а):Это плохой язык. Если пользователь (программист) ошибся, то прога должна клеить ласты. И никак иначе. В противном случае есть нехилый шанс, что ласты склеит система. Указатели очень опасный механизм.
alexey38 писал(а):Обсуждаемый вопрос, на мой взгляд, сформулирован некорректно. Отсюда и весь последующий флуд.
alexey38 писал(а):И следом создали еще один компонент кнопка. Велика вероятность того, что новая кнопка разместиться в той же самой памяти, где была предыдущая кнопка. И ладно, если это будет аналогичная кнопка. А если это будет не кнопка, а что-то другое. В итоге будут самые разнообразные глюки.
alexey38 писал(а):А задача проверки на то, ссылается ли указатель на тоже самое, на что он ссылался при его присвоении - это другая задача, и решается она другим способом.
jakyro писал(а):В первый раз - удалит компонент по указателю, во второй раз - сообщит отладчику на стороне скриптового языка, что компонента уже не существует и продолжит своё выполнение (или пользователь скриптов сам решит что сделать).
jakyro писал(а):Мне нужно именно проверить ЛЮБОЙ указатель на то, на что он ссылается, БЕЗ дополнительной реализации кучи менеджеров указателей, БЕЗ дополнительной реализации обработчиков удаления компонентов, а с ними и указателей, БЕЗ всех этих прилагающихся проблем.
jakyro писал(а):Нет, нет. Это не строго типизированный скриптовой язык, который позволяет отловить не валидный указатель и сообщить об этом, на любой стадии проекта, не уничтожая при этом процесс, дабы не потерять данные в результате работы с программой.
jakyro писал(а):Опасно было бы не проверять на валидность, а тупо хранить список указателей и надеяться, что где-то случайно не будет упущена его очистка из списка.
jakyro писал(а):А так же опасно то, что многие компоненты создают суб объекты, которые тоже имеют свои указатели, которые тоже нужно проверить на валидность и они будут не валидны, если родитель удален.
jakyro писал(а):Нет. Валидацию не пройдёт.
А если ты думаешь, что пройдёт, так пиши такую валидацию, чтоб не прошло.
jakyro писал(а):Ограничивать пользователя в владельцах - тоже не особо хороший тон, к тому же тогда и в памяти будет оставаться хлам, так как родители компонентов не будут являться их владельцами и при удалении не удалят детей, кроме ручного удаления всех детей, либо удалении владельца, которым является Application.
Лекс Айрин писал(а):никак нельзя... задача не имеет надежного решения.
скалогрыз писал(а):"удалит", "сообщит" и "продолжит", это замечательно, но в теории.
Просьба же была протестировать, т.е. ожидались слова "удалил", "сообщил" и "продолжил" - есть результаты?
По результатам судят о труде. И если они (результаты) успешные, то очень интересно знать решение этой нетривиальной проблемы - распознаение типа указателя без дополнительной инфраструктуры.
Лекс Айрин писал(а):никак нельзя... задача не имеет надежного решения. Кроме как тупо пройти и посмотреть не свалится ли программа при доступе к указателю. (кстати, есть адреса, по крайней мере в винде, доступ к которым свалит систему гарантированно)
Лекс Айрин писал(а):Скорее он свалит систему. Это видно даже такому новичку как я.
Лекс Айрин писал(а):Сборка мусора в таких системах не настолько плоха. Если, конечно, не играть со случайными ссылками.
Лекс Айрин писал(а):Это как раз элементарнейшая задача... объект обязан удалить все порожденные им конструкции в деструкторе. Это нормальное поведение стандартного деструктора. Ну а в случае игр с огнем на нефтяном пятне... концы должен подчистить программист там же. В случае если конструкция другой объект, то вызывается его деструктор.
Лекс Айрин писал(а):Ой ли... как раз таки "у семи нянек дитя без глазу"... А если ты хочешь написать язык, который нарушает принципы ооп, то:
1) Тогда уж и Application не будет уничтожать все компоненты.
2) А как ты узнаешь, что родителей у объекта не осталось?
3) А как можно, допустим, кнопку разместить в двух (и более) местах?
Лекс Айрин писал(а):Владелец, в случае компонента, это место (область/компонент) где компонент размещается физически
скалогрыз писал(а):что jakyro решил задачу сам, и сейчас ждём результатов проверки!
cmp = 12345
{ ComponentDelete(cmp) }
Если Указатель(cmp) верен, то
Удалить(cmp) { иначе, например сообщить в отладку о удалении не существующего компонента }
{ ComponentDelete(cmp) }
Если Указатель(cmp) верен, то
Удалить(cmp)
скалогрыз писал(а):ты же видел раньше по тексту, что jakyro решил задачу сам, и сейчас ждём результатов проверки!
Лекс Айрин писал(а):Да и задача странная... откуда может появиться указатель, который неизвестен программе/программисту?
jakyro писал(а):Ну так я тестировал уже. ... Я не понимаю какие ты ждёшь результаты. Работает код так:
- Код: Выделить всё
cmp = 12345
{ ComponentDelete(cmp) }
Если Указатель(cmp) верен, то
Удалить(cmp) { иначе, например сообщить в отладку о удалении не существующего компонента }
{ ComponentDelete(cmp) }
Если Указатель(cmp) верен, то
Удалить(cmp)
Сейчас этот форум просматривают: Google [Bot] и гости: 230