Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизУправление и взаимодействие двух форм Найти похожие ветки
← →
DeepProg (2004-07-03 13:51) [0]Приложение состоит из двух форм.
Главная(Form1) содержит 2 RadioButton, выбор которых определяет внешний вид второй формы(Form2).
Form2 переведена из Auto-Create в Available и ее создание производится
из Form1 в обработчике OnClick кнопки на Form1try
Form2:=TForm2.Create(Self);
with Form2 do begin
if RadioButton1.Checked=true then
begin
.............
{устанавливаются значения Visible для различных компонент}
Width:=186;
Height:=119;
end
else begin
.............
{устанавливаются обратные значения Visible для различных компонент}
end;
end;
Form2.ShowModal;{вообще-то модальная форма мне не нужна, но метод Show ее просто не отображает}
finally
if Assigned(Form2) then Form2.Release;
end;
Сначала внешний вид Form2 я пытался настраивать в ее обработчике OnCreate, но тогда происходит
AccessViolation... на строчке Form2:=TForm2.Create(Self);
В Form2 определены 2 кнопки, которые в зависимости от введенных пользователем параметров снова изменяют внешний вид формы и объеектов на ней. В своих действиях кнопки практически идентичны, просто относятся к разным объектам. Первая кнопка работает всегда нормально, зато при обработке OnClick второй, при попытке изменить размер самой Form2 вызывает ошибку EConverError на строчке Form2.ShowModal; "" is not valid floating point value.
Каковы причины происходящего?
И вопрос более общий: где точно есть информация о том как правильно управлять видом Form2 в сходной ситуации? Откуда к ней обращаться? Откомпилированный exe, конечно работает ровно, благодаря try... finally, но можно ли воспринимать это как должное?
← →
Гаврила © (2004-07-03 14:15) [1]Что не вернго в приведенноьм коде
try
Form2:=TForm2.Create(Self);
надо конструктор вызвать перед try
if Assigned(Form2) then Form2.Release;
проверка не нужна
Разумеется, причина падения не в этом, а в каком то другом участке кода.
> Откомпилированный exe, конечно работает ровно, благодаря
> try... finally, но можно ли воспринимать это как должное?
Поподробнее, что ты имеешь в виду, что такое "ровно" ? блок try finally не подавляет исключения
← →
DeepProg (2004-07-03 15:33) [2]> надо конструктор вызвать перед try
Пример. pls. Вообще этот код тоже взят из примера и
я здесь забыл написатьForm2:=nil;
до try
> что такое "ровно"
Ровно - значит указанные исколючения не прерывают работу приложения и действия с модификацией формы проходят нормально - при компиляции и зауске проекта из Delphi(все, что не получилось в try не вызывает останова), EConvertError не дает толком посмотреть что получается, так как вызывается постояно. Остается только Ctrl+F2.
Уточнение: Идея исользования двух форм такова:
1. Создается главная форма и пользователь посредством RadioButton выбирает с каким видом формы(+ с каким наборои компонентов) он будет работать.
2. Главная форма прячется и появляется вторая форма.
3. Пользователь вводит integer параметр, на основе которого строятся StringGrid"s, в зависимости от размеров которых, меняется и размер формы.
Пользователь может от данного вида формы перейти к другому через соответствующий пункт меню, в функции которого входит:
1) закрытие Form2(именно Close)
2) отображение Form1 для нового выбора
Сколько бы раз я ни переходил на первый вид ошибка не возникает, зато при 2-м переходе ко второму виду и попытке работать с ним - EConvertError.
Кнопки на Form2 также отображаются в зависимости от сделанного выбора в Form1, т.е. каждый вид Form2 имеет только одну Visible, Enabled кнопку.
Ошибка возникает именно при нажатии кнопки на втором виде Form2, а компилятор указывет на код кнопки в Form1. Насколько я понимаю: Form2 к этому моменту уже создана, тогда мне не ясно каким образом ошибка возникает, в уже отработавшем OnClick Button на Form1.
-----------------------
почти оффтопик(но про управление видом формы :) : есть ли простая, даже стандартная реализация изменения одинакового свойства у разных объектов(eg. Visible fo Labels, Grids etc.) или нужно писать процедуру типа http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988624934&n=16 - мне не нужно делать это для всех компонентов, но для определеннойт группы. - если вдруг сразу знаешь.
← →
DeepProg (2004-07-04 13:45) [3]Есть еще и проблема огбработкой попыток закрыть ту или иную форму.
1. при попытке закрыть форму, именно нажатием на biClose Form2 нужно вызвать диалог о закрытии приложения вообще или только данного вида Form2, с переходом к Form1.
2. Есть еще пункт меню, который предусматривает строго переход к Form1 с уничтожением Form2.
Пункты 1 и 2 несколько противоречат друг другу. Противоречие можно было бы обойти, если учитывать, откуда пришела комана закрыть форму:
- из меню Form2 в смысле перехода к заставке
- из меню Form2 в смысле закрыть все приложение
- нажатием biClose на Form2.
Просто обработкой событий OnClose и OnCloseQuery все получается довольно криво + меню перехода к Form1 будет тоже выводить диалог о звкрытии приложения, который по-хооршему появляться не должен.
Может кто-нибудь разрабатывал подобное взаимодействие или видел статью по этой теме? В общем требуется manual по упралению формами в SDIюНаверное стоит применить WinAPI...
Хотя бы направление подскажите, pls.
← →
KSergey © (2004-07-04 14:55) [4]Не смотря на приведенный кусок кода хочется все же сказать "ошибка в 17-й строке".
Т.к. те глюки, о которых вы рассказываете приведенным кодом вызваны быть не могут
Смотрите свои обработчики событий и т.д.
Шаблон динамического создания/уничтожения формы я бы привел такой:Form2 := TForm2.Create (nil); // по-моему, nil здесь наиболее уместно, все равно сами тут же и уничтожим
try
Form2.SomeMetod;
Form2.SomeProperty := SomeVal_1;
Form2.SomeComponent.SomeProperty := SomeVal_2;
...
Form2.ShowModal;
...
finally
Form2.Free;
end;
Либо даже так, мне наиболее симпатично, но в только в случае не пересекаемости имен компонент, надо с этим поосторожнееwith TForm2.Create (nil)do
try
SomeMetod; // тут это уже все методы класса TForm2!
...
ShowModal;
finally
Free;
end;
Тут нет необходимости явно определять переменную. Не всегда такое, правда, удается, зависит от надобности.
> {вообще-то модальная форма мне не нужна, но метод Show ее
> просто не отображает}
По поводу "не отображает" - вранье наглое.
Просто разберитесь толком чем эти методы отличаются. В отладчике по шагам походите.
← →
GuAV © (2004-07-04 20:24) [5]
> есть ли простая, даже стандартная реализация изменения одинакового
> свойства у разных объектов(eg. Visible fo Labels, Grids
> etc.)
Стандартной AFAIK нет.
Если какое свойство менять тоже заранее знаешь
, то писать типа так:procedure SetVisible(const A: array of TControl; Value: Boolean);
var I: Integer;
begin
for I:=0 to High(A) do A[I].Visible:=Value;
end;
...
SetVisible([Grid1,memo1,form2],false);
← →
DeepProg (2004-07-05 22:12) [6]GuAV
Спасибо. Буду иметь ввиду
KSergey
Ваш ли метод создания, я в частности проnil
, или добавление третьего вида, но глюк с переходом вроде прошел(извините за каламбур) Так что ThanX.
А вот с закрытием пришлось остановиться на обязательно всплывающей заставке...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c