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

Вниз

Насчёт модальной формы   Найти похожие ветки 

 
Anonim-777   (2003-10-29 01:52) [0]

Я решил добавить новую форму к проекту, возниели проблемы:
- При открытии проекта нужно вторую форму и модуль открывать отдельно, а сами не открываются.
- Не работает такое - я сделал в разделе initialization такое:
Form2.ShowModal;
А она пишет - ошибка...
Мне нужно модальную форму при запуске показать, получить от пользователя данные, передать в первую форму, закрыть модальную форму...
Помогите


 
KyRo   (2003-10-29 02:00) [1]

Может ты ее добавил как новый проэкт ??
Иначе все должно работать без проблем.


 
Anonim-777   (2003-10-29 02:04) [2]

Ну просто в проекте: File->New->Form
А как передавать инфу из одной формы во вторую?


 
KyRo   (2003-10-29 02:08) [3]

Можеш открыть файл проекта удалить от туда
Application.CreateForm(TForm2,Form2);
А на главной форме на реакцию кнопки которой ты вызываеш вторую форму прописать
Application.CreateForm(TForm2,Form2);
try
Form2.ShowModal;
except
Form2.Free;
end;
Передовать данные между формами можно при помощи компонентов
Edit,Label ..


 
Anonim-777   (2003-10-29 02:10) [4]

А если я хочу переменную передать? Или массив?


 
KyRo   (2003-10-29 02:18) [5]

Ну тогда можеш попробовать создать процедуру и в нее передать
параметры из одной формы в другую.


 
Anonim-777   (2003-10-30 00:29) [6]


> параметры

А как их передавать? Есть реальный пример?


 
KyRo   (2003-10-30 02:03) [7]

Просто объявляеш в interface
функцию или процедуру
procedure имя(V1:тип,V12:тип,V3:тип,и.т.д)
и глобальные переменные.
После чего в implementation
пишеш тело функции где глобальным переменным присваиваеш значение параметров и юзаеш уже переменные.
И вызываеш процедуру из первой формы примерно так
Form2.имя(параметры которые передаеш)


 
Кщд   (2003-10-30 06:24) [8]

with ModalForm do
begin
ShowModal;
if ModalResult=mrOK then
begin
a:=Edit1.Text;//a - переменная вызвавшей формы, Edit1 - компонент с модальной
...
end;
free;// по необходимости
end;


 
KyRo   (2003-10-30 09:02) [9]

Через ModalResult вообще то можно прописать весь код вызваной формы в модальном юните. Но это не всегда подходит.
А передать через компоненты например масив,или запись,множество
очень сложно


 
Zacho   (2003-10-30 09:09) [10]


> KyRo © (30.10.03 09:02) [9]
> Через ModalResult вообще то можно прописать весь код вызваной
> формы в модальном юните.

Чего ???

> А передать через компоненты например масив,или запись,множество
> очень сложно

Чего ???
В чем сложность-то ? И что такое "передать через компоненты" ?


 
KyRo   (2003-10-30 09:26) [11]

Ну в смысле через Edit;
Есле у тебя масив на 50 - 100 и больше елементов ты их будеш передовать по одному ??
А:=Edit.text; ??


 
KyRo   (2003-10-30 09:33) [12]

А на счет ModalResult то можно ведь повесить на кнопки вызваной
формы значения(mrNone,mrOK) и обработать это значения в главной форме через if ModalResult=mrOK then
и прописать все нужное не передовая не куда переменные.


 
Zacho   (2003-10-30 09:36) [13]


> KyRo © (30.10.03 09:26) [11]
> Есле у тебя масив на 50 - 100 и больше елементов ты их будеш
> передовать по одному ??
> А:=Edit.text; ??

Вообще-то циклы существуют. Но у меня, например, не бывает форм с таким жутким кол-вом контролов.


 
KyRo   (2003-10-30 09:42) [14]

Ну бывает разное. И циклы существует но это может сожрать много ресурсов компа(смотря какой комп)гораздо легче передать объявив нужный тип данных.
Но это все согласен нужно выбиратть в зависимости от ситуации и поставленой задачи.


 
Кщд   (2003-10-30 13:47) [15]

цикл "жрёт" много ресурсов?


 
KyRo   (2003-10-30 20:06) [16]

Ну есле комп не очень мощный P300(А такие компы на предприятиях существуют. И есть еще и хуже) или на вроде того то цикл на передачу 50-100 (или больше) и к тому же Edit ловит только текстовые переменные , а могут быть и целочесленые(значит перевод типа)может очень существено притормаживать во время выполнения этой функции.


 
Zacho   (2003-10-30 20:43) [17]


> KyRo © (30.10.03 20:06) [16]

Извени, но это чушь. Если у тебя и были такие проблемы - то дело было не в циклах как таковых.
Никаких существенных торможений не будет даже на 486, если конечно нормально писать. Говорю, исходя из собственного опыта работы с Дельфи на 486DX4-100


 
KyRo   (2003-10-30 22:48) [18]

У меня была практика на P166 где была работа с матрицами
50Х50 нужно было в большенстве пересортировывать эти матрицы что сводилось к циклам с перепресваиониям значений элементов.
Так вот эти вроде не большие функции вызывали довольно ощутимые напряжения компа.

Правда прога была не на делфе , а на борланд паскале .


 
Zacho   (2003-10-30 23:16) [19]


> KyRo © (30.10.03 22:48) [18]

Неэффективный алгоритм сортировки значит был. Да и "передача" значений из переменной в переменную в общем случае гораздо быстрее сортировки, просто потому что таких "передач" гораздо меньше.
P.S. У меня массив в 10Mb на P200 сортировался пару секунд, QuickSort"ом. Естественно, если хватало физической памяти для организации копии массива, если без копии - немного медленнее.


 
KyRo   (2003-10-31 00:53) [20]

Может и алгоритм был не очень. Хотя в нем не было не чего особенного. Просто говорю что у меня была такая проблемма.


 
Palladin   (2003-10-31 01:20) [21]

Вот именно у тебя, а не у Делфи.


 
kaif   (2003-10-31 04:21) [22]

2 Anonim-777 (29.10.03 01:52)
Во-первых. Откуда взялась ошибка. Не разобравшись с этим, далеко не уедешь. Ошибка у тебя связана с тем, что экземляр Form2 еще не создан, когда вызывается Form2.ShowModal. Так как ShomModal это не метод класса, а метод экземляра, его нельзя вызывать до

Form2 = TForm2.Create(Application);

или

Application.CreateForm(TForm2,Form2);

Что в принципе то же самое.
Код в сеции initialization модуля срабатывает в тот момент, когда загужается модуль. А загружается он в тот момент, когда возникает ссылка на него. Так как в файле *.dpr имеется ссылка на твой модуль в uses и переменная Form2 к моменту вызова

Application.CreateForm(TForm2,Form2); (создание формы)

уже должна быть инициализирована, твой модуль, в котором находится Form2 стартует до того, как будет вызван этот метод. Соответственно, весь код initialization этого модуля выполняется до того, как форма создана и ты получаешь Access Violation.

Как я поступаю в таких случаях?
Я не люблю загромождать файл проекта dpr кодом, тем более, что
если ты создашь форму, покажешь ее, а потом уничтожишь, то параметры придется во вторую (уже основную) форму, которая пока не создана, передавать через что-то третье.
К тому же процесс обработки сообщений windows на этой фазе еще не работает и тебе придется вызвать кроме метода Show еще, возможно, метод Update, хотя я могу ошибиться так как никогда так не делаю, как предлагает

KyRo © (29.10.03 02:08) [3]

Вместо этого могу посоветовать очень простое и красивое решение.
Вообще убери создание Form2 ид Autocreate Forms в Project|Options. Или, что то же самое, удали руками из dpr код создания ее экземляра:

Application.CreateForm(TForm2,Form2); (создание формы)

Создавай только главную форму Form1.
А вот в обработчик OnCreate формы Form1 впиши тот код, который рекомендует KyRo © (29.10.03 02:08) [3]

Или еще проще, впиши в OnCreate формы Form1

with TForm2.Create(nil) do
try
ShowModal;
//---------
здесь можешь считывать любые данные из экземляра TForm2,
обращаться к любым его компонентам, свойствам и методам,
так как экземляр еще живой
//---------
finally
Free; //сейчас экземляр исчезнет навсегда.
end;


 
kaif   (2003-10-31 04:29) [23]

Кайф того решения, что я предлагаю в том, что в обработчике OnCreate главной формы, если ты создаешь другую форму и показываешь ее модально, работает абсолютно все:
1. Есть уже экземляр главной формы, который пока не виден, но все его компоненты уже созданы.
2. Есть уже экземляр формы, которую ты только что показал методом ShowModal.
3. Полноценно работает система обработки сообщений Windows.


 
Maxud   (2003-11-01 09:44) [24]


> kaif © (31.10.03 04:29) [23]

Решение красивое и в большинстве случаев (если надо передавать значения из Form2 в Form1 перед запуском основной формы) это самый оптимальный вариант, но если в Form2 имеется возможность отмены запуска программы, то имхо лучше применять вариант
KyRo © (29.10.03 02:08) [3] ,
где после анализа Form2.ModalResult основную форму (Form1, да и все другие, если есть) можно вообще не создавать, а в некоторых случаях (когда Auto-Create форм много) это может сэкономить кучу времени.


 
Anonim-777   (2003-11-04 01:08) [25]


> Создавай только главную форму Form1.
> А вот в обработчик OnCreate формы Form1 впиши тот код, который
> рекомендует KyRo © (29.10.03 02:08) [3]

А как это сделать?


 
KyRo   (2003-11-04 01:44) [26]

to kaif
Этот вариант я предложил не только для передачи параметров, а и для экономии ресурсов есле пишеш большое приложение.
Форм может быть много и чаще всего не надо что бы они были постоянно созданы. А код
Application.CreateForm(TForm2,Form2);
try
Form2.ShowModal;
finally
Form2.Free;
end;
Дает возможность создать форму в нужный момент и освободить
ресурсы когда они не нужны.
При этом ModalResult дает возможность красиво обработать и некоторые события создаваемой формы. При этом есле создаваемая форма не сложная (две кнопки)то можно сделать все так что не какие параметры передовать вообще не куда не надо будет .!


 
Anonim-777   (2003-11-11 18:14) [27]

> Создавай только главную форму Form1.
> А вот в обработчик OnCreate формы Form1 впиши тот код, который
> рекомендует KyRo © (29.10.03 02:08) [3]

А как это сделать?


 
Zacho   (2003-11-11 22:02) [28]


> Anonim-777 (11.11.03 18:14) [27]

Ручками. Выбери форму, потом в Objec Inspector"е переключись на закладу Events, и даблклик мышой на OnCreate. Далее вписываешь нужный код. Только лучше будет так:

with TForm2.Create(Application) do
begin
try
Form2.ShowModal;
finally
Free;
end;
end;


И почитай, наконц, учебники !!!



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

Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.01 c
14-66067
Думкин
2003-10-30 04:56
2003.11.20
С днем рождения! 30 октября.


14-66079
Fox
2003-10-30 13:41
2003.11.20
Вопрос про команды в FoxPro?


14-66105
mip
2003-10-29 10:14
2003.11.20
как посмотреть связи


1-65817
Ломброзо
2003-11-10 11:02
2003.11.20
VB ActiveX


6-66027
Borealis
2003-09-26 10:30
2003.11.20
Отключение открытых файлов сетевых ресурсов





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