Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.18;
Скачать: CL | DM;

Вниз

Динамическое окно   Найти похожие ветки 

 
Vitalik ©   (2002-04-06 20:38) [0]

Привет!
Вот писал я, писал программу и вдруг у меня появилась ошибка. Я вроде бы и знаю откуда она, но мне нужен совет, как её обойти, чтобы не пришлось переделывать саму концепцию программы.
В общем есть у меня форма, на ней лежит ListBox. Форма создаётся не при запуске программы (т.е. её запуск отменён в project.dpr), а она сущетвует в качестве поля у одного из моих объектов. Т.е.:
type
MyObj = object
******
form: TForm2;
******
end;
А создаётся она только тогда, когда она нужна. Это такое всплывающее окно со списком. Пользователь должен будет выбрать из списка и, нажав Enter, закрыть окно.
создаётся окошко так:
with MyObj do
begin
form:=TForm2.create(application);
form.OnClose:=PopClose; //То есть процедура закрытия описана не в нутри класса TForm2;
form.ListBox1.OnKeyDown:=OnSelectLine; //И эта тоже.
form.showmodal;
end;
Процедура нажатия клавиши в ListBox1:
procedure MyObj.OnSelectLine(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If key=13 then
begin
******************
self.form.close;
end;
end;
И обработчик события OnClose для TForm2:
procedure MyObj.PopClose(Sender: TObject; var Action: TCloseAction);
begin
self.form.free; //удаляем окно из памяти.
self.form:=nil; //устанавливаю этот указатель в nil, чтобы потом, в другом месте программы, мне было легче определить существует ли уже это окно или нет. Кстати, я тут немного сомневаюсь: можно так делать? Не остаётся ли чего лишнего в памяти, после того как я указатель на форму в nil определяю?
end;


Ошибка, очевидно, появляется таким образом: Пользователь выбирает из списка в ListBox1 строку, нажимает Enter, запускается метод OnSelectLine, который вызывает метод PopClose, при этом сам метод OnSelectLine помещается в стек. В процедуре PopClose окно из памяти удаляется, происходит выход из процедуры PopClose и переход обратно в OnSelectLine - один из методов уже несуществующего ListBox1, который находится на несуществующей форме. Отсюда, видимо, и ошибка. Так вот, как бы мне обойти получше такой момент? И вообще правильно ли я рассуждаю? Может быть ошибка из-за чего-то другого и думать о её устранении нужно в другом направлении? И ответтье пожалуйста на вопрос о nil, который я задал выше.
Большое спасибо всем кто откликнется!


 
Anatoly Podgoretsky ©   (2002-04-06 20:47) [1]

Вообще то странное смешение двух рахных моделей Class м Object.
Но нельзя уничтожать форму из ее обработчика.


 
Vitalik ©   (2002-04-06 21:37) [2]

ну на самом деле MyObj - это тоже класс.
А а что странного в том, если бы MyObj был бы действительно объект?


 
Anatoly Podgoretsky ©   (2002-04-06 21:40) [3]

Vitalik © (06.04.02 21:37)
Странно смешение, а почему приводишь неверную информацию



Страницы: 1 вся ветка

Текущий архив: 2002.04.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
1-57763
Stexen
2002-04-04 22:11
2002.04.18
TStream!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1


1-57690
lipskiy
2002-04-07 15:34
2002.04.18
Как определить доступность каталога для записи?


14-57869
dima_
2002-03-11 13:35
2002.04.18
Подскажите как перенести текст из Тmemo в memo ячейку таблицы...


14-57872
ATLANTIDO
2002-03-07 18:45
2002.04.18
Комп. Клуб


3-57639
KB
2002-03-28 07:42
2002.04.18
Помогите плиз!!!