Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2009, 00:17   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Как программно создать форму?

Как добавлять программно компоненты я знаю, а как создать форму?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 30.01.2009, 05:32   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата из книги Уокенбаха "Профессиональное программирование в VBA":

Цитата:
Листинг 28.6. Динамическое создание диалогового окна UserForm

Код:
Sub MakeForm()
    Dim TempForm As Object    'VBComponent
    Dim NewButton As Msforms.CommandButton
    Dim Line As Integer
    Dim TheForm
    Application.VBE.MainWindow.Visible = False
    ' Создание диалогового окна UserForm
    Set TempForm = ThisWorkbook.VBProject. _
                   VBComponents.Add(3)    'vbext_ct_MSForm
    With TempForm
        .Properties("Caption") = "Временная форма"
        .Properties("Width") = 200
        .Properties("Height") = 100
    End With
    ' Добавление элемента управления CommandButton
    Set NewButton = TempForm.Designer.Controls _
                    .Add("forms.CommandButton.1")
    With NewButton
        .Caption = "Щелкни!"
        .Left = 60
        .Top = 40
    End With

    With TempForm.CodeModule
        Line = .CountOfLines
        .InsertLines Line + 1, "Sub CommandButtonl_Click()"
        .InsertLines Line + 2, "MsgBox ""Привет!"""
        .InsertLines Line + 3, "Unload Me"
        .InsertLines Line + 4, "End Sub"
    End With
    ' Отображение диалогового окна UserForm
    VBA.UserForms.Add(TempForm.Name).Show
    ' Удаление диалогового окна UserForm
    ThisWorkbook.VBProject.VBComponents.Remove TempForm
End Sub
В коде много ошибок распознавания текста (русские буквы перемешаны с латиницей), так что используй как образец, а в VBA набирай код вручную.

Там есть и более сложные примеры.
Если надо книгу - скачать её можно здесь: http://excelvba.ru/books.html

Последний раз редактировалось EducatedFool; 31.12.2009 в 07:20.
EducatedFool вне форума Ответить с цитированием
Старый 30.01.2009, 22:02   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Ага! Вручную!
Sasha_Smirnov вне форума Ответить с цитированием
Старый 01.02.2009, 06:57   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Ага! Вручную!
Разобрался я с созданием формы. Получилось. Теперь другой вопрос на эту же тему. На форме у меня Multipage. На каждой его странице имеется набор CheckBox. Все эти CheckBox при создании добавляются в коллекцию. Как им назначить один обработчик события?
P.S. Уокенбаха скачал. Хорошая книга.
P.P.S. Этот вопрос там рассмотрен, но через дополнительный массив, а если уже есть коллекция с контролами, как им назначить событие?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 01.02.2009, 10:24   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Все эти CheckBox при создании добавляются в коллекцию. Как им назначить один обработчик события?
При создании чекбоксов прописывай каждому один и тот же обработчик - например, процедуру, принимающую в качестве параметра номер вкладки Multipage и номер CheckBox.

Например, так:
Код:
for each item in collection ' коллекция, содержащая имена чекбоксов (например, "CheckBox12")
 With TempForm.CodeModule
        Line = .CountOfLines
        .InsertLines Line + 1, "Sub " & item & "_Change()"
        .InsertLines Line + 2, "ОбработчикЧекбоксов " & item
        .InsertLines Line + 3, "End Sub"
    End With
next item
А где-нибудь в коде помести следующую процедуру:
Код:
sub ОбработчикЧекбоксов (byval CheckBoxName as string)
   msgbox "изменилось состояние чекбокса " & CheckBoxName _
   " на вкладке " & TempForm.Designer.Controls("CheckBoxName").Properties("Tag") 
end sub
Свойство index вкладки Multipage можно прописывать в свойстве Tag каждого чекбокса
EducatedFool вне форума Ответить с цитированием
Старый 01.02.2009, 10:34   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

С этим понятно. Только вкладок у меня от 40 до 100 и на каждой от 6 до 17 CheckBox. Много обработчиков получится. Не вручную их, правда. писать, но время занимает. А в свойство Tag у меня другое записывается. Я думал может какой-нибудь хитрый метод есть, чтобы связать события контролов из определенной коллекции с обработчиком.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 01.02.2009, 10:50   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Много обработчиков получится.
Всего-то полторы тысячи строк, если записывать каждый обработчик не в 3 строки, а в одну.
Код:
.InsertLines .CountOfLines + 1, "Sub " & item & "_Change():ОбработчикЧекбоксов " & item &  ":End Sub"
А по-другому никак... если только с использованием классов - но это делать долго.

Чем тебе не нравится метод с 1500 строками?
Получается простой и понятный код...
EducatedFool вне форума Ответить с цитированием
Старый 01.02.2009, 10:55   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…А по-другому никак... если только с использованием классов - но это делать долго…
Ключевая фраза. Я их все равно использую для WinAPI-функций, чтобы не путались в рабочем коде. Вот и события для контролов туда записать. Чекбоксы это же не все, что на вкладке находится. Там еще поля для ввода, списки, картинки. Полный фарш
Помоги, а?
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 01.02.2009 в 11:12. Причина: Исправил опечатку
viter.alex вне форума Ответить с цитированием
Старый 01.02.2009, 12:30   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Ну, раз тебе так хочется использовать классы - пожалуйста:

(добавлено)
Я поначалу много лишнего кода написал. Сейчас убрал лишнее.
Вложения
Тип файла: rar CheckBox_Class.rar (17.0 Кб, 339 просмотров)

Последний раз редактировалось EducatedFool; 01.02.2009 в 13:21. Причина: обновлённый файл
EducatedFool вне форума Ответить с цитированием
Старый 01.02.2009, 13:52   #10
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Ну, раз тебе так хочется использовать классы - пожалуйста:

(добавлено)
Я поначалу много лишнего кода написал. Сейчас убрал лишнее.
Спасибо, вот это вещь! Репку пока не могу поставить
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать форму с запросом? LakyWinter Microsoft Office Access 4 23.11.2008 19:58
Программно создать курсор SeregaIRK Компоненты Delphi 1 19.09.2008 09:06
Как программно создать *.exe файл ? SG13 Общие вопросы Delphi 8 20.06.2008 15:46
Как программно через delphi создать папку на диске? VenMaster Общие вопросы Delphi 5 25.05.2008 21:09
Как из Delphi программно создать связь между двумя базами Access? Dimm Microsoft Office Access 6 12.01.2007 14:35