|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Динамическое удаление объектов
Здравствуйте все, кто решил сюда заглянуть.
Хочу сразу сказать, что в Делфи я новичок, изучал его самостоятельно, по разным книжкам и в институтах да университетах программированию (имею ввиду программированию вообще) меня не учили. Здесь я тоже впервые. Пытался найти решение своей проблемы через поиск, но не нашел. Не только здесь, но и в интернете. Видимо, я первый с такой проблемой. Собственно проблема вот в чем: Пишу программу для работы с текстом из динамически создаваемой формы. Т.е. поля для заполнения создаются самой программой в процессе своей работы, потом по нажатию кнопки все введенный данные из всех объектов записываются в файл. Это вроде бы все работает. Если пользователь хочет создать новую карточку, то он нажимает на кнопки и форма должна обновиться, т.е. появляются начальные объекты на форме. Новые уже добавляются потом. Объекты находятся на панели TPanel1. При нажатии кнопки, чтобы удалить все разом, я делают так: TPanel.free; А потом программа динамически опять создает эту же панель и выстраивает на ней форму. Сразу скажу - если тыкать по кнопке мышью - все работает! Но начальство хочет, чтобы сие работало также при нажатии горячих клавиш. И тут проблема. Собственно процедура: Код:
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) and (key = 78) then begin NewModul; end; end; NewModul - процедура, где находится собственно Panel1.free и другие операторы, создающие новую форму. Если форма изначальная, т.е. пользователь не успел добавить ни одного динамического объекта, то все работает. Если добавлен хоть один, то возникает ошибка: Project nabor.exe raised exception class $C0000005 with message 'accees violation at 0x00455bab: read of address 0x00000000' Блин, перепробовал уже наверное все, но в чем дело так и не понял. Самое интересное, что если в окне, описывающем ошибку, нажать кнопку "Continue", то программа сработает как надо. Пробовал запускать собственно exe'шник - тоже выдает окно с ошибкой, но тем не менее все срабатывает. В чем дело, может кто знает? Последний раз редактировалось Admin, 19.12.2013 в 19:58. |
#2
|
||||
|
||||
выложи минимальный проект воспроизводящий ошибку
Пишу программы за еду. __________________ |
#3
|
||||
|
||||
Из всего вышенаписанного я не вижу проблемы. Если не допускать ошибок, то динамическое создание и уничтожение объектов работает безупречно - ошибка где-то в твоём коде - например пытаешься работать с уже уничтоженным объектом или возможно пытаешься дважды уничтожить один и тот же объект.
Хотя у тебя уже есть одна подсказка - посмотри что по адресу 0x00455bab. |
#4
|
|||
|
|||
Цитата:
Честно говоря, даже и не знаю, что Вам выложить, ведь уже все рассказал. В обработчике onClicke кнопки написано: Код:
procedure TMainForm.newButtonClick(Sender: TObject); var Pnl : TPanel; Rich, ObTrEd, ObTelEd : TRichEdit; Ed : TEdit; Bt : TButton; TrSpBt, ObTrSpBT, TelSpBt : TSpeedButton; begin Panel1.Free; //тут удаляю панель, на которой раньше находилась форма вместе со всеми объектами сразу Pnl := TPanel.Create(mainform); // Создаю на этой же форме эту же панель под тем же именем и теми же свойствами Pnl.Parent := ScrollBox1; Pnl.Top := 3; Pnl.Left := 3; Pnl.Width := 995; Pnl.Height := 294; Pnl.Visible := true; Pnl.Name := 'Panel1'; Pnl.Caption := ''; Pnl.BevelInner := bvNone; Pnl.BevelKind := bkNone; pnl.BevelOuter := bvNone; Rich := TRichEdit.Create(mainform); Rich.Parent := Panel1; ... // Тут уже создаю сами объекты формы на панели. Полностью выкладывать не буду, ибо много объектов, да и код очень похож ... ShapkaEdit.SetFocus; // передаю фокус первому (сверху) объекту, чтобы пользователь сразу же мог начать вводить текст end; Вот, в общем-то, и все. Повторюсь - если кликать мышью по кнопке - все работает без проблем. Если использовать горячие клавиши - то выходит ошибка. Я уже было подумал, что процедуре обязательным параметром должен быть передан вызывающий его объект. Но уже чего не передавал - и саму кнопку, и форму и вообще ничего. В итоге запулил все в отдельную процедуру вообще без параметров - с тем же результатом, т.е. от мыши работает, а от горячих клавиш нет. Думал еще на то, что может какой-то из удаляемых объектов находится в фокусе, так перед удалением панели менял фокус на другой объект, не находящийся на этой панели - с тем же результатом... Чё делать - не понимаю... Последний раз редактировалось Admin, 19.12.2013 в 19:59. |
#5
|
|||
|
|||
Цитата:
Я же говорю, что я еще нуб в программировании. Можешь пояснить популярно, по простому, где можно посмотреть, что находится по этому адресу, что это вообще за адрес и, заодно, как расшифровать что там написано? Или дать ссылку на то, где про это можно почитать? |
#6
|
||||
|
||||
А где описание процедуры NewModul?
|
#7
|
||||
|
||||
Цитата:
|
#8
|
|||
|
|||
Цитата:
Ну так все, что было в newButtonClick я в newModul и перенес. Я же говорю, что создал новую процедуру вообще без параметров, вот это она, newModul, и есть. |
#9
|
|||
|
|||
Цитата:
Сделал, как было сказано. Делфи выдал новое окно под названием CPU и подсветил там строчку, в которой прописано: 00455BAB 8B08 mov ecx, [eax] Есть подозрение, что это ассемблер. Т.е. вообще для меня темный лес... |
#10
|
||||
|
||||
Цитата:
Цитата:
|
#11
|
|||
|
|||
Цитата:
Попробовал еще раз. Тот же адрес, то же содержание... Цитата:
Счас попробовал чуть по другому. Кинул на форму левую кнопку. Во время выполнения программы, перед тем, как нажать горячие клавиши, мышью передал фокус на эту кнопку. ВСЕ СРАБОТАЛО!!! Но, почему-то, когда программно пытают передать фокус на нее, опять ничего не работает... Блин... Теперь точно уверен, что дело в фокусе (каламбур, однако), но как с ним справится? |
#12
|
||||
|
||||
Цитата:
|
#13
|
|||
|
|||
Цитата:
Если Вы не против, могу попытаться отправить Вам листинг и exe'шник программы на почту. Вполне возможно что я плохо объясняю, либо что-то забыл добавить к своим словам... Если Вы дадите адрес своей почты |
#14
|
||||
|
||||
Цитата:
|
#15
|
|||
|
|||
Цитата:
http://zalil.ru/34859382 - тут листинг программы в txt файле http://zalil.ru/34859386 - на всякий случай проект полностью в архиве |