zub писал(а):А причем тут твой скриптовый язык?
Ну причём? Тоже не причём. Задача - "проверить указатель". А пришлось всё разжёвывать, что, да зачем...
zub писал(а):Начнем с того что ты ошибся разделом. lazarus тут непричем. Если подобная "фича" гдето и должна быть, то это fpc.
Ну и ты ошибся разделом, раздел "флуда" в другом месте.
Типа это fpc поставляет библиотеку LCL? Я и спрашивал про указатель на компонент LCL в соответствующем разделе.
Ты что хочешь показаться умным или что?
zub писал(а):Извините, где?
Извените, строкой выше, где я ответил "Назвал". Если читал мои сообщения, пытался вникнуть хотя бы в вопрос...
jakyro писал(а):Имеет пользователь в памяти скриптового языка, два экземпляра классов - панель и кнопка.
Пользователь удаляет панель, но так как владельцем кнопки была панель, кнопка тоже удаляется, никак не сообщив об этом скриптовому языку, иначе пришлось бы менять классы LCL, как это сделано в библиотеке для питона.
Ну вот. Имеешь ты список указателей, где панель удалил, а кнопку пропустил и в списке у тебя осталась кнопка, к которой при обращении всё крашнится.
Вот тебе тут и другая, побочная инфраструктура и костыли. Придётся ещё и все дочерние объекты отслеживать, вместо того что бы просто добавить проверку указателя.
Т.е. вместо того чтобы просто добавить проверку указателя, тебе придётся решать побочные проблемы. Хотя всё это решилось бы проверкой указателя.
скалогрыз писал(а):а с почему это пропустили кнопку? при удалении.
Ты же сам устанавливаешь правила - панель владелец кнопки, если владелец удалён, то кнопка тоже освобождается, а значит кнопку из списка придётся выкидвать.
Как удаляется панель? Ну примерно так, в каком-то скриптовом языке (напишу sdk, а не ооп, чтоб было ясней):
- Код: Выделить всё
ComponentDelete(pointer); // где pointer - ссылка на панель
А теперь вопрос. Как я узнаю про удаление кнопки?
Ну например добавить дополнительную обработку дочерних компонентов, пройти по всем и удалить из списка. Так?
Вот то, о чём я и говорил. Вместо того, чтобы просто добавить "проверку указателя", ты добавляешь себе множество подобных проблем, которые придётся решать.
Если же ты просто будешь проверять указатель, то при обращении к не существуещей кнопки - просто ничего не произойдёт (можно вывести ошибку в отладку, тот самый плюс о котором я говорил).
Вы сообщения то вообще читаете? Что один, что другой... Повторно приходится писать одно и тоже.
скалогрыз писал(а):1) т.к. уничтожение объекта происходит таки ли иначе через твою функцию, то эта функция должна собрать всех детей и их зачистить. (это чтобы LCL классы не менять
Вот оно как? А теперь скажи мне, как ты найдёшь в скриптовом языке все экземпляры объектов, которые используют данный указатель? ЕЩЁ один костыль будешь добавлять, который якабы будет проходить и освобождать экземпляры классов, дабы не дай бог они не обратились по кривому указателю и не крашнули приложение!?
И который раз повторю, именно поэтому мне нужно было решение КОНКРЕТНО поставленной задачи, а именно: узнать, на что ссылается любой указатель, дабы затем, просто не работать с ним, вместо всех тех костылей которые вы перечислили. Множество проблем, одно решение - проверить указатель.
скалогрыз писал(а):2) если лень собирать детей, то ты можешь каждому созданному контролу повесить евент AddHandlerOnBeforeDestruction.
Ну об этом я уже который раз говорил, что выдумываешь сам себе проблемы, вместо того чтобы не работать с битым указателем.
скалогрыз писал(а):Он будет вызывать каждый раз когда контрол освобождается, и ты сможешь вычистить его из списка.
И то, что там где-то осталась ссылка на удёлнную кнопку, тебе никак не вредит, т.к. из списка её уже вычистили.
Вредит. У пользователя, в скриптовом языке остались указатели, которые он будет по ошибке или нет, использовать, ссылаясь на не существующий объект, вызывая краш программы в самый не подходящий момент.
О том как могут затеряться указатели в скриптовом языке, я уже рассказывал. А делать двухсторонний менеджер памяти - это явно не лучше чем проооооостооо провееерить указатель (где-то я уже это писал... ).