9 / 9 / 12
Регистрация: 17.01.2018
Сообщений: 281
1
RAD XE3+

Как уничтожать динамические объекты и вообще объекты, если это необходимо сделать в их процедурах?

27.05.2018, 22:23. Показов 4001. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать отдельную процедуру CloseObject(Object: TObject) и вызывать ее в конце процедуры или так тоже нельзя? А то бесят эти access violation, то их нет, то потом появляются и хрен поймешь откуда, а потом оказывается что в процедуре удаляется объект, которому принадлежит эта процедура.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2018, 22:23
Ответы с готовыми решениями:

Нужно ли уничтожать объекты после их использования?
Всегда считал, что после выполнения php скрипта, все его объекты (переменные, массивы и т.д.)...

Как сделать, чтобы объекты не выделялись, если на них кликнуть мышкой?
При нажатии на кнопку(или другие объекты) событие OnClick должно быть вызвано, но пунктирная линия...

как можно сделать это? если вообще возможно (не задача)
есть задача, на двумерный массив... вывел массив 5х5 с рандомными числами, нужно найти числа...

Как сохранить динамические объекты после завершения программы
Всем доброго времени суток. У меня программе пользователь, например, может добавить Label и задать...

21
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
27.05.2018, 22:29 2
если объекты "необходимо" удалять в их собственных методах, то это означает - никудышний алгоритм и конструкция программы. никогда так не делай

Цитата Сообщение от WarlikeLaux Посмотреть сообщение
оказывается что в процедуре удаляется объект, которому принадлежит эта процедура
выше написал уже

а по поводу "оказывается" - ржунимагу! ты же пограммист, ты писал эту процедуру, как это может быть для тебя неожиданностью?!
0
9 / 9 / 12
Регистрация: 17.01.2018
Сообщений: 281
27.05.2018, 22:36  [ТС] 3
Цитата Сообщение от DenNik Посмотреть сообщение
если объекты "необходимо" удалять в их собственных методах, то это означает - никудышний алгоритм и конструкция программы. никогда так не делай
DenNik, и как мне интересно, к примеру, удалить форму по нажатию кнопки (в моем случае, это кнопка продолжить главного меню) или кнопку по нажатию на нее (после нажатия кнопки "Начать игру" она благополучна должна отправиться на небеса и без всяких отголосков в виде этих тупых ошибок access violation)? Это логично в принципе и здравому смыслу не противоречит.
Цитата Сообщение от DenNik Посмотреть сообщение
как это может быть для тебя неожиданностью?!
DenNik, ну я забыл, что из-за этого могут быть ошибки, вот и получилось так.
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
27.05.2018, 23:17 4
Цитата Сообщение от WarlikeLaux Посмотреть сообщение
кнопку по нажатию на нее (после нажатия кнопки "Начать игру" она благополучна должна отправиться на небеса
когда ты нажимаешь на кнопку, обработчик нажатия принадлежит форме, а не кнопке

Цитата Сообщение от WarlikeLaux Посмотреть сообщение
как мне интересно, к примеру, удалить форму по нажатию кнопки
Form.Close;
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,467
28.05.2018, 02:18 5
WarlikeLaux, если бы вы привели ваш проблемный код, было проще указать вам на ошибки и объяснить почему этот код ошибочный.
Ну а в качестве бонуса, могу сообщить вам, что есть нормальный вариант уничтожения компонента из его собственного метода. PostMessage его владельцу.
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
28.05.2018, 02:23 6
да, мне аж интересно стало, как это автор так умудрился написать, что
Цитата Сообщение от WarlikeLaux Посмотреть сообщение
в процедуре удаляется объект, которому принадлежит эта процедура.
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,467
28.05.2018, 02:50 7
Цитата Сообщение от DenNik Посмотреть сообщение
да, мне аж интересно стало, как это автор так умудрился написать, что
Цитата Сообщение от WarlikeLaux Посмотреть сообщение
в процедуре удаляется объект, которому принадлежит эта процедура.
Да это сплошь и рядом у новичков.
См.
Цитата Сообщение от WarlikeLaux Посмотреть сообщение
(Удалить) кнопку по нажатию на нее
Это классический пример "как нельзя удалять компоненты".
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
28.05.2018, 03:47 8
Цитата Сообщение от northener Посмотреть сообщение
Удалить) кнопку по нажатию на нее
Это классический пример "как нельзя удалять компоненты".
ну почему же. обработчик нажатия кнопки ведь не является методом самой кнопки. другое дело, что это по сути глупое действие
0
5872 / 4593 / 1451
Регистрация: 14.04.2014
Сообщений: 20,375
Записей в блоге: 20
28.05.2018, 06:58 9
Лучший ответ Сообщение было отмечено WarlikeLaux как решение

Решение

для совершения отложенных действий исторически есть три метода
первый метод - родной для delphi-программистов
завести специально отдельный таймер и в обработчик ему положить то что нужно
на самом деле это скрытый второй метод, родной для windows, (на самом деле тоже для делфи, т.к. там многое так работает)
это послать свое сообщение через post_message(UM_MY_MESSAGE222,0,0,0) своему окну, и в обработчике этого сообщения сделать то что нужно. но таймер это тоже всего лишь отбработчик сообщений WM_TIMER поэтому я и говорю, что это один и тот же вариант
и третий вариант
воспользоваться запуском отдельного потока только лишь для того, чтобы в нем через синхронизацию, выполнить ваше действие )))
в современных версиях
Delphi
1
2
3
4
5
TTask.run(procedure begin
   TThread.Synchronize(NIL, procedure begin 
      ... ваше действие
   end);
end);
но конкретно для форм еще на заре ракетостроения придуман готовый способ
в обработчике OnClose нужно написать
Delphi
1
CloseAction := caFree;
и форма вызовет при закрытии свой деструктор

нужно понимать, что все переменные кроме integer, boolean, других примитивных типов, это ссылки
поэтому переменная Form1 при создании формы это ссылка на область памяти, где лежит объект формы
можно сделать 100 переменных еще, и всем присвоить Form1 и все они будут тоже указывать на эту область
Если теперь мы разрушим форму, но область-то мы разрушить не можем, поэтому все ссылки так и будут указывать на то место где ваша форма была. поэтому обращение к любой из этих переменных либо даст вам AV если эта память еще свободна, либо испортит другие данные, которые уже могли там поселиться
Еще раз. Разрушение объекта ничего не делает с самими переменными!
Поэтому обычно для получения комбо)) вызывают не F.Free а FreeAndNil(F) чтобы в переменную записать NIL
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,467
28.05.2018, 11:58 10
Цитата Сообщение от DenNik Посмотреть сообщение
обработчик нажатия кнопки ведь не является методом самой кнопки
Этот обработчик вызывается из метода Click кнопки.
0
9 / 9 / 12
Регистрация: 17.01.2018
Сообщений: 281
28.05.2018, 15:44  [ТС] 11
Всем спасибо за помощь, решил, что буду использовать PostMessage!)
0
5872 / 4593 / 1451
Регистрация: 14.04.2014
Сообщений: 20,375
Записей в блоге: 20
28.05.2018, 15:49 12
отлично. ждем вопроса "что такое UM_MY_MESSAGE222" ))
надеюсь, в процессе ответа автор выберет все-таки третий способ )))
0
9 / 9 / 12
Регистрация: 17.01.2018
Сообщений: 281
28.05.2018, 15:58  [ТС] 13
krapotkin, неа, я разобрался)
Delphi
1
2
3
4
5
6
7
8
9
const
  DESTROY_OBJ = WM_USER + 1;
//бла бла бла
procedure DESTROY_OBJECT(var Message: TMessage); message DESTROY_OBJ;
//бла бла бла
procedure TForm1.DESTROY_OBJECT(var Message: TMessage);
begin
  TObject(Message.WParam).Free; //изи минус объект
end;
А для формы я нашел процедуру Release, которая не влечет за собой никаких ошибок, вроде как, по крайней мере так пишут на форумах и пока что все норм.
0
5872 / 4593 / 1451
Регистрация: 14.04.2014
Сообщений: 20,375
Записей в блоге: 20
28.05.2018, 15:58 14
ого!
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,467
29.05.2018, 03:02 15
Цитата Сообщение от krapotkin Посмотреть сообщение
ого!
А чего так уж ОГО?
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
29.05.2018, 09:35 16
я хренею, господа. пардоньте мой французский!
WarlikeLaux, ты б хотя бы показал свой изначальный код, который приводил к возникновению ошибки!
почему у меня код
Delphi
1
2
3
4
5
procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage('Bye-bye!');
  Button1.Free;
end;
прекрасно работает?

WarlikeLaux, ты сделал вброс, все тебе поверили на слово и кинулись вместе с тобой решать задачу о XYZ!
0
5872 / 4593 / 1451
Регистрация: 14.04.2014
Сообщений: 20,375
Записей в блоге: 20
29.05.2018, 10:08 17
Цитата Сообщение от DenNik Посмотреть сообщение
procedure TForm2.Button1Click(Sender: TObject);
begin
* ShowMessage('Bye-bye!');
* Button1.Free;
end;
плохой код. то, что он не работает у автора, это даже хорошо )))
в FMX например это точно AV ))))
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
29.05.2018, 10:11 18
Цитата Сообщение от krapotkin Посмотреть сообщение
плохой код.
я не спорю. писал уже
Цитата Сообщение от DenNik Посмотреть сообщение
если объекты "необходимо" удалять в их собственных методах, то это означает - никудышний алгоритм
нужно перестраивать архитектуру программы. всегда можно обойтись без удаления компонентов
0
5872 / 4593 / 1451
Регистрация: 14.04.2014
Сообщений: 20,375
Записей в блоге: 20
29.05.2018, 10:17 19
тут не согласен
я всегда подтираю за собой созданные компоненты
правда в основном это фреймы
а создаю их всегда динамически

но очень редко объект уничтожает себя сам. точнее, никогда, кроме TThread.
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
29.05.2018, 10:29 20
Цитата Сообщение от krapotkin Посмотреть сообщение
но очень редко объект уничтожает себя сам
я это и имел в виду )

а по поводу "сам себя". опять же пример с кнопкой. нажатие на кнопку ведь не приводит к выполнению метода кнопки. выполняется ведь метод формы. кнопка просто инициирует его выполнение. и поэтому вопрос
Delphi
1
2
3
4
5
procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage('Bye-bye!');
  Button1.Free;
end;
почему этот код плохой? если вызов деструктора последней строкой процедуры

Добавлено через 28 секунд
Button1Click - это же метод формы

Добавлено через 1 минуту
почему, елсли я напишу
Delphi
1
2
3
4
5
procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage('Bye-bye!');
  Button2.Free;         // это правильно, да?
end;
то это будет верно?
0
29.05.2018, 10:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2018, 10:29
Помогаю со студенческими работами здесь

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты?
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции...

Как обменять два элемента массива местами если эти два элемента это объекты?
как обменять два элемента массива местами если эти два элемента это объекты?

Динамические объекты
Почему в Qt объекты создаются в динамической памяти?Чтобы можно было выполнять их удаление во время...

Динамические объекты
Доброго времени стуок! Мне впервые пришлось столкнутся с созданием динамических объектов поэтому...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru