Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
3-57640
Boozmakov
2002-03-24 19:13
2002.04.18
Real-time формирование ConnectionString для ADOConnection


3-57580
Юра
2002-03-26 16:41
2002.04.18
Cвязывание таблиц


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


14-57885
Nazya
2002-03-11 20:14
2002.04.18
Мастера да помогите уже на конец ! ПЛЗ


1-57820
SeF
2002-04-07 02:33
2002.04.18
SSRROOCCHHNNOO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский