Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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)
Странно смешение, а почему приводишь неверную информацию




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.018 c
1-57693           esprit_bel            2002-04-01 04:19  2002.04.18  
Про окно


1-57699           Malder                2002-04-04 21:27  2002.04.18  
Как управлять цветами в Паскале ?


3-57617           ZDN                   2002-03-26 08:54  2002.04.18  
Помогите чайнику немытому, пожалуйста!


1-57667           vlv                   2002-04-04 21:32  2002.04.18  
Проблема с MDIForm


1-57741           ymin                  2002-04-05 12:15  2002.04.18  
Кстати а можно ли записать данные допустим в таблице EXCEL