Форум: "Основная";
Текущий архив: 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.008 c