Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 | 3 |

 

  Вопрос: Выозов нескольких копий формы Добавлено: 26.07.08 13:15  

Автор вопроса:  Jasmin
Здравствуйте!

В книге есть форма. По кнопке на листе вызывается эта форма. Если просто вызывать, то она в единственном экземпляре.

Подскажите как сделать, чтобы я могла по нажатию кнопки на листе вызвать до 5 копий этой формы (не модальных). Если попытка вызова 6, то предупреждение.
На форме есть кнопка по закрытию. По ее нажатию форма закрывается и появляется возможность вызвать следующую копию.

И еще вопрос. На форме есть кнопка обработки данных. Как потом определить в какой форме ее нажали ? Или можно по нажатию этих кнопок в любой форме вызывать один макрос ?

Спасибо.

Ответить

  Ответы Всего ответов: 42  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 26.07.08 15:00
вот тебе код для размышления

Dim frmCopy as New Form2
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.
В коде кнопки "Обработать данные" сначала присваиваю переменной номер формы. А в макросе "обработки данных" пишу
Set a = UserForm(Номер формы)
. И потом работаю уже с ней.

Может быть конечно криво, но зато работает как нужно. Но не нравиться мне, что приходиться использовать 5 совершенно одинаковых форм. Вот бы как-нибудь использовать одну, а при запуске присваивать переменной ее указатель что ли ? Или так не получится ?

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 29.07.08 09:48
Но это не то, что мне нужно ... пришлось использовать 5 одинаковых копий форм

Нет, красивая.. Это как раз таки именно то, что тебе нужно. Просто ты не знаешь как это вкусно приготовить. И делать 5 абсолютно одинаковых форм - это на самом деле криво и не правильно.
При открытии книги заполняю массив из 5 элементов 0. Потом при нажатии кнопки вызова проверяю есть "место" в массиве с 0. Если есть, запускаю форму с номером этого "места" и помечаю 1. При закрытии соответственно возвращаю в это "место" 0.

Это тоже криво.. Зачем тут нужен массив? Почему бы просто не завести переменную и увеличивать ее значение на 1 при открытии формы и уменьшать на 1 при закрытии? К чему эти сложности с массивом? Эта переменная вообще бы потеряла смысл если бы не твое ограничение на 5 форм.. Это так принципиально?

Ответить

Номер ответа: 7
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #7
Добавлено: 29.07.08 14:03
     Мне думается, надо иметь массив ссылок на экземпляры форм.
set a(1) = New UserForm
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-сайт: www.adsemenov.ru
 Профиль | | #9
Добавлено: 29.07.08 14:31
    Это всего лишь информация для Jasmin.
    Я думаю, так более понятны будут её заблуждения по поводу копий одной и той же формы. :)

Ответить

Номер ответа: 10
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #10 Добавлено: 29.07.08 15:07
To EROS: Спасибо. :-)
Эта переменная вообще бы потеряла смысл если бы не твое ограничение на 5 форм.. Это так принципиально?
Не принципиально, но руководство хочет ограничить количество вызываемых форм. Чтобы пользователь не навызывал 1 млн. их. :-) Про переменную подумаю, но ведь пользователь может вызвать 5 форм, а потом закрыть 3, например. Понятно, что переменная будет =4, но что дальше ?
To ADSemenov.ru: Поясните какие заблуждения ?
...Массив ссылок на экземпляры форм...
Так я похожее вроде делаю ? Создаю массив (MyArrForm(5)) с номерами форм и потом
В коде формы на событие кнопки "Обработать данные" сначала присваиваю переменной номер формы. А в макросе "обработки данных" пишу
Set a = UserForm(Номер формы) И потом работаю уже с ней.

Ответить

Номер ответа: 11
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #11
Добавлено: 29.07.08 15:59
    Зачем создавать массив с номерами форм, создавать пять одинаковых форм вместо того, чтобы создать массив ссылок на экземпляры одной и той же формы?
    Я бы создал массив ссылок на пять копий. Все они изначально скрыты. По кнопке я просматриваю массив ссылок, ищу первую скрытую форму, показываю её и выхожу из процедуры напрочь. Если не нашёл, то сообщение о достижении предела и — тоже напрочь.
    В самой форме по кнопке "Закрыть" скрываю форму и привожу её в исходное состояние (если нужно).
    Вот и всё. Форма одна и легко пять заменить на любое количество. Просто одну цифирку заменить, а в цикле использовать LBound(a) и UBound(a).

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 29.07.08 16:25
set a(1) = New UserForm
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-сайт: www.adsemenov.ru
 Профиль | | #13
Добавлено: 29.07.08 19:30
dim a(1 to 5) as UserForm

    Мне так больше нравится. Или:
Base 1

    Прикалываетесь, да? :)

Ответить

Номер ответа: 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-сайт: www.adsemenov.ru
 Профиль | | #15
Добавлено: 29.07.08 20:54
    По нажатию "Обработка данных" на одной из копий форм будут обрабатываться именно данные на этой форме. Копии форм в памяти существуют независимо друг от друга со всеми своими данными.
     Можно ещё разнообразить процесс и при открытии "шестой" "закрыть" первую (самую раннюю) форму, чтобы не напрягать клиента лишними сообщениями. :)

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам