4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 196
|
||||||
1 | ||||||
Повторное открытие форм26.09.2017, 20:54. Показов 1919. Ответов 11
Метки нет (Все метки)
Доброго времени суток.
Прошу помощи. Вопрос в следующем: Есть основная Form1, на ней есть MainMenu1 с 10 TMenuItem N1 ... N10. При нажатии на каждый из них открывается новая форма, вот пример.
Когда компилирую программу, все работает нормально, при нажатии TMenuItem N1 ... N10. Но как только нажмешь на кнопку с обработчиком событий OnClose, появляется ошибка: Access violation at address 00608BDF in module. Read of address 00000010 А точнее, на строку Form3.Close; То есть, при нажатии на кнопку я и так закрыл форму и удалил форму из памяти. А при нажатии на следующею N2...N10, я проверяю на наличие форму, если она есть, то закрываю, по порядку, все формы от 2 до 11, для того чтобы открыть другую которую хочу открыть. Вот такой замысел. Вопрос в следующем. Что не так делаю, чем смогли бы помочь?
0
|
26.09.2017, 20:54 | |
Ответы с готовыми решениями:
11
Повторное открытие главной формы Открытие других форм Закрытие и открытие форм Открытие форм из BDGrid |
26.09.2017, 21:17 | 2 |
а чему равна Form3 при старте?
может она не равна nil и ты пытаешься закрыть несуществующее? при старте нужно заnil'ить переменные PS а вообще если в коде ты пишешь одно и тоже более 3х раз, то надо подумать и переписать
0
|
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 196
|
|
26.09.2017, 21:32 [ТС] | 3 |
при компиляции все формы равны nil. К примеру, открываю Form2, при нажатии на N1. Потом открываю Form3, при нажатии на N2. И так далее до последней. Все работает нормально. Только стоит нажать на кнопку, вызывается обработчик OnClose и форма, ту которую открыл, закрывается и получается nil. И при нажатии следующего N(2...10) дохожу до строки Form3.Close; идет ошибка.
Прошу предложи другой способ решения, как можно выполнить такую идею. Если этого не делать, то форма не закрывается. Для чего я делаю проверку? if Form3 <> nil then //Сколько форм столько и проверок для того, что я не знаю последовательность, какую новую форму захочет открыть пользователь, чтобы закрыть предыдущею.
0
|
27.09.2017, 08:58 | 6 |
объекты создаются в памяти, которая им выделяется менеджером памяти при вызове конструктора
программисту возвращается АДРЕС (указатель) этого куска памяти Form1 := TForm1.Create(NIL); теперь если разрушить объект Form1.Free; или любым другим способом то кусок памяти будет возвращен менеджеру, но ее адрес в переменной Form1 не изменится, ибо с чего бы? поэтому Form1.Caption := '11111' обратится к уже несуществующему объекту в памяти и в зависимости от температуры на Марсе либо выдаст фигню, либо Acccess Violation так что действительно, глобальные переменные Form1, Form2 ... FormXXX обычно есть зло вот тут я об этом писал
1
|
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 196
|
||||||
27.09.2017, 21:12 [ТС] | 7 | |||||
Коллеги krapotkin, GoodWeather, а с чего вы взяли, что
я создал? Про это и слово не сказал.
Я удалил ВСЕ формы, кроме главной, из Auto-Create forms в Available forms. При нажатии кнопки в MainMenu1, я открываю уже созданную форму, в которой я вам хотел показать некоторые моменты в виде
Вот тут я склоняюсь к ответу Massaraksh7, что Так ли это? Если это так, то как быть, что могли бы предложить? Но мне так же понравился ответ krapotkin, но я понимаю, что речь идет о пять же о глобальных переменных, динамически созданных формах и удалении их. Но я хочу понять, не то как создавать и удалять формы, а как проверить существуют ли открытые формы и если они существуют, разрушить их и открыть другую форму.
0
|
Айлурофил
|
|
27.09.2017, 21:27 | 9 |
krapotkin, фактически, сказал то же самое.
Вообще, я бы посоветовал завести на каждую форму отдельную глобальную переменную, которой в секции Create присваивал True, а в секции Destroy - False. Добавлено через 5 минут Вот это, как раз, сомнительно. Мы выйдем из процедуры, форма останется, а стек затрется.
0
|
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 196
|
||||||
27.09.2017, 21:31 [ТС] | 10 | |||||
Честно говоря Вы меня запутали. Вот часть кода:
0
|
27.09.2017, 21:59 | 11 |
зачем вы пихаете форму в форму (parent) ??
зачем нам иметь глобальные переменные ? ошибка. ну еще же раз вы в OnClose делаете форме Free ? А переменная останется. А форма уже уничтожится
1
|
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,248
|
|
28.09.2017, 02:28 | 12 |
Это вы нас пытаетесь запутать "по самые помидоры". Прикрепите лучше архив с проектом к сообщению.
0
|
28.09.2017, 02:28 | |
28.09.2017, 02:28 | |
Помогаю со студенческими работами здесь
12
Открытие форм при запуске программы Хитрое открытие форм, запутался в 3-х строчках кода Повторное открытие программы Повторное открытие формы после ее закрытия Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |