![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
DYUMON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 321 Регистрация: 17.6.2006 Где: Новосибирск Репутация: нет Всего: 3 |
Доброго всем времени суток. Возник такой вопрос.
допустим есть три формы дата1 дата2 справочник как организовать между ними общение, допустим открыты форма дата1 и дата2 затем из каждой формы вызывается форма справочник выбираются данные и необходимо правильно их вернуть в форму , из которой был вызов. пока это делаю через ид формы а на обратчике событий висит
но это если вызвать по одному разу формы дата1 и дата2 . а если их вызывают по несколько раз то тут начинается каша. |
|||
|
||||
xackera |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.6.2008 Где: USSR Репутация: нет Всего: нет |
Попробуйте форму справочник сделать динамической и создавайте новый экземпляр формы справочника при вызове из дата1 и дата2.
|
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
DYUMON, т.е. у тебя справочник сам записывает выбранные данные в соответствующую форму? Ну это как то не очень идеологически верно
![]() Выше xackera правильно предложил сделать справочник динамическим. От себя предложу - вызывать его классовой функцией, которая и будет возвращать результат. Как вариант, можно не делать справочник динамическим - просто написать отдельную функцию в каком то общем модуле, которая будет показывать этот справочник и возвращать выбранные данные (в виде записи например или объекта - если там больше одного значения). |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Тут в любом случае динамический вызов т.к. если делать статическую форму, то она у нас будет одна, а судя по этому:
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Или завершать предыдущий незавершенный вызов справочника "отменой"
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Всё, что я мог бы сказать по поводу этого вопроса, я уже сказал здесь:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=50045 Там-же приведён полностью рабочий пример, демонстрирующий сказанное. |
|||
|
||||
gesper |
|
||||||||
![]() "Shарфик" ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 23.2.2005 Репутация: 1 Всего: 2 |
unit1
unit form data 1/2
--------------------
...И приколется обломившийся и oбломится приколовшийся... |
||||||||
|
|||||||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
gesper, а где ты увидел что надо Showmodal? Та же 1С умеет открывать 100500 справочников и все они отнюдь не модальные.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
gesper |
|
|||
![]() "Shарфик" ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 23.2.2005 Репутация: 1 Всего: 2 |
Покажите мне человека, который одновременно будет сразу в двух окнах что то выбирать. У него один справочник и как пользователь я бы не хотел что то по десять раз выбирать, раскрывать деревья и т.п., если передо мной в разные моменты открывается одна и та же форма. Нафиг ему создавать копии одной и той же формы? У него справочник это источник данных для другой формы, т.е. открыл "выбираются данные" и возврат в первую форму. ShowModal удобно реализует взможность отловить, что данные выбрали и нам нужно только их забрать. Вообщем, я показал как можно сделать, а идти или нет этим путем дело путника. --------------------
...И приколется обломившийся и oбломится приколовшийся... |
|||
|
||||
DYUMON |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 321 Регистрация: 17.6.2006 Где: Новосибирск Репутация: нет Всего: 3 |
форма справочник вызывается методом
по идее да ни кто не будет вызывать из нескольких окон справочник но по опыту знаю что бывают любители открыть по 150 окон а потом удивлятся где что. думаю сделать проверку на
это хоть как то ограничет количество окон |
||||
|
|||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Замучаешься придумывать имена frmspravka, а потом замучаешься их проверять на nil. ![]() -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
gesper |
|
||||||||||||
![]() "Shарфик" ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 23.2.2005 Репутация: 1 Всего: 2 |
Тогда у тебя ошибка, если в форме нету при закрытии ее нет опции "Action=cafree" в обработчике формы. Без проверки Assigned(frmspravka) у тебя создается копия класса формы, заменая адрес уже созданной формы в переменной, и связь с формой теряется, а без вызова free память не освобождается.
равносильно
Добавлено через 4 минуты и 5 секунд
Читай внимательно ТЗ автора темы. Для серьезных проектов определяется тип формы и данных в ней, чтобы знать что с ними могут делать. Не цепляйся к слову"Справочник", это трата времени, ты должен знать конкретные данные в форме и для чего они. Поскольку нас спрашивают как сделать форму, то возможно что справочник по факту "Каталог", к примеру. Добавлено через 5 минут и 24 секунды Глобальный TList его спасти бы мог, или прописать самоуничтожение при закрытии. --------------------
...И приколется обломившийся и oбломится приколовшийся... |
||||||||||||
|
|||||||||||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Решил быть дотошным? Ну читаем:
Добавлено через 1 минуту и 19 секунд Кстати, мало того что твой ShowModal не даст вызвать второй справочник, так вообще всю работу заблокирует пока эту третью форму не закроешь. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Poseidon ты прав, на модальный режим в тз ничего не указывает.
Но как узнать, какое окно и куда, должно вернуть данные, если одновременно открыто несколько экземпляров? -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
gesper |
|
||||||||||||||
![]() "Shарфик" ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 23.2.2005 Репутация: 1 Всего: 2 |
фраза была такая, а не только тот кусок, что ты привел.
Вызывается одна форма, а не несколько и надо правильно вернуть. С одной формы при одновременном вызове нельзя вернуть данные сразу в две формы, потому что вызов со второй перекроет вызов первой, даже если вы в "справочник" засунете адрес переменной, куда надо записать итог выбора. Модальность для режима выбора правильное решение, потому что идет команда "Установить значение", и некакие другие действия не должны мешать и перекрывать диалог выбора. Если нужно использовать "справочник" как просмотр данных, то пишется отдельная кнопка, которая вызывает его иначе. Можно передать просто адрес переменной в "Справочник" и вместо функции GetData справочник сам запишет запись в нужный адрес, но тогда это повлечет порчу данных, если нет блокировки через showmodal и пользователь перещелкниться в другое окно, его отвлекут, и он возьмет и кликнет другие данные, или попросту закроет окно, забыв выбрать данные, или перепутает окна, если сделать создание нескольких одинаковых окон. Одно окно, постоянно весящее в памяти без уничтожения, позволяет не только это все отфильтровать, но и сохранить свое состояние и содержимое при двух разных вызовах(к примеру выбор из дерева каталога не потребует искать все заново). Добавлено @ 13:36
примерно так можно unit
unit TFSpravocnic
unit data 1/2
Это сообщение отредактировал(а) gesper - 1.8.2013, 13:38 --------------------
...И приколется обломившийся и oбломится приколовшийся... |
||||||||||||||
|
|||||||||||||||
Poseidon |
|
||||||||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
В ТЗ так и написано. Нужно вызвать одну форму, но никто не сказал, что ее должно быть можно вызвать только один раз. Поэтому и нужно предусмотреть вариант с вызовом одной формы, но несколько раз (отдельно для дада1, отдельно для дата2).
Добавлено через 8 минут и 5 секунд Кстати, я не проверял, не на чем сейчас, но по-моему в твоей SetField мы получим Incompatible types: 'Pointer' and 'TDataRecord'. Хотя могу и ошибаться. Это сообщение отредактировал(а) Poseidon - 1.8.2013, 13:52 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||||||||
|
|||||||||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Я за другое. Программная реализация для меня не проблема. Я за пользователя. Пользователь вызвал окно выбора из окна А, потом из окна Б. Потом отвлекся, открыл другую программу, свернул все окна. Потом вернулся к работе. И упс, два одинаковых окна, каждое ожидает выбор данных, а какое куда эти данные вернет? -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
gesper |
|
||||||||
![]() "Shарфик" ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 23.2.2005 Репутация: 1 Всего: 2 |
Я на работе, тут нет у меня компилятора проверить, а на память синтаксис не помню точно.
// все правильно, другой вариант показал просто. Открыть форму и чтобы она сама себя уничтожала при закрытии, а SetField должен быть описан так, чтобы передавалось не значение переменной, а адрес переменной куда писать данные, если будет сделан выбор. Ошибка только в том, что саму переменную забыл убрать из процедуры выше в глобальные формы. Пускай автор разбереться чего хочет, а там решение найдет. Добавлено через 2 минуты и 2 секунды
Я об этом писал выше, говоря про Showmodal и создание копий окна справки. --------------------
...И приколется обломившийся и oбломится приколовшийся... |
||||||||
|
|||||||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Не совсем так. У TApplication.CreateForm есть одна очень важная для проекта цель, которой нет у простого вызова конструктора формы. (с) Буквоед. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
Чучмек |
|
||||||||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
gesper это к Poseidon. Но он правильно говорит, про модальный режим речь не идет. А что нужно автору мы не знаем, он не уточнял. Модальный режим, возможно, подходящий, в данном случае, вариант, а может и нет.
Можно сделать псевдомодальный вызов.
Вызов
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||||||
|
|||||||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
![]() -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |