Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 170
1

Повторное открытие форм

26.09.2017, 20:54. Показов 1063. Ответов 11
Метки нет (Все метки)

Доброго времени суток.
Прошу помощи. Вопрос в следующем:
Есть основная Form1, на ней есть MainMenu1 с 10 TMenuItem N1 ... N10. При нажатии на каждый из них открывается новая форма, вот пример.
Delphi
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
procedure TForm1.N1Click(Sender: TObject);
begin
   if Form3 <> nil then //Сколько форм столько и проверок
  begin
    Form3.Close;
  end;
 
  if Form4 <> nil then //Сколько форм столько и проверок
  begin
    Form4.Close;
  end;
 
   Form2 := TForm.Create(Form1);
   with Form_SpisokNashixKompanui do
   begin
      Parent := Form1;
      Align := alClient;
      BorderStyle := bsNone;
      WindowState := wsMaximized;
      OnClose := Form2Close;
      Show;
   end;
end;
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
На каждой новой Form(2...11) есть кнопка, где прописан обработчик OnClose, Action := caFree;
Когда компилирую программу, все работает нормально, при нажатии TMenuItem N1 ... N10. Но как только нажмешь на кнопку с обработчиком событий OnClose, появляется ошибка:
Access violation at address 00608BDF in module. Read of address 00000010
А точнее, на строку Form3.Close;
То есть, при нажатии на кнопку я и так закрыл форму и удалил форму из памяти. А при нажатии на следующею N2...N10, я проверяю на наличие форму, если она есть, то закрываю, по порядку, все формы от 2 до 11, для того чтобы открыть другую которую хочу открыть. Вот такой замысел.
Вопрос в следующем.
Что не так делаю, чем смогли бы помочь?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2017, 20:54
Ответы с готовыми решениями:

Повторное открытие главной формы
Есть главная форма Form1, в событии onShow которой прописано открытие модальной формы Form2. По...

Открытие других форм
Хочу чтобы при нажатии на кнопку, появлялась другая форма, а эта закрывалась. Как закрывать я...

Закрытие и открытие форм
Есть 2 формы. На 1 форме есть кнопка, она открывает 2 форму и на 2 форме есть кнопка , она...

Открытие форм из BDGrid
Имеется Form1 с BDGrid в котором три поля 'KSK' 'Lift' 'Domofon' . Нужно чтоб при нажатий на...

11
3629 / 3088 / 828
Регистрация: 29.08.2013
Сообщений: 20,575
Записей в блоге: 2
26.09.2017, 21:17 2
а чему равна Form3 при старте?
может она не равна nil и ты пытаешься закрыть несуществующее?

при старте нужно заnil'ить переменные

PS а вообще если в коде ты пишешь одно и тоже более 3х раз, то надо подумать и переписать
0
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 170
26.09.2017, 21:32  [ТС] 3
при компиляции все формы равны nil. К примеру, открываю Form2, при нажатии на N1. Потом открываю Form3, при нажатии на N2. И так далее до последней. Все работает нормально. Только стоит нажать на кнопку, вызывается обработчик OnClose и форма, ту которую открыл, закрывается и получается nil. И при нажатии следующего N(2...10) дохожу до строки Form3.Close; идет ошибка.
Прошу предложи другой способ решения, как можно выполнить такую идею. Если этого не делать, то форма не закрывается. Для чего я делаю проверку? if Form3 <> nil then //Сколько форм столько и проверок
для того, что я не знаю последовательность, какую новую форму захочет открыть пользователь, чтобы закрыть предыдущею.
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
26.09.2017, 22:38 4
Если у вас у всех Action:=caFree; - то нафига вам вообще глобальные переменные вида Form3?

Опишите подробно словами какого поведения хотите добиться.
0
314 / 267 / 87
Регистрация: 27.05.2017
Сообщений: 1,350
26.09.2017, 22:46 5
Цитата Сообщение от kabachok Посмотреть сообщение
и форма, ту которую открыл, закрывается и получается nil.
Проблема в том, что - нет. nil не получается.
1
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
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
Сообщений: 170
27.09.2017, 21:12  [ТС] 7
Коллеги krapotkin, GoodWeather, а с чего вы взяли, что
Цитата Сообщение от krapotkin Посмотреть сообщение
глобальные переменные Form1, Form2 ... FormXXX
я создал? Про это и слово не сказал.
Я удалил ВСЕ формы, кроме главной, из Auto-Create forms в Available forms.
При нажатии кнопки в MainMenu1, я открываю уже созданную форму, в которой я вам хотел показать некоторые моменты в виде
Delphi
1
2
3
4
5
6
7
8
9
10
Form2 := TForm.Create(Form1);
   with Form2 do
   begin
      Parent := Form1;
      Align := alClient;
      BorderStyle := bsNone;
      WindowState := wsMaximized;
      OnClose := Form2Close;
      Show;
   end;
Тем самым я хотел Вам показать, что форма 2 открывается в пределах формы 1, а не поверх неё. И у формы 2 нет BorderStyle, что форма 2 растянуто внутри границ формы 1 по всему экрану. И при нажатии на кнопку выхода, расположенную на форме 2, форма разрушается. А при нажатии на очередную кнопку в MainMenu1 появляется ошибка.
Вот тут я склоняюсь к ответу Massaraksh7, что
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Проблема в том, что - нет. nil не получается.
Так ли это?
Если это так, то как быть, что могли бы предложить?
Но мне так же понравился ответ krapotkin, но я понимаю, что речь идет о пять же о глобальных переменных, динамически созданных формах и удалении их.
Но я хочу понять, не то как создавать и удалять формы, а как проверить существуют ли открытые формы и если они существуют, разрушить их и открыть другую форму.
0
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
27.09.2017, 21:18 8
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.RunForm2;
var f2:TForm2;
begin
  f2:=TForm2.Create(Form1);
  with f2 do
  begin
     ....
  end;
end;
вот и все
0
314 / 267 / 87
Регистрация: 27.05.2017
Сообщений: 1,350
27.09.2017, 21:27 9
Цитата Сообщение от kabachok Посмотреть сообщение
Вот тут я склоняюсь к ответу Massaraksh7
krapotkin, фактически, сказал то же самое.
Вообще, я бы посоветовал завести на каждую форму отдельную глобальную переменную, которой в секции Create присваивал True, а в секции Destroy - False.

Добавлено через 5 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.RunForm2;
var f2:TForm2;
begin
  f2:=TForm2.Create(Form1);
  with f2 do
  begin
     ....
  Show;
  end;
end;
вот и все
Вот это, как раз, сомнительно. Мы выйдем из процедуры, форма останется, а стек затрется.
0
4 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 170
27.09.2017, 21:31  [ТС] 10
Честно говоря Вы меня запутали. Вот часть кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm_Logistika.N2Click(Sender: TObject);
begin
  if Form_NashaKompaniua <> nil then
  begin
    Form_NashaKompaniua.Close;
  end;
 
 
  Form_SpisokKontragentov := TForm_SpisokKontragentov.Create(Form_Logistika);
  Form_SpisokKontragentov.Parent := Form_Logistika;
 
  Form_SpisokKontragentov.Show;
end;
Ошибка на -> Form_NashaKompaniua.Close;
0
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
27.09.2017, 21:59 11
зачем вы пихаете форму в форму (parent) ??

зачем нам иметь глобальные переменные ?

ошибка. ну еще же раз
вы в OnClose делаете форме Free ?
А переменная останется. А форма уже уничтожится
1
пофигист широкого профиля
4339 / 2845 / 810
Регистрация: 15.07.2013
Сообщений: 16,508
28.09.2017, 02:28 12
Цитата Сообщение от kabachok Посмотреть сообщение
Честно говоря Вы меня запутали. Вот часть кода:
Это вы нас пытаетесь запутать "по самые помидоры". Прикрепите лучше архив с проектом к сообщению.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2017, 02:28

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Открытие форм при запуске программы
При открытии программы открывается 2 формы, я хотел скрыть вторую, так как она должна открываться...

Хитрое открытие форм, запутался в 3-х строчках кода
Здравствуйте уважаемые программисты. Что-то я заблудился в 3-х строчках кода, плюсик за мной! ...

Повторное открытие программы
Я пишу прогу на Delphi 7 (текстовый редоктор, в котором сразу можно открывать несколько окон). Как...

Повторное открытие формы после ее закрытия
Привет. Помогите с проблемкой. У меня имеется программа, работает отлично НО... в проге есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.