Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.296 c
14-98294
still
2002-09-04 14:05
2002.09.30
Опять про железо


6-98244
yar
2002-07-26 13:45
2002.09.30
Client/Server - новые веяния


1-98042
Semion
2002-09-19 07:15
2002.09.30
Pchar в String


4-98416
MDRLab
2002-08-13 21:04
2002.09.30
CD ROM: открыть - закрыть.


3-97982
Gaber
2002-09-09 14:03
2002.09.30
Сравнение двух полей, двух разных таблиц





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский