Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

MDI приложение   Найти похожие ветки 

 
Dmitriy Polskoy ©   (2002-09-18 14:28) [0]

Ситуация такая: есть MDI приложение. Каждая дочерняя форма создается как экземпляр некой формы TMDIChild. В этой форме создаются стринглисты, данные из которых отображаются в StringGrid. Эти стринглисты уничтожаются после закрытия формы. Но возникает проблема - когда я закрываю хоть одну форму, то возникает ошибка доступа к памяти. Подскажите, что надо сделать, чтобы такого небыло?


 
REA   (2002-09-18 14:30) [1]

Код нужен обработчиков MDI формы. Убиваешь наверно что-то раньше времени. Пройдись отладчиком.


 
Digitman ©   (2002-09-18 14:33) [2]


> ошибка доступа к памяти


На какой строчке ?


 
Dmitriy Polskoy ©   (2002-09-18 14:37) [3]

Вот кусок кода из процедуры обработки OnDrawCell
if ShowListParam.Strings[l_Row - 1][1] = "#" then
begin
grdShowData.RowHeights[l_Row] := 22;
Canvas.Brush.Color := clYellow;
Canvas.Font.Style := Canvas.Font.Style + [fsBold];
Canvas.Font.Size := 11;
end
Ошибка выскакивает на первой строке, т.е. такое впечатление, что когда я убиваю одну форму, то уничтожаются все стринглисты во всех дочерних окнах.


 
Dmitriy Polskoy ©   (2002-09-18 14:51) [4]

Мне кажется я понял в чем ошибка - я создаю экземпляры форм используя одну и ту же переменную(Child: TMDIChild). Поэтому когда я закрываю хоть одну форму, то все данные уничтожаются.
В этом случае возникает следующий вопрос - как организовать перечень имен(ну, можно массивом, конечно) и как сказать главной форме с каким именем работать в данный момент?


 
Digitman ©   (2002-09-18 14:56) [5]

имен чего ?


 
Dmitriy Polskoy ©   (2002-09-18 15:06) [6]

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


 
Digitman ©   (2002-09-18 15:14) [7]


> Имен дочерних форм.


А зачем они тебе нужны ? разве ты по имени обращаешься к методам/св-вам/событиям формы ? ты обращаешься к переменной, имеющий тип "класс доч.формы" и хранящей ссылку на "экземпляр доч.формы".
Так и заведи себе переменную типа массив, и при создании очер.доч.формы заполняй очередной эл-т массива ссылкой на экз-р формы ! А обращаться будешь так : МойМассив[i-й элемент].Caption := ...
А при уничтожении доч.формы просто не забудь уничтожить и соответствующий эл-т массива


 
Старый Паскалист   (2002-09-18 15:20) [8]

2Digitman ©
Вообще-то, такой массив уже есть: Form.MDIChildren[I];


 
Dmitriy Polskoy ©   (2002-09-18 15:24) [9]

2 Старый Паскалист (18.09.02 15:20)
Да, но как узнать индекс активной формы?


 
Digitman ©   (2002-09-18 15:30) [10]

>Старый Паскалист

Да мало ли чего еще есть) ... можно и им воспользоваться (кто ж спорит ?), можно и свой собственный массив вести в дополнение и ли как альтернатива ...

Св-во MDI-формы ActiveMDIChild возвратит тебе ссылку на активную доч.форму ... ищи эту ссылку, скажем, перебирая в цикле эл-ты того же массива MDIChildren[] - индекс совпадающего эл-та и есть индекс ссылки на активную доч.форму, хранящейся в дан.массиве


 
Dmitriy Polskoy ©   (2002-09-18 15:32) [11]

2 Digitman © (18.09.02 15:14)
Проблема как раз в том, что при создании нескольких форм переменная, имеющая тип "класс доч. формы" будет ссылаться на НЕСКОЛЬКО экземпляров форм. И при уничтожении одного все данные падают.


 
Dmitriy Polskoy ©   (2002-09-18 15:43) [12]

Я извиняюсь, что может быть не коректно выссказал задачу. Есть главная форма, внутри которой есть переменная Child: TMDIChild (c типом доч. формы). При нажатии на кнопку Open происходит: Child := TMDIChild.Create(Application);
Каждая доч. форма имеет в себе стринглисты, в которые читаются данные РАЗНЫЕ для каждой формы. Т.е. это не классичесское MDI-приложение. Получается, что при каждом создании доч. формы перекрывается текущее значение указателя Child. Видите в чем проблема?


 
Старый Паскалист   (2002-09-18 15:54) [13]

>Есть главная форма, внутри которой есть переменная Child: >TMDIChild (c типом доч. формы).

Вот этого-то как раз делать нельзя. Категорически.
Общайтесь с детьми через зендер или через МДИЧилдрен


 
Digitman ©   (2002-09-18 15:57) [14]


> Видите в чем проблема?



А как же ! Видим-видим)....

И кто ж тебя заставляет "наступать на грабли" , выполняя N раз вот это : Child := TMDIChild.Create(Application) ? Зачем тебе эта самая переменная Child нужна-то ?

"безграбельных" вариантов-то как минимум два :

1. TMDIChild.Create(Application);
ссылка на доч.форму фиксируется автоматически во вновь создаваемом эл-те встроенного массива MDIChildren[], через этот элемент в последствии и обращайся к дан.экз-ру класса доч.формы

2. МойМассив[i] := TMDIChild.Create(Application);
Кроме доступа к новой форме по варианту 1 можешь в последствии обращаться к этой же форме как к i-му элементу собственного массива МойМассив[]




 
Dmitriy Polskoy ©   (2002-09-18 16:00) [15]

2 Старый Паскалист (18.09.02 15:54)
Простите за тупой вопрос(никогда не писал на Дельфи MDI-приложения), но как это сделать?


 
Dmitriy Polskoy ©   (2002-09-18 16:09) [16]

2 Digitman © (18.09.02 15:57)
Все равно выскакивает первая ошибка.


 
Digitman ©   (2002-09-18 16:27) [17]

Что есть ShowListParam ? Где и как объявлен/инициализируется ?


 
Dmitriy Polskoy ©   (2002-09-18 16:46) [18]

2 Digitman © (18.09.02 16:27)
ShowListParam - это стринглист. Пержде чем его заполнить, я заполняю другой стринглист данными из файла(а путь к файлу беру из OpenDialog). Т.е. я нажимаю на кнопку Open на главной форме,
вызывается OpenDialog, из него я читаю путь, затем создаю экземпляр дочерней формы, затем в дочерней форме в стринглист читаю данные из файла, произвожу кой-каие вычисления и заношу их
в ShowListParam(из него данные отображаются в StringGrid). В процедуре закрытия доч. формы я уничтожаю все стринглисты.


 
Digitman ©   (2002-09-18 16:56) [19]

Ну где объявлен-то ?в каком модуле ? в модуле доч.формы ? или где ? и в каком разделе модуля ?


 
Dmitriy Polskoy ©   (2002-09-18 17:13) [20]

Вроде исправил глюк, перенеся объявление из Var-а модуля доч. формы в ее класс. А создаю через
> TMDIChild.Create(Application);

Но теперь из главной формы не могу доступиться к методам дочерней формы. ActiveMDIChild и ActiveMDIChild не возвращают указателя именно на мой класс формы.


 
Старый Паскалист   (2002-09-18 17:17) [21]

>Вроде исправил глюк, перенеся объявление из Var-а модуля доч. >формы в ее класс.

Понятненько...
Вообще не используй глобальные данные без особой необходимости.

>ActiveMDIChild и ActiveMDIChild не возвращают указателя именно >на мой класс формы.

(ActiveMDIChild as TYourMDIChildForm).MethodOfYourMDIChild;
или
with (ActiveMDIChild as TYourMDIChildForm) do...


 
Digitman ©   (2002-09-18 17:22) [22]

>Dmitriy Polskoy

Ну дык !))
Почуял разницу ? Аль нет ?)

P.S.

Слухай <Старого Паскалиста>, он - ста-а-а-арый паскалист !!))))(


 
Dmitriy Polskoy ©   (2002-09-18 17:25) [23]

2 All
Ой, спасибо, ой, помогли. На самом деле - СПАСИБО.


 
Digitman ©   (2002-09-18 18:40) [24]

да не за что)...

носи - не стаптывай !)))))


 
Старый Паскалист   (2002-09-18 19:15) [25]

2Digitman © (18.09.02 17:22)
Да не такой я уж и старый. Моложе некоторых.



Страницы: 1 вся ветка

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
1-98151
Shrek
2002-09-17 17:21
2002.09.30
Помогите с буфером!


14-98271
Бармен
2002-09-03 12:20
2002.09.30
Срочно нужен анекдот на тему смены работы


3-97961
KIR
2002-09-09 01:36
2002.09.30
Как такое возможно??? (запрос перестал работать)


14-98282
Елена
2002-09-03 06:25
2002.09.30
Менеджеры закачек


14-98274
PUNKER
2002-07-30 23:34
2002.09.30
Помогите с DELPHI !!!!!!!!!!!!