![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI приложение [D6, Win2k]
Dmitriy Polskoy © (2002-09-18 14:28:00)Ситуация такая: есть MDI приложение. Каждая дочерняя форма создается как экземпляр некой формы TMDIChild. В этой форме создаются стринглисты, данные из которых отображаются в StringGrid. Эти стринглисты уничтожаются после закрытия формы. Но возникает проблема - когда я закрываю хоть одну форму, то возникает ошибка доступа к памяти. Подскажите, что надо сделать, чтобы такого небыло?
Старый Паскалист (2002-09-18 19:15:00) [1]2Digitman © (18.09.02 17:22)
Да не такой я уж и старый. Моложе некоторых.
Digitman (2002-09-18 18:40:00) [2]да не за что)...
носи - не стаптывай !)))))
Dmitriy Polskoy (2002-09-18 17:25:00) [3]2 All
Ой, спасибо, ой, помогли. На самом деле - СПАСИБО.
Digitman (2002-09-18 17:22:00) [4]>Dmitriy Polskoy
Ну дык !))
Почуял разницу ? Аль нет ?)
P.S.
Слухай <Старого Паскалиста>, он - ста-а-а-арый паскалист !!))))(
Старый Паскалист (2002-09-18 17:17:00) [5]>Вроде исправил глюк, перенеся объявление из Var-а модуля доч. >формы в ее класс.
Понятненько...
Вообще не используй глобальные данные без особой необходимости.
>ActiveMDIChild и ActiveMDIChild не возвращают указателя именно >на мой класс формы.
(ActiveMDIChild as TYourMDIChildForm).MethodOfYourMDIChild;
или
with (ActiveMDIChild as TYourMDIChildForm) do...
Dmitriy Polskoy (2002-09-18 17:13:00) [6]Вроде исправил глюк, перенеся объявление из Var-а модуля доч. формы в ее класс. А создаю через
> TMDIChild.Create(Application);
Но теперь из главной формы не могу доступиться к методам дочерней формы. ActiveMDIChild и ActiveMDIChild не возвращают указателя именно на мой класс формы.
Digitman (2002-09-18 16:56:00) [7]Ну где объявлен-то ?в каком модуле ? в модуле доч.формы ? или где ? и в каком разделе модуля ?
Dmitriy Polskoy (2002-09-18 16:46:00) [8]2 Digitman © (18.09.02 16:27)
ShowListParam - это стринглист. Пержде чем его заполнить, я заполняю другой стринглист данными из файла(а путь к файлу беру из OpenDialog). Т.е. я нажимаю на кнопку Open на главной форме,
вызывается OpenDialog, из него я читаю путь, затем создаю экземпляр дочерней формы, затем в дочерней форме в стринглист читаю данные из файла, произвожу кой-каие вычисления и заношу их
в ShowListParam(из него данные отображаются в StringGrid). В процедуре закрытия доч. формы я уничтожаю все стринглисты.
Digitman (2002-09-18 16:27:00) [9]Что есть ShowListParam ? Где и как объявлен/инициализируется ?
Dmitriy Polskoy (2002-09-18 16:09:00) [10]2 Digitman © (18.09.02 15:57)
Все равно выскакивает первая ошибка.
Dmitriy Polskoy (2002-09-18 16:00:00) [11]2 Старый Паскалист (18.09.02 15:54)
Простите за тупой вопрос(никогда не писал на Дельфи MDI-приложения), но как это сделать?
Digitman (2002-09-18 15:57:00) [12]
> Видите в чем проблема?
А как же ! Видим-видим)....
И кто ж тебя заставляет "наступать на грабли" , выполняя N раз вот это : Child := TMDIChild.Create(Application) ? Зачем тебе эта самая переменная Child нужна-то ?
"безграбельных" вариантов-то как минимум два :
1. TMDIChild.Create(Application);
ссылка на доч.форму фиксируется автоматически во вновь создаваемом эл-те встроенного массива MDIChildren[], через этот элемент в последствии и обращайся к дан.экз-ру класса доч.формы
2. МойМассив[i] := TMDIChild.Create(Application);
Кроме доступа к новой форме по варианту 1 можешь в последствии обращаться к этой же форме как к i-му элементу собственного массива МойМассив[]
Старый Паскалист (2002-09-18 15:54:00) [13]>Есть главная форма, внутри которой есть переменная Child: >TMDIChild (c типом доч. формы).
Вот этого-то как раз делать нельзя. Категорически.
Общайтесь с детьми через зендер или через МДИЧилдрен
Dmitriy Polskoy (2002-09-18 15:43:00) [14]Я извиняюсь, что может быть не коректно выссказал задачу. Есть главная форма, внутри которой есть переменная Child: TMDIChild (c типом доч. формы). При нажатии на кнопку Open происходит: Child := TMDIChild.Create(Application);
Каждая доч. форма имеет в себе стринглисты, в которые читаются данные РАЗНЫЕ для каждой формы. Т.е. это не классичесское MDI-приложение. Получается, что при каждом создании доч. формы перекрывается текущее значение указателя Child. Видите в чем проблема?
Dmitriy Polskoy (2002-09-18 15:32:00) [15]2 Digitman © (18.09.02 15:14)
Проблема как раз в том, что при создании нескольких форм переменная, имеющая тип "класс доч. формы" будет ссылаться на НЕСКОЛЬКО экземпляров форм. И при уничтожении одного все данные падают.
Digitman (2002-09-18 15:30:00) [16]>Старый Паскалист
Да мало ли чего еще есть) ... можно и им воспользоваться (кто ж спорит ?), можно и свой собственный массив вести в дополнение и ли как альтернатива ...
Св-во MDI-формы ActiveMDIChild возвратит тебе ссылку на активную доч.форму ... ищи эту ссылку, скажем, перебирая в цикле эл-ты того же массива MDIChildren[] - индекс совпадающего эл-та и есть индекс ссылки на активную доч.форму, хранящейся в дан.массиве
Dmitriy Polskoy (2002-09-18 15:24:00) [17]2 Старый Паскалист (18.09.02 15:20)
Да, но как узнать индекс активной формы?
Старый Паскалист (2002-09-18 15:20:00) [18]2Digitman ©
Вообще-то, такой массив уже есть: Form.MDIChildren[I];
Digitman (2002-09-18 15:14:00) [19]
> Имен дочерних форм.
А зачем они тебе нужны ? разве ты по имени обращаешься к методам/св-вам/событиям формы ? ты обращаешься к переменной, имеющий тип "класс доч.формы" и хранящей ссылку на "экземпляр доч.формы".
Так и заведи себе переменную типа массив, и при создании очер.доч.формы заполняй очередной эл-т массива ссылкой на экз-р формы ! А обращаться будешь так : МойМассив[i-й элемент].Caption := ...
А при уничтожении доч.формы просто не забудь уничтожить и соответствующий эл-т массива
Dmitriy Polskoy (2002-09-18 15:06:00) [20]Имен дочерних форм.
Еще вот попробывал удалять стринглисты в момент закрытия главной формы. Предыдущий глюк изменился - теперь после закрытия одной из форм ругается при обращении к свойствам таблицы