Главная страница
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.009 c
3-57632
AndDem
2002-03-28 13:18
2002.04.18
Date в Oracle


3-57611
bill133
2002-03-22 23:23
2002.04.18
Какая БД лучше


1-57806
LMelkih
2002-04-06 20:09
2002.04.18
Переход на D6


14-57844
KvORubin
2002-03-07 15:40
2002.04.18
Просчёт ВРЕМЕНИ затраченного на интернет !!!


14-57854
Dimedrol
2002-03-11 11:43
2002.04.18
2 винта - 2 системы. Как ?