Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI приложение [D6, Win2k]


Страницы:   1 2

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]

Имен дочерних форм.
Еще вот попробывал удалять стринглисты в момент закрытия главной формы. Предыдущий глюк изменился - теперь после закрытия одной из форм ругается при обращении к свойствам таблицы


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо