Страница: 1 | 2 | 3 |
Вопрос: Выозов нескольких копий формы
Добавлено: 26.07.08 13:15
Автор вопроса: Jasmin
Здравствуйте!
В книге есть форма. По кнопке на листе вызывается эта форма. Если просто вызывать, то она в единственном экземпляре.
Подскажите как сделать, чтобы я могла по нажатию кнопки на листе вызвать до 5 копий этой формы (не модальных). Если попытка вызова 6, то предупреждение.
На форме есть кнопка по закрытию. По ее нажатию форма закрывается и появляется возможность вызвать следующую копию.
И еще вопрос. На форме есть кнопка обработки данных. Как потом определить в какой форме ее нажали ? Или можно по нажатию этих кнопок в любой форме вызывать один макрос ?
Спасибо.
Ответы
Всего ответов: 42
Номер ответа: 1
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #1
Добавлено: 26.07.08 15:00
вот тебе код для размышления
frmCopy.Show()
Номер ответа: 2
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #2
Добавлено: 28.07.08 09:05
Спасибо. Уже что-то проясняется.
Еще раз вопрос. Допустим я открыла N форм. Все естественно они не модальные. Как потом определить в какой из этих форм нажали кнопку обработки данных ?
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 28.07.08 14:14
1. Если код в самой форме, то без разницы - обращайся через Me и все.
2. Если управление будешь отдавать в какую нибудь общую процедуру например в модуле, то ты можешь ссылку на форму передать в качестве параметра (если она необходима)
3. Ну и как вариант: наверняка у кнопки по которой кликнули будет свойство Parent или Owner что то типа этого. Вот там, по идее, и будет ссылка на родительскую форму если только у тебя кнопка не лежит в другом контейнере.
P.S Все вышесказаное есть результат моих предположений и требует проверки в VBA (ведь главное - идея)
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 29.07.08 01:19
Большое спасибо за информацию
Номер ответа: 5
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #5
Добавлено: 29.07.08 08:31
Спасибо.
Но это не то, что мне нужно. Дело в том, что формы нужно вызвать независимо. Если я их вызываю как New, он все под одним именем и с одинаковыми названиями компонентов на ней.
А мне нужно, чтобы была возможность запустить по нажатию кнопке на листе от 1 до 5 форм (в разное время когда захочется), а потом на какой-либо выбраной форме нажав кнопку "Обработать данные" получить некий расчет основываясь на данных с этой формы.
У мееня тут получилось что-то. Но пришлось использовать 5 одинаковых копий форм (изначально сделанных в редакторе). При открытии книги заполняю массив из 5 элементов 0. Потом при нажатии кнопки вызова проверяю есть "место" в массиве с 0. Если есть, запускаю форму с номером этого "места" и помечаю 1. При закрытии соответственно возвращаю в это "место" 0.
В коде кнопки "Обработать данные" сначала присваиваю переменной номер формы. А в макросе "обработки данных" пишу
Может быть конечно криво, но зато работает как нужно. Но не нравиться мне, что приходиться использовать 5 совершенно одинаковых форм. Вот бы как-нибудь использовать одну, а при запуске присваивать переменной ее указатель что ли ? Или так не получится ?
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 29.07.08 09:48
Нет, красивая.. Это как раз таки именно то, что тебе нужно. Просто ты не знаешь как это вкусно приготовить. И делать 5 абсолютно одинаковых форм - это на самом деле криво и не правильно.
Это тоже криво.. Зачем тут нужен массив? Почему бы просто не завести переменную и увеличивать ее значение на 1 при открытии формы и уменьшать на 1 при закрытии? К чему эти сложности с массивом? Эта переменная вообще бы потеряла смысл если бы не твое ограничение на 5 форм.. Это так принципиально?
Номер ответа: 7
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #7
Добавлено: 29.07.08 14:03
Мне думается, надо иметь массив ссылок на экземпляры форм.
set a(2) = New UserForm
set a(3) = New UserForm
set a(4) = New UserForm
set a(5) = New UserForm
Это будет пять независимых экземпляров одной формы. Соответственно, элементы массива могут быть пустыми или содержать ссылку. Ссылка может указыывать на видимую форму, а может и на скрытую. Выбирайте, что Вам нужно.
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 29.07.08 14:20
Зачем? Объясните мне пожалуйста какова цель создания этого массива? Для чего хранить ссылки на формы?
Номер ответа: 9
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #9
Добавлено: 29.07.08 14:31
Это всего лишь информация для Jasmin.
Я думаю, так более понятны будут её заблуждения по поводу копий одной и той же формы.
Номер ответа: 10
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #10
Добавлено: 29.07.08 15:07
To EROS: Спасибо.
To ADSemenov.ru: Поясните какие заблуждения ?
Set a = UserForm(Номер формы) И потом работаю уже с ней.
Номер ответа: 11
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #11
Добавлено: 29.07.08 15:59
Зачем создавать массив с номерами форм, создавать пять одинаковых форм вместо того, чтобы создать массив ссылок на экземпляры одной и той же формы?
Я бы создал массив ссылок на пять копий. Все они изначально скрыты. По кнопке я просматриваю массив ссылок, ищу первую скрытую форму, показываю её и выхожу из процедуры напрочь. Если не нашёл, то сообщение о достижении предела и — тоже напрочь.
В самой форме по кнопке "Закрыть" скрываю форму и привожу её в исходное состояние (если нужно).
Вот и всё. Форма одна и легко пять заменить на любое количество. Просто одну цифирку заменить, а в цикле использовать LBound и UBound.
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 29.07.08 16:25
set a(2) = New UserForm
set a(3) = New UserForm
set a(4) = New UserForm
set a(5) = New UserForm
С каких пор нумерация в массиве в дотнете начинается с 1?
Номер ответа: 13
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #13
Добавлено: 29.07.08 19:30
Мне так больше нравится. Или:
Прикалываетесь, да?
Номер ответа: 14
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #14
Добавлено: 29.07.08 20:19
To ADSemenov.ru: Попробую предложенное. Но по нажатию кнопки "Обработка данных" (которая на форме) в какой-либо открытой форме все-таки присваивать номер/проверять ее видимость, чтобы определить с какой формы данные для расчета нужно взять, как у меня ?
P.S. Если мне нужна нумерация массива с 1 всегда пишу Option Base 1.
Номер ответа: 15
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #15
Добавлено: 29.07.08 20:54
По нажатию "Обработка данных" на одной из копий форм будут обрабатываться именно данные на этой форме. Копии форм в памяти существуют независимо друг от друга со всеми своими данными.
Можно ещё разнообразить процесс и при открытии "шестой" "закрыть" первую (самую раннюю) форму, чтобы не напрягать клиента лишними сообщениями.