Конференция "KOL" » очередные бои с тенью: Form.Free [Delphi, Windows]
 
  • rdnks (19.02.12 03:25) [0]
    Поднималась эта тема уже давно, но ответа не было. Проблема в следующем - никак не могу осознать дальнейшую работу при закрытии окна. Проект mck, есть обработчик OnClose(Sender: PObj; var Accept: boolean). Соответственно Accept и задает будет ли форма закрываться или нет. Но в любом случае она НЕ уничтожается, или по крайней мере не всё, так как повторный её вызов выдает до боли знакомую 216 ошибку. Уничтожается форма автоматически, вызывая необходимые OnDestroy только при уничтожении Applet. Получается что в обработчике OnClose приходится писать некий код

    Form.Free;
    frmMain := nil; // mck-псевдоформа
    Accept := false;

    Что-то нисколько адекватным это не кажется. Может что-то пропустил? Забить на это никак нельзя, так как с формой динамически создается куча контролов и обрабатывается достаточное количество данных, чтобы с десяток вызовов обнаружить в системе утечку порядка 50-100 метров.

    Другая проблема обнаружилась при попытке выгрузить некоторые объекты в библиотеку. Есть редактор. Хорошо бы дать пользователю выбор в чем он будет редактировать некий текст (мемо, рич, с подсветкой синтаксиса). Соответственно и организовал всё в виде плагинов. Помешаю HilightEdit в dll, создаю функцию инициализации (определение Applet приложения так как без него вообще черти-что получается, интерфейс) и своя же функция уничтожения объекта. При создании в родителе удаляю через RemoveFromAutoFree (в дебагере видно, что удаляется). Тем не менее, когда уничтожается форма с вызовом личного деструктора объекта из библиотеки при закрытии приложения выдает до боли знакомую ошибку.

    И последняя проблема объявилась при попытке перевести приложение в юникод. При включенном флаге компиляции и наличии манифеста контролы не отрисовываются. Но с проблемой только сегодня столкнулся, может не доглядел чего, да и времени не было ветку посмотреть до конца.

    Прошу прощения за то, что короче не мог составить суть проблем.
  • rdnks (19.02.12 03:39) [1]
    с последним разобрался, забытый InitCommonControls.
  • Vladimir Kladov © (22.02.12 20:15) [2]
    С DLL надо разбираться, что делается. Нет никакой гарантии, что контролы из DLL будут 1 в 1 такие же, как в основном приложении. Т.е. с ними нельзя работать как с объектами, использовать методы и т.д. Когда строится DLL, надо делать так, чтобы работать могло даже при вызове из кода, написанного на другом языке: ряд экспортируемых функций, к ним обращаться, через них работать. Никакие объекты между DLL и основной программой не передавать, только простые структуры (record), и строки. Использовать менеджер памяти Borland и ShareMem в uses.

    По поводу первого: какие проблемы? Если глобальная переменная формы стала nil, то о каком повторном ее использовании идет речь? Проверяйте, что ваш код действительно отрабатывает OnDestroy для убитой формы.
  • rdnks (22.02.12 23:53) [3]
    да, после нескольких часов мучений понял что бессмысленно  передавать объекты из dll. Начал было отчаиваться, но потом как озарение. Всё уже есть в библиотеке :) вспомнил об NewAlienPanel, в качестве родителя которой передается произвольный хэндл окна. Будем пробовать.

    Первое не критично. Буду действовать как раньше - в обработчике ОnClose уничтожение формы, описанное выше. Тогда и OnDestroy вызывается. Просто странно что при Accept := true окно уничтожается, а объекты нет.
 
Конференция "KOL" » очередные бои с тенью: Form.Free [Delphi, Windows]
Есть новые Нет новых   [118452   +47][b:0][p:0]