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

Вниз

Управление и взаимодействие двух форм   Найти похожие ветки 

 
DeepProg   (2004-07-03 13:51) [0]

Приложение состоит из двух форм.
Главная(Form1) содержит 2 RadioButton, выбор которых определяет внешний вид второй формы(Form2).
Form2 переведена из Auto-Create в Available и ее создание производится
из Form1 в обработчике OnClick кнопки на Form1
try
  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
1-1088675282
dimon_programmer
2004-07-01 13:48
2004.07.18
Доступ к папке Windows


6-1085039627
GroZ
2004-05-20 11:53
2004.07.18
странная проблема с сокетами:


1-1089017358
INTAARI
2004-07-05 12:49
2004.07.18
Как показать и скрыть hint объекта Shape когда надо


3-1087809669
xmrz
2004-06-21 13:21
2004.07.18
MS SQL 7.0 DST пакет - не запускается через Job


14-1088645857
QuasiLamo
2004-07-01 05:37
2004.07.18
Цвет значению





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