|
|
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Пишем MDI приложение. В нем есть базовая форма для всех MDIChild-фор, пусть TMdiBaseForm, от которой наследуются все остальные дочерние формы; При закрытии дочерних формы не сворачиваем их, а именно закрываем: Код: pascal 1. 2. 3. 4. Все формы создаются типовым способом: Код: pascal 1. 2. 3. Все работает как надо, до момента закрытия формы. После этого переменная frmMdiChildren1 остается ненулевая и форма повторно не создается. Так вот вопрос: как занулить переменную формы после ее закрытия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 12:24 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aac, Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 12:40 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aac, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Использование Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 12:41 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aacПосле этого переменная frmMdiChildren1 остается ненулевая и форма повторно не создается. А где место в котором вы обнуляете переменную ? Зачем вообще существует переменная frmMdiChildren1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 12:47 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
DimaBrА где место в котором вы обнуляете переменную? Вот вопрос то и был об этом... может не совсем корректно выразил мысль... Если закрытие окна происходит в базовой форме, которая не знает ничего о переменных, то где и как правильно занулять переменную формы? DimaBrЗачем вообще существует переменная frmMdiChildren1 ? Для того, что бы понять создавалась форма ранее или нет. Если будет создано стопитцот разных окошек и искомое потеряется где-то в самом низу, то клацнув в главном меню на пунктик вызова этого окна мы или выведем его наверх (если оно было ранее создано), либо создадим. В общем-то, нужное решение было дано в третьем посте, за что goldmi45 отдельное спасибо. Наверное тему можно закрывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:02 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aac, Код: pascal 1. 2. 3. 4. 5. 6. Открываем Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:06 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Но это - корявый метод... Лучше закрывать\открывать "Главной формой" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:07 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aacТак вот вопрос: как занулить переменную формы после ее закрытия? Удалить эту переменную вообще. Она не нужна. Реестр существующих окон держать в другом виде, например Код: pascal 1. 2. Ну и не забывать оттуда удалять закрываемые формы. P.S. именно такой реестр на самом деле редко практичен: он не позволяет открывать НЕСКОЛЬКО окон одного класса. Впрочем, как и переменная "frmMdiChildren1" не может содержать несколько указателей на несколько окон сразу. А в реальности часто по другому. Например в браузере открыто несколько разных веб-страничек, в Excel открыто несколько разных файлов: класс один и тот же, а окон много: уникальный идентификатор окна состоит не только из класса, но и ещё каких-то данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:08 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
zinpubclient6aac, Код: pascal 1. 2. 3. 4. 5. 6. [/src] Не годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2 Arioch В текущей логике приложения как раз и нужно открытие окошек в единственном экземпляре. Но за наставление на путь истинный - спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:18 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
список MDI окон у нас по факту есть но держать ссылки на формы в своем ObjectList(OwnObjects=FALSE!!!) никто не мешает при закрытии нужно пробегать по нему и удалять из него ссылку на удаляемую форму вопрос именно - для чего нам этот список более практичным выглядит вариант когда это список моих объектов, которые содержат всякие данные и В ТОМ ЧИСЛЕ ссылку на форму... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:21 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Arioch Вот только что созрела мысль, что в Вашем варианте с Дикшионари я тоже не очень понимаю как удалять Айтем из словаря при закрытии формы при условии, что все это должно быть реализовано в базовой форме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:22 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
А две одинаковые формы (одного типа) не могут быть созданы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:22 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
DimaBrА две одинаковые формы (одного типа) не могут быть созданы ? нет, при попытке создания второго экземпляра формы, нужно вывести наверх уже имеющийся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:25 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
goldmi45client6aac, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Или проще Код: pascal 1. 2. 3. 4. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Generics_Collections_TList_Contains.html Но вообще привязывать реестр (реестры) открытых окон к TMainForm - стрёмная идея. Потом если понадобиться распутать - то хрен распутаешь, спагетти зависимостей нарастёт. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:25 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Arioch, я не пойму как это все делать из БАЗОВОЙ формы:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:27 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
goldmi45Arioch, Зачем создавать то, что уже есть? MDIChildren и MDIChildCount 1) лаконичнее. Одна строка - вызов стандартной функции TList<t>.Contains гораздо меньше, чем расписанный вами if с циклами. Следовательно, меньше шансов тупой ошибки. 2) гибче. Например, в дальнейшем нужно будет иметь несколько MDI-Parent окон. Или с MDI будет переход на что-то другое (табы, докающиеся плавающие окна, ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:27 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aaczinpubclient6aac, Код: pascal 1. 2. 3. 4. 5. 6. [/src] Не годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2 Ну Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:30 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aacя не пойму как это все делать из БАЗОВОЙ формы:) 1) пробросить в базовую формы ссылку на содержащий её реестр 2) иметь один единственный реестр в приложении - глобальную переменную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:30 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aacНе годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2 так From2 тут явно один из потомков базовой формы, то же самое, что frmMdiChildren1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:32 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Но Arioch прав, гораздо лучше реестр окон, в который можно добавить собственные свойства\методы... итд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:32 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
zinpub Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Зачем? переменная Sender перестаёт существовать через мгновение, когда ты выходишь из процедуры! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:33 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Arioch Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Вот так лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:36 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Ariochzinpub Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Зачем? переменная Sender перестаёт существовать через мгновение, когда ты выходишь из процедуры! Тьфу... Да! затупил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:36 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
krapotkinболее практичным выглядит вариант когда это список моих объектов, которые содержат всякие данные и В ТОМ ЧИСЛЕ ссылку на форму. после чего этот список начинает расти, а либо поиск, либо удаление объектов в массиве - операции дорогие свалить ВСЕ объекты в одну кучу - спорное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:38 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Ну так создавайте изначально так, чтобы такой формы небыло Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:41 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Arioch2) иметь один единственный реестр в приложении - глобальную переменную А ещё лучше не глобальную, а локальную для класса Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:42 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Ariochgoldmi45Arioch, Зачем создавать то, что уже есть? MDIChildren и MDIChildCount 1) лаконичнее. Одна строка - вызов стандартной функции TList<t>.Contains гораздо меньше, чем расписанный вами if с циклами. Следовательно, меньше шансов тупой ошибки. Да, Contains лаконичнее. Но ошибка может вкрасться на другом этапе (к примеру, забыв добавить переменную в список). И кода будет ни сколько не меньше: необходимо создавать список, его удалять, добавлять в него переменную. Возможно, необходимы отдельные методы, как у вас. Arioch2) гибче. Например, в дальнейшем нужно будет иметь несколько MDI-Parent окон. Или с MDI будет переход на что-то другое (табы, докающиеся плавающие окна, ...) Согласен. Код имеет ограничения и вы предлагаете более гибкий подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:42 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
DimaBrНу так создавайте изначально так, чтобы такой формы небыло Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Дважды вызывать функцию MDIChildren[i] - долго и потенциально моежт привести к опискам (например - несколько циклом, или индексы более разнообразные и сложные) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 13:50 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aacНо за наставление на путь истинный - спасибо! в общем, несколько вариантов тебе накидали, плюсы-минусы упомянули, планировтаь будущее программы и оценивать их - дело уже твоё. главное, не забывай, что "90% кода в интернете - говно" - https://www.gunsmoker.ru/2010/05/90.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 14:02 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
ToAll Я приятно удивлен, что вроде такой пустяковый вопросик вызвал такую достаточно бурную и конструктивную реакцию комьюнити. Всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 14:10 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
А почему нельзя открыть (создать) дочернюю форму два раза? У меня вообще все дочерние формы создаются TfrmMDIChild.Create(Self); Надо сотню открыть? На здоровье! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 14:56 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Якобы, задача такая, что не надо. Скрестим пальцы, чтобы он не ошибся. Есть тезис "не изобретать велосипеды" goldmi45Зачем создавать то, что уже есть? MDIChildren и MDIChildCo И есть тезис "писать программу так, как будто через год её будет дописывать маньяк-убийца, которому расскажут, где живёт твоя семья" zinpubНо Arioch прав, гораздо лучше реестр окон, в который можно добавить собственные свойства\методы При этом тезис client6aacВ текущей логике приложения как раз и нужно открытие окошек в единственном экземпляре. - это ставка в азартной игре "угадай, как дела обстоят не в реальности, а на самом деле". Обычно мы угадываем, но иногда ошибаемся. Очевидно, что заранее мы не знаем, где ошибёмся, иначе не ошиблись бы провокация: Хороший код такой, который легко ломается (т.е. от любого чиха перестаёт компилироваться). Код, который компилируется даже после заметных изменений - плохой. Пример - да хотя бы вечный срач про контроль типов (строгий / не строгий / никакого и статический / динамический), например https://www.sql.ru/forum/1309685/incompatible-types. Собираем мой бред в кучку. goldmi45Зачем создавать то, что уже есть? MDIChildren и MDIChildCo "Бизюзловно" - прозюзюкала Зази. Если программа пишется на один раз и через неделю её выкинут на помойку навсегода - то экономия на велосипедах сыграет. Если "В текущей логике приложения как раз и нужно" и ни-ког-да никакой другйо логики не будет. Но! если "другая логика" всё же случится, то "в класс-реестр можно добавить собственные свойства\методы". А это значит, что в само объявление этих методов (списки/типы параметров, названия) можно зашить "требования к реальному миру". И при нарушении этих требований - компиляция сломается. И это - хороший код DimaBr Код: pascal 1. Тут мы предполагаем, что "TMdiBaseFormClass" - полный и уникальный идентификатор формы. ЕСЛИ потом у нас будут несколько форм одного класса, то будет что-то вроде Код: pascal 1. 2. 3. 4. 5. 6. 7. После этого всё позабытые нами вызовы "CreateFrom( MySuperMDIClass )" просто не соберутся. Даже если мы захотим их пропустить - Delphi не даст. Но это - объявление метода. А вот сам цикл - все равно будет собираться. DimaBr Код: pascal 1. 2. 3. 4. 5. 6. Если это цикл по любой причине начал копи-паститься в разных местах - мы обязательно где-нибудь его да забудем. Потому что "то, что уже есть" - никак на наши реалии не завязано. И поэтому не овалится (к сожалению), если мы реалии поменяем. Таким образом, использование этого "из коробки" функционала - это очень сильная ставка на YAGNI. Ну и "охотничья байка". Есть стандартный срач в БД - суррогатный или натуральный должен быть ключ таблиц. Должен ли уникальный идентификатор строки в таблице иметь реальный смысл или быть полностью очищен от любых пересечений с реальностью. Несколько лет назад мне надо было быстро сделать самописку для внутренних нужд компании. Среди прочего там была таблицы контрагентов - юр/лиц. В качестве Primary Key я там поставил ИНН. Сразу многие запросы стали проще, а при просмотре вторичных таблиц вместу асбтрактного случайного номера - был реальный и осмысленный ИНН. Удобно и быстро. ....перед этим я всю контору обошёл и у всех спросил, могут ли в России быть два юр-лица с одинаковым ИНН. И мне все сказали, что конечно же нет, и вообще "программе это никогда не понадобится". Ну и я "срезал угол". Тем более, что надо было быстро. Прошло полгода. У самописки появились пользователи, у пользователей появились привычки, в БД появились данные. И вдруг ко мне приходят и говорят, что программа остановила работу. Надо ввести контр-агента ,а не получается, ругается на повтор ИНН. - значит, вы его уже раньше ввели в БД, берите готовый. - нет, тот "Василёк", а нужен "Ромашка". - значит "Василёк" переименовался в ромашку. Переименуйте в БД и используйте. - нет, это разные юр-лица и нам нужны ОБА СРАЗУ - если это разные юр-лица, то у них и ИНН разные, ищите опечатку. - нет опечаток. Юр-лица разные, а ИНН общий - ЧТО ???? ...оказалось, что хотя вообще-то ИНН - "индивидуальный номер", но конкретно у филиалов банокв в разных городах ИНН был общий, а различались только КПП. Но ИНН уже был PK, на него уже были построены многие Foreign Key, но это были завязаны запросы и куски кода. И всё это уже было полгода в реальной работе. ....а мне надо бросив все срочно вспомнить как та программа писалась, сделать ИНН неуникальным - в программе и БД, и при этом не потерять данные, ни в чём не изменить поведение программы, и чтобы никто из пользователей вообще не заметил обновления. ...но вообще конечно же, YAGNI и "В текущей логике приложения как раз и нужно" Делайте ваши ставки, господа! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 16:19 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Док, - Долго ли умеючи? - Умеючи-то долго! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 17:39 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
экак Вас поперло... пора уже выдыхать:D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2019, 17:44 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
У меня обычно используется вот такой вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Туда же можно засунуть и создание формы, при желании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2019, 10:48 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
client6aac, на дороге MDI вы еще не дошли до вопроса "Как сделать, чтобы при максимизации одного окна, другие оставались в нормальном состоянии?" и иже с ними. Может вам не надо MDI, а то придется велосипедить долго и упорно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2019, 15:15 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
А зачем вообще переменная? Код: pascal 1. 2. 3. 4. 5. 6. После выхода из метода переменная сама обнулится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2019, 11:13 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
Old NickА зачем вообще переменная? Код: pascal 1. 2. 3. 4. 5. 6. После выхода из метода переменная сама обнулится. А зачем вообще переменная? Если она не нужна - так и не нужно ее делать. Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2019, 04:36 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
fraks, зачем вообще Show? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2019, 06:03 |
|
||
|
Закрытие MDIChild-формы
|
|||
|---|---|---|---|
|
#18+
ТСу необходимо создавать в единственном экземпляре дочерние окна. Последние три писателя - нечитатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2019, 08:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039722]: |
0ms |
get settings: |
8ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
161ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 509ms |

| 0 / 0 |
