Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2010, 13:59   #41
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
закрыть и освободить все экземпляры класса формы,
Обычно хватает просто освобождения самой формы, а она уже должна сама освободить контроллы, которые к ней прикреплены либо методом InsertControl либо предположим если прикрепленный контрол наследник от TComponent, то в конструкторе контрола указывается self или та самая форма. таким образом он к ней прикрепляется. И при освобождении формы освобождается с ней.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.08.2010, 14:40   #42
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Проще создать фиктивный компонент и задать его владельцем (Owner) всех форм и компонент от DLL. Удаляете этот компонент - удаляются все формы.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.08.2010, 14:41   #43
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

К сожалению, последние три совета (№39, №40 и №41) - это не совсем то, что требуется и вот почему:
1. что бы в секции finalization разместить очистку списка созданных экземпляров мне нужно указатели на эти экземпляры как-то там разместить. А страница создаётся таким образом: MyClass := GetClass("ClassName"); Page := MyClass.Create;
То есть, здесь я использую возможность не передавать в пакет какие-либо данные, что в свою очередь позволяет мне размещать в виде страниц любые формы унаследованные от TForm. Даже не надо писать на OnClose Action := caFree; Это очень удобно и от этого не хочется отказываться.

2 Да, это вариант. Но надо позаботиться о том, что бы имена классов расположенных внутри пакетов однозначно вычислялись по имени пакета. Оно, конечно, како-никакой выход из тупика, но все эти правила именований (не так назовёшь - не будет работать) вгоняют меня в меланхолию.

3. Да, конечно. Форма при закрытии сама освобождает все свои контролы, отцепляется от БД, высвобождает занятые ею ресурсы, но представьте, что у Вас (ну или у меня) загружены 2 страницы - 1-ая от класса TfrmMyPageOne, а вторая - от класса TfrmMyPageTwo, и при этом загружены пакеты MaPackSome и MyPackStuff. И тут возникает необходимость обновить пакет MyPackStuff. Вопрос: как узнать какую страницу надо закрыть, что бы нужный мне пакет выгрузился? А выгрузить его надо, т.к. надо обновить его файл.

Кстати, есть ещё один вариант - выгрузить вообще все формы, обновить пакет и загрузить формы обратно. Но согласитесь, что выгрузка только нужных форм выглядит куда красивее!

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Проще создать фиктивный компонент и задать его владельцем (Owner) всех форм и компонент от DLL. Удаляете этот компонент - удаляются все формы.
Тоже очень хороший вариант. Он был в моём списке первым. Пока я не сообразил, что для того, что бы он сработал при создании формы надо знать в каком модуле (читай: пакете) она объявлена.

Ведь загрузка пакетов происходит при запуске программы, а страницы из форм создаются в течение работы произвольно.

Только что встретил на одном форуме похожую проблему.
Цитата оттуда: "По классу формы элементарно определить имя модуля". Это как раз то, что нужно. Но описание методы там нет.
Вот что по этому поводу говорит Гугл Как?

Последний раз редактировалось Stilet; 13.08.2010 в 16:04.
Greek9000 вне форума Ответить с цитированием
Старый 13.08.2010, 15:26   #44
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Ни разу не проблема. Усовершенствуй свою фабрику форм, реализуй в пакетах что-то вроде такого:
Код:
function FormFactory(ClassName: string): TFormClass;
begin
  // Где SomeOwner - компонент пакета, который уничтожается в finalization
  Result := GetClass(ClassName).Create(SomeOwner);
end;
Ins вне форума Ответить с цитированием
Старый 13.08.2010, 16:00   #45
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
как узнать какую страницу надо закрыть, что бы нужный мне пакет выгрузился?
почему бы не
1. попросить нужный пакет самому закрыть свои страницы(формы)
procedure CloseMyForms; exports; (screen.forms[j]=<mtclass>)
можно даже будет проверить удалось ли все сделать
function CloseMyForms; boolean;
2. спросить у пакета какая страница его
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.08.2010, 16:27   #46
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
почему бы не
1. попросить нужный пакет самому закрыть свои страницы(формы)
procedure CloseMyForms; exports; (screen.forms[j]=<mtclass>)
можно даже будет проверить удалось ли все сделать
function CloseMyForms; boolean;
2. спросить у пакета какая страница его
См. пост №43, часть 1. Потому что это повлечёт за собой потерю удобства разработки. Зачем дописывать в каждый новый пакет доп. код, если существует способ (я в это верю ) спросить у класса формы, в каком юните он объявлен.

Последний раз редактировалось Greek9000; 13.08.2010 в 16:31.
Greek9000 вне форума Ответить с цитированием
Старый 13.08.2010, 16:35   #47
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Greek9000 Посмотреть сообщение
если существует способ (я в это верю ) спросить у класса формы, в каком юните он объявлен.
Наверное, вы говорите про FindClassHInstance?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 13.08.2010, 16:37   #48
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Цитата:
если существует способ (я в это верю ) спросить у класса формы, в каком юните он объявлен.
Существует Только тебе наверное не юнит нужен, а HModule пакета:
function FindHInstance(Address: Pointer): LongWord;
function FindClassHInstance(ClassType: TClass): LongWord;

GunSmoker опередил

Последний раз редактировалось Ins; 13.08.2010 в 16:43.
Ins вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Runtime runtime = Runtime.getRuntime(); Pti44ka Общие вопросы по Java, Java SE, Kotlin 1 22.11.2009 10:45
без запроса Package? koleko Общие вопросы Delphi 2 18.02.2009 22:59
RunTime Error713 (VB) vio Помощь студентам 2 12.12.2008 20:45
Unit 'MyLib' implicitly imported into package 'MyPackage'. как исправить? SkAndrew Компоненты Delphi 0 06.04.2008 00:28
Runtime programming JoanM Общие вопросы Delphi 4 09.01.2008 11:00