Форум: "Основная";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];
ВнизДинамическое окно Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c