Помагите новичкам
Заранее благодарень за ответ:)
Хочу попросить вас помоч мне и наверника многим начинаюшим.Как вы предложыли бы изучить Visual Basic?Какими методами,с чего начать?Я например читаю книги о Visual Basic-ке но чуствою что ,эффект не очень хорошый.
Заранее благодарень за ответ:)
***
ты дзнаешь, я сам не очень то и селён в Vb, ноесть ряд книг которые так и называются, VB для начинающих,...ноАчни с них,...а так - если ты с_умел доабраться до этого форума, то в глоАбальных сетях инета ты весьма и весьма просто сможешь найти пособия для начинающих по VB и VBA, где тебе всё наглядно расскажут и поАкажУт...
Хочу попросить вас помоч мне и наверника многим начинаюшим.Как вы предложыли бы изучить Visual Basic?Какими методами,с чего начать?Я например читаю книги о Visual Basic-ке но чуствою что ,эффект не очень хорошый.
Заранее благодарень за ответ:)
Посмотри посты в теме:
http://forum.codenet.ru/showthread.php?threadid=15556
Хочу попросить вас помоч мне и наверника многим начинаюшим.Как вы предложыли бы изучить Visual Basic?Какими методами,с чего начать?Я например читаю книги о Visual Basic-ке но чуствою что ,эффект не очень хорошый.
Заранее благодарень за ответ:)
Я считаю, что лучший способ изучения VB (да и не только его) - это ставить себе самому практические задачи. Т.е. задаешься целью написать какую-либо очень полезную программу, при ее написании пользуешься информацией из различных источников (книги, сеть, этот форум) и применяешь те или иные интересные решения.
Хотя основы языка в этом случае надо все-равно знать. Но если ты читал книги вдумчиво, то тут проблемы возникнуть не должно.
Посмотри посты в теме:
http://forum.codenet.ru/showthread.php?threadid=15556
Я посматрел,метод понравился.Если возможносьт будет,прошу вас для меня тоже подкинуть задачу.Но имейте введу я не так силен,как тот парень:)
и thanks for attention
Я посматрел,метод понравился.Если возможносьт будет,прошу вас для меня тоже подкинуть задачу.Но имейте введу я не так силен,как тот парень:)
и thanks for attention
ОК, прямо тут вечерком и выложк задачку.;)
ОК, прямо тут вечерком и выложк задачку.;)
mhaturov, а может меня тоже в класс запишешь ? :)
И мне задачку накинешь ?
Только я в VB не просто ноль, а супер-мега-сверх-ноль.
а VB который за макросы в EXcel и Word отвечает, это ТОТ САМЫЙ VB на котором вы все пишете?
mhaturov, а может меня тоже в класс запишешь ? :)
И мне задачку накинешь ?
Только я в VB не просто ноль, а супер-мега-сверх-ноль.
а VB который за макросы в EXcel и Word отвечает, это ТОТ САМЫЙ VB на котором вы все пишете?
В Word'e и Excel'e это VBA, в Access называют VBE посколько он все таки отличается немного от VBA, ну и наконец еще есть просто VB1/2/3/4/5/6
mhaturov, а может меня тоже в класс запишешь ? :)
И мне задачку накинешь ?
Только я в VB не просто ноль, а супер-мега-сверх-ноль.
а VB который за макросы в EXcel и Word отвечает, это ТОТ САМЫЙ VB на котором вы все пишете?
Ситуация следующая.
Есть, так называемый "чистый" VB. До версии, по-моему, 5.0 он поставлялся как самостоятельный продукт. Затем он начал поставляться в составе пакета Microsoft Visual Studio. Это - полноценный компилятор. Позволяет писать свои *.exe программы (как в обычной, ассемблеровской, так сказать, тоесть двоичной компиляции, так и в так называемой "псевдокомпиляции", которая позволяет при установке виртуальной машины VB переносить его на любую платформу), позволяет создавать библиотеки полноценные, писать контролы и т.д.
Но для облегчения работы с приложениями Офиса Mocrosoft создала интерпритаторы языков, очень похожих на VB и встраиваемых в офисные приложения. Это, так называемые, языки макросов - VBA (Visual Basic From Applications). Их существует (по неофициальной классификации) несколько видов, например VBA - для Word и Excel, VBE - для Access и т.п.
Языки очень близки и человек, умеющий, например, писать на VB, сможет писать и на VBA. Но из-за различных ньюансов, конечно же. "чистый" VB-шник струдом напишет оптимальный код на VBA, равно как и "чистый" VBA-шник - на VB.
Но, часто, работая на VB, приходится работать и с VBA, и наоборот. Поэтому, как Вы можете здесь видеть, я, например, постоянно задаю вопросы по VBA, и отвечаю, в основном, на вопросы, по VB.
Аналогично, с точностью до наоборот, здесь помогает и уважаемый SergeySV - т.е. отвечает по VBA, в основном. Это как раз и иллюстрирует специфику языков.
А задачки я тут как бы для всех выкладываю. Если есть желание - решайте. Я буду только рад, что мой труд не пропал:D
Поэтому, как Вы можете здесь видеть, я, например, постоянно задаю вопросы по VBA, и отвечаю, в основном, на вопросы, по VB.
mhaturov, на ты, пора бы !
ДАйте задачку-у-у-у!
mhaturov, на ты, пора бы !
ДАйте задачку-у-у-у!
Вечером. Подождите пока. Ща мне совсем, к сожалению, некогда.:{
Вечером. Подождите пока. Ща мне совсем, к сожалению, некогда.:{
Ну я буду по VB чистому подкидывать задачки.
Значит так, задача первая.
Создайте форму с 1 кнопкой. По "клику" на кнопку должен открываться диалог выбора цвета. Если пользователь выбрал в нём цвет, то форма должна менять свой цвет на выбранный, иначе должна оставаться прежнего цвета.
Подсказываю. Вам нужно использовать контрол CommonDilog.
Задачка простая, но, если будут вопросы, обязательно обращайтесь сюда.:)
Private sub command1_click
commonDialog1.ShowColor
Form1.Backcolor=CommonDialog1.Color
End Sub
Private Sub Command2_click
unload me
End Sub
Хотелось бы ещо.Если возможно оставьте темп сложности таким же.
Thanks.
Я както написал код:)
Private sub command1_click
commonDialog1.ShowColor
Form1.Backcolor=CommonDialog1.Color
End Sub
Private Sub Command2_click
unload me
End Sub
Хотелось бы ещо.Если возможно оставьте темп сложности таким же.
Thanks.
Хорошо, но есть один нюанс. Нажми в Common Dialog Cancel. Посмотри, как на это среагирует форма. Если нормально, считай задание выполненым, а если нет - поищи путь обхода возникающей ошибки;)
Хорошо, но есть один нюанс. Нажми в Common Dialog Cancel. Посмотри, как на это среагирует форма. Если нормально, считай задание выполненым, а если нет - поищи путь обхода возникающей ошибки;)
mhaturov, срочно переименовывайся в "Великого учителя" :)
mhaturov, срочно переименовывайся в "Великого учителя" :)
Ему нужно присвоить звание - сэнсей и пусть он высвечивается вместо Мега-флудер.... тем более mhaturov'у надо срочно написать еще одно сообщение, чтобы день не был испорчен :)
Ему нужно присвоить звание - сэнсей и пусть он высвечивается вместо Мега-флудер.... тем более mhaturov'у надо срочно написать еще одно сообщение, чтобы день не был испорчен :)
Ну вы там пока не звания мне присваивайте, а с CommonDilog'ом разбирайтесь;) :D .
Кстати, следующая задачка будет на создание массива контролов. Потом мы изучим работу со строками, преобразования типов, стеки и в конце "1 курса" надеюсь, что мы все вместе напишем калькулятор - классическая задачка со школьных олимпеад. Я, кстати, в своё время с ней не справился;)
Да все работает:)
Ну вы там пока не звания мне присваивайте, а с CommonDilog'ом разбирайтесь;) :D .
Кстати, следующая задачка будет на создание массива контролов. Потом мы изучим работу со строками, преобразования типов, стеки и в конце "1 курса" надеюсь, что мы все вместе напишем калькулятор - классическая задачка со школьных олимпеад. Я, кстати, в своё время с ней не справился;)
Ждем задачку
Хорошо, но есть один нюанс. Нажми в Common Dialog Cancel. Посмотри, как на это среагирует форма. Если нормально, считай задание выполненым, а если нет - поищи путь обхода возникающей ошибки
Да все работает:)
Ждем задачку
Создай форму, на которой будут 2 кнопки. Одна в правом углу формы, другая - в левом. При "клике" на левую кнопку под правой должнв возникать ещё одна кнопку. При следующем - ещё одна. И т.д. Сколько "кликов" по левой кнопке, столько добавляется кнопок справа.
При "клике" по правой кнопке, она "должна исчезать". Тоесть, кнопка должна выгружаться из памяти (подумай - тут хтиро можно сделать). На её место должна становиться следующая.
Правые кнопки должнв иметь кэпшны "Кнопка 1", "Кнопка 2" и т.д.
Справишься?
Если будут проблемы - обязательно помогу.
Создай форму, на которой будут 2 кнопки. Одна в правом углу формы, другая - в левом. При "клике" на левую кнопку под правой должнв возникать ещё одна кнопку. При следующем - ещё одна. И т.д. Сколько "кликов" по левой кнопке, столько добавляется кнопок справа.
При "клике" по правой кнопке, она "должна исчезать". Тоесть, кнопка должна выгружаться из памяти (подумай - тут хтиро можно сделать). На её место должна становиться следующая.
Правые кнопки должнв иметь кэпшны "Кнопка 1", "Кнопка 2" и т.д.
Справишься?
Если будут проблемы - обязательно помогу.
а если все кнопки не влезают на диалог??
а если все кнопки не влезают на диалог??
Ну то, что кнопки не будут помещаться, думаю не важно - на мой взгляд важно научиться работать с динамическими массивами контролов.
Хотя, если у Вас есть предложение - то дополните задание им. Мы же, всё же, как-никак все вместе помогаем друг другу:) .
Вобщем, лучше, думаю, сделать так. Пока отработать момент подгрузки и выгрузки контролов. Потом дать задачку на ресайз, а потом попробовать свои силы в работе со скроллингом.
На мой взгляд, для новичков разбирать такие вещи по шагам проще и информативнее, нежели грузить их сразу большим объёмом работ.
Я, например, имею целью как бы на примерах заданий по шагам написать проект (в данном случае калькулятора). Тоесть, реализовать всё так, как в реальной рабочей обстановке я сам внедряю в проект новые приёмы и технологии. Сначала делаю тестовый проект, на котором в черновом варианте отрабатываю всё, что мне нужно. Ищу способы новые, изучаю свойства, методы, которые мне стали доступны после внедрения новинки. После этого разбиваю задачку на кусочки и реализую каждый из них. А под конец собираю весь этот "конструктор".
Так же и в данном случае. Единственное, задачку на шажки отдельные разбиваю за уважаемых новичков пока я. Но скоро, надеюсь, это делать будут уже они сами.:)
Ну то, что кнопки не будут помещаться, думаю не важно - на мой взгляд важно научиться работать с динамическими массивами контролов.
Хотя, если у Вас есть предложение - то дополните задание им. Мы же, всё же, как-никак все вместе помогаем друг другу:) .
Вобщем, лучше, думаю, сделать так. Пока отработать момент подгрузки и выгрузки контролов. Потом дать задачку на ресайз, а потом попробовать свои силы в работе со скроллингом.
На мой взгляд, для новичков разбирать такие вещи по шагам проще и информативнее, нежели грузить их сразу большим объёмом работ.
Я, например, имею целью как бы на примерах заданий по шагам написать проект (в данном случае калькулятора). Тоесть, реализовать всё так, как в реальной рабочей обстановке я сам внедряю в проект новые приёмы и технологии. Сначала делаю тестовый проект, на котором в черновом варианте отрабатываю всё, что мне нужно. Ищу способы новые, изучаю свойства, методы, которые мне стали доступны после внедрения новинки. После этого разбиваю задачку на кусочки и реализую каждый из них. А под конец собираю весь этот "конструктор".
Так же и в данном случае. Единственное, задачку на шажки отдельные разбиваю за уважаемых новичков пока я. Но скоро, надеюсь, это делать будут уже они сами.:)
Даааааа,признаюсь не могу справится:)
Помагите.Если можно подсказка.
Даааааа,признаюсь не могу справится:)
Помагите.Если можно подсказка.
А в чём загвоздка?
Не знаешь, как динамически создать кнопку?
Знать так, тут будем использовать самый простой способ.
Создай форму (в VB, но не VBA!). В верхнем левом углу её помести кнопку. Назови её, например, CbAdd. В правом верхнем помести кнопку и назови её, например, CbNew и присвой ей индекс 0. (В свойствах она будет теперь отобажаться как CbNew(0) CommandButton).
Потом посмотри по Help, как работать с командами Load и Unload - если не разберёшься по Help'у, спрашивай, что конкретно не понятно. Но полностью код давать пока не буду, дабы ты сам разобрался - так полезнее будет.:)
Private Sub cmdadd_click()
If Des = 0 Then Des = 1
Des = Des + 1
Load knopka(Des)
knopka(0).SetFocus
knopka(Des).Top = knopka(Des - 1).Top + 600
knopka(Des).Visible = True
knopka(Des).Caption = "Knopka"
End Sub
Private Sub cmdClose_click()
Unload Me
End Sub
Private Sub cmdDelete_click()
Unload knopka(Des)
Des = Des - 1
knopka(0).SetFocus
End Sub
========================================
Napisal tu proqu:)(spasibo vam)
Jdu esho zadachi . Esli mojno zadach o peremennix(variables).No ochen proshu ne ochen trudniy.
насчет переменных...
Создай 1 кнопку и 1 объект для вывода текста (можно static, например). в обработчике нажатия кнопки используй одну локальную переменную. при нажатии на кнопку в объекте выводи количество нажатий на кнопку. ОБЯЗАТЕЛЬНОЕ УСЛОВИЕ: глобальные переменные использовать нельзя.
вторая задача - создай функцию, в которой вычисляешь корни уравнения второй степени (их 2, насколько мы помним из курса школьной математики, если их нет, то необходимо, чтобы функция это определяла). на форме создай объекты для ввода 3-х коэффициентов для уравнения и один объект для вывода результата. при нажатии кнопки ты вызываешь функцию для рассчета корней, что ты сделал в самом начале и выводишь результат в объект для этого предназначенный. Нужно обойтись только локальными переменными.
P.S. глобальная переменная - это переменная, к которой ты можешь обратится из любой функции программы, они обычно объявляются в начале программы. такая переменная создается при загрузке программы и уничтожается при ее завершении.
локальная переменная - переменная, объявленная в теле функции, она доступна только внутри функции,за ее пределами она не существует, т.к. создается при входе в функцию и уничтожается при завершении функции.
Dim Des As Integer
Private Sub cmdadd_click()
If Des = 0 Then Des = 1
Des = Des + 1
Load knopka(Des)
knopka(0).SetFocus
knopka(Des).Top = knopka(Des - 1).Top + 600
knopka(Des).Visible = True
knopka(Des).Caption = "Knopka"
End Sub
Private Sub cmdClose_click()
Unload Me
End Sub
Private Sub cmdDelete_click()
Unload knopka(Des)
Des = Des - 1
knopka(0).SetFocus
End Sub
========================================
Napisal tu proqu:)(spasibo vam)
Jdu esho zadachi . Esli mojno zadach o peremennix(variables).No ochen proshu ne ochen trudniy.
Хорошо. С задачкой справился.
Для примера хочу теперь скинуть самый простой вариант такого кода, написанный мною - сравни свой и мой коды обязательно, а потом переходи к задачке, которую тебе уважаемый xelos подкинул. Задачка очень интересная...
Вот пример моего кода:
'МАХ Клик по кнопке загрузки кнопки
'МАХ Если у нас, типа, "выгружена" 0 - кнопка
If CbUnload.UBound = CbUnload.LBound And Not CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = True
Exit Sub
End If
'МАХ Подгружаем кнопку
Load CbUnload(CbUnload.Count)
'МАХ Помещаем её, куда надо
CbUnload(CbUnload.UBound).Move CbUnload(CbUnload.LBound).Left, _
CbUnload(CbUnload.UBound - 1).Top + _
CbUnload(CbUnload.UBound - 1).Height + 50, _
CbUnload(CbUnload.LBound).Width, _
CbUnload(CbUnload.LBound).Height
'МАХ Присваиваем кзпшн
CbUnload(CbUnload.UBound).Caption = "Кнопка № " & CbUnload.UBound
CbUnload(CbUnload.UBound).Visible = True
End Sub
Private Sub CbUnload_Click(Index As Long)
'МАХ Клик по кнопке выгрузки (самый простой алгоритм)
Dim TempArr() As String 'МАХ Массив для хранения кэпшнов
Dim I As Long 'МАХ Счётчик циклов
Dim B As Long 'МАХ Счётчик циклов
'МАХ Если у нас 1 кнопка
If CbUnload.UBound = CbUnload.LBound And CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = False
Exit Sub
End If
'МАХ Несмотря на то, что можно выгружать любой контрол, мы, в _
целях облегчения работы с массивом в дальнейшем _
и избежания ошибок, будем выгружать последний контрол, но создавать _
видимость выгрузки интересующего нас
'МАХ Переразмечаю массив
ReDim TempArr(CbUnload.UBound - Index)
'МАХ Записываю все кэпшны в массив
I = Index + 1
B = 0
While I <= CbUnload.UBound
TempArr(B) = CbUnload(I).Caption
I = I + 1
B = B + 1
Wend
'МАХ Убиваю контрол
Unload CbUnload(CbUnload.UBound)
'МАХ Восстанавливаем кэпшны
B = 0
For I = Index To CbUnload.UBound
CbUnload(I).Caption = TempArr(B)
B = B + 1
Next
End Sub
P.S. В процедуре CbUnload_Click есть возможность вместо 2 циклов и массива избавиться от массива и использовать 1 цикл. Я специально чуть - чуть "не дописал" код, чтобы, если у тебя будет время, ты мог подумать, как оптимизировать эту процедуру...
Хорошо. С задачкой справился.
Для примера хочу теперь скинуть самый простой вариант такого кода, написанный мною - сравни свой и мой коды обязательно, а потом переходи к задачке, которую тебе уважаемый xelos подкинул. Задачка очень интересная...
Вот пример моего кода:
'МАХ Клик по кнопке загрузки кнопки
'МАХ Если у нас, типа, "выгружена" 0 - кнопка
If CbUnload.UBound = CbUnload.LBound And Not CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = True
Exit Sub
End If
'МАХ Подгружаем кнопку
Load CbUnload(CbUnload.Count)
'МАХ Помещаем её, куда надо
CbUnload(CbUnload.UBound).Move CbUnload(CbUnload.LBound).Left, _
CbUnload(CbUnload.UBound - 1).Top + _
CbUnload(CbUnload.UBound - 1).Height + 50, _
CbUnload(CbUnload.LBound).Width, _
CbUnload(CbUnload.LBound).Height
'МАХ Присваиваем кзпшн
CbUnload(CbUnload.UBound).Caption = "Кнопка № " & CbUnload.UBound
CbUnload(CbUnload.UBound).Visible = True
End Sub
Private Sub CbUnload_Click(Index As Long)
'МАХ Клик по кнопке выгрузки (самый простой алгоритм)
Dim TempArr() As String 'МАХ Массив для хранения кэпшнов
Dim I As Long 'МАХ Счётчик циклов
Dim B As Long 'МАХ Счётчик циклов
'МАХ Если у нас 1 кнопка
If CbUnload.UBound = CbUnload.LBound And CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = False
Exit Sub
End If
'МАХ Несмотря на то, что можно выгружать любой контрол, мы, в _
целях облегчения работы с массивом в дальнейшем _
и избежания ошибок, будем выгружать последний контрол, но создавать _
видимость выгрузки интересующего нас
'МАХ Переразмечаю массив
ReDim TempArr(CbUnload.UBound - Index)
'МАХ Записываю все кэпшны в массив
I = Index + 1
B = 0
While I <= CbUnload.UBound
TempArr(B) = CbUnload(I).Caption
I = I + 1
B = B + 1
Wend
'МАХ Убиваю контрол
Unload CbUnload(CbUnload.UBound)
'МАХ Восстанавливаем кэпшны
B = 0
For I = Index To CbUnload.UBound
CbUnload(I).Caption = TempArr(B)
B = B + 1
Next
End Sub
P.S. В процедуре CbUnload_Click есть возможность вместо 2 циклов и массива избавиться от массива и использовать 1 цикл. Я специально чуть - чуть "не дописал" код, чтобы, если у тебя будет время, ты мог подумать, как оптимизировать эту процедуру...
Budet zdelano,komandir:)
Вопрос к знатокам VB: как определить обработчики к динамически созданным кнопкам? Т.е. если я переформулирую задачу - смысл тот же, только теперь в caption пишем номер кнопки, и надо, чтобы удаление и добавление кнопок производилось по последним кнопкам в столбце? На VC++ я знаю как это можно сделать, а на VB теряюсь вот...
Немного не понял вопрос... К динамически созданным кнопкам можно обращаться так же, как и к статическим. По имени и индексу. Если есть желание, можно и через API попариться, токмо в этом нет смысла...:)
Немного не понял вопрос... К динамически созданным кнопкам можно обращаться так же, как и к статическим. По имени и индексу. Если есть желание, можно и через API попариться, токмо в этом нет смысла...:)
для обычных кнопок есть обработчик нажатия - OnClicked или что-то в этом духе, он создается когда на кнопку в редакторе диалога нажимаешь. Теперь в программе я создаю кнопки динамически и хочу чтобы каждая кнопка свое действие выполняла при нажатии. Как мне определить процедуры, вызывающиеся при нажатии каждой кнопки и как связать их с этими динамическими кнопками?
для обычных кнопок есть обработчик нажатия - OnClicked или что-то в этом духе, он создается когда на кнопку в редакторе диалога нажимаешь. Теперь в программе я создаю кнопки динамически и хочу чтобы каждая кнопка свое действие выполняла при нажатии. Как мне определить процедуры, вызывающиеся при нажатии каждой кнопки и как связать их с этими динамическими кнопками?
Разберём на примере кобытия Click для кнопки.
Когда у тебя есть простая кнопка с именем, например Button, то событие клика у неё вызывает процедуру Button_Click().
Если у тебя кнопка из массива, то событие генерируется такое же, но с передачей по ссылке индекса кнопки Button_Click(Index as Integer).
Тут из-за внутреннего объявления события Click с получением ByRef Index типа Integer, изменить, к сожалению, Button_Click(Index as Integer) на Button_Click(Index as Long) нельзя. Но это - отступление от темы.
Обрабатывать конкретную кнопку ты можешь по интедку. Тоесть, все клики на кнопки из массива генерируют вызов одной процедуры Button_Click(Index as Integer), но уже какая именно кнопка нажата, ты можёшь посмотреть по переменной Index. Напрмер, есть у тебя 3 кнопки Button. Тебе нужно повесить разные действия на них. Пишешь:
'МАХ Обработка клика по кнопке из массива
Select Case Index
Case 0 'МАХ Нажата 1 кнопка из элементов
действие 1
Case 1 'МАХ Нажата 2 кнопка из элементов
действие 2
Case 2 'МАХ Нажата 3 кнопка из элементов
действие 3
End Select
End Sub
Надеюсь, понятно описал. Если есть вопросы, скинь сюда - постараюсь уточнить неясности.
Разберём на примере кобытия Click для кнопки.
Когда у тебя есть простая кнопка с именем, например Button, то событие клика у неё вызывает процедуру Button_Click().
Если у тебя кнопка из массива, то событие генерируется такое же, но с передачей по ссылке индекса кнопки Button_Click(Index as Integer).
Тут из-за внутреннего объявления события Click с получением ByRef Index типа Integer, изменить, к сожалению, Button_Click(Index as Integer) на Button_Click(Index as Long) нельзя. Но это - отступление от темы.
Обрабатывать конкретную кнопку ты можешь по интедку. Тоесть, все клики на кнопки из массива генерируют вызов одной процедуры Button_Click(Index as Integer), но уже какая именно кнопка нажата, ты можёшь посмотреть по переменной Index. Напрмер, есть у тебя 3 кнопки Button. Тебе нужно повесить разные действия на них. Пишешь:
'МАХ Обработка клика по кнопке из массива
Select Case Index
Case 0 'МАХ Нажата 1 кнопка из элементов
действие 1
Case 1 'МАХ Нажата 2 кнопка из элементов
действие 2
Case 2 'МАХ Нажата 3 кнопка из элементов
действие 3
End Select
End Sub
Надеюсь, понятно описал. Если есть вопросы, скинь сюда - постараюсь уточнить неясности.
а принципе понятно, только маленькое уточнение - если массив кнопок я создал динамически, с именем MyName(20) - обработчик будет MyName_Click? он автоматически определится как такой? в смысле, что в редактор диалогов я не залезаю для динамических кнопок.
а принципе понятно, только маленькое уточнение - если массив кнопок я создал динамически, с именем MyName(20) - обработчик будет MyName_Click? он автоматически определится как такой? в смысле, что в редактор диалогов я не залезаю для динамических кнопок.
Тут всё просто.
1. Ты можешь создавать элемент поздним связыванием. Этот случай мы сейчас не рассматриваем, но он аналогичен тому, что будет описан ниже.
2. Ты кладёшь элемент на форму. При этом у него нет индекса и событие для него, например, Button_Click().
Чтобы на его основе тебе создать масив, тебе можно:
а). На форме скопировать и вставить этот элемент, или создать такой же и присвоить ему такое же имя. При этом среда спросит, уверен ли ты, что создаёшь массив. При положительном ответе, среда автоматом присвоит индекс 0 1 элементу, а второму - индекс 1.
б). Можешь сам в редакторе присовить элементу индекс 0. Остальные элементы ты тогда сможешь подгружать, создавая экземпляры 0 объекта, присваивая им индексы.
В любом случае, если у тебя есть хоть 1 элемент с индексом на форме, среда автоматом создаёт для его событие Button_Click (Index as Integer). Тоесть, для того, чтобы это событие возникало, тебе нужно иметь хоть 1 элемент с индексом. И всё.
После этого ты можешь хоть 100 элементов создать (у VB ограничение начинается по-моему, где-то около 1000, если не больше, элементов (до "чистого" Integer это не дотягивает, к сожалению)). По какому из них не кликай, у тебя возникает одно событие Button_Click, вызвающеее одну процедуру Button_Click (Index as Integer), в которой Index и будет соответствовать твоему элементу.
Тут всё просто.
1. Ты можешь создавать элемент поздним связыванием. Этот случай мы сейчас не рассматриваем, но он аналогичен тому, что будет описан ниже.
2. Ты кладёшь элемент на форму. При этом у него нет индекса и событие для него, например, Button_Click().
Чтобы на его основе тебе создать масив, тебе можно:
а). На форме скопировать и вставить этот элемент, или создать такой же и присвоить ему такое же имя. При этом среда спросит, уверен ли ты, что создаёшь массив. При положительном ответе, среда автоматом присвоит индекс 0 1 элементу, а второму - индекс 1.
б). Можешь сам в редакторе присовить элементу индекс 0. Остальные элементы ты тогда сможешь подгружать, создавая экземпляры 0 объекта, присваивая им индексы.
В любом случае, если у тебя есть хоть 1 элемент с индексом на форме, среда автоматом создаёт для его событие Button_Click (Index as Integer). Тоесть, для того, чтобы это событие возникало, тебе нужно иметь хоть 1 элемент с индексом. И всё.
После этого ты можешь хоть 100 элементов создать (у VB ограничение начинается по-моему, где-то около 1000, если не больше, элементов (до "чистого" Integer это не дотягивает, к сожалению)). По какому из них не кликай, у тебя возникает одно событие Button_Click, вызвающеее одну процедуру Button_Click (Index as Integer), в которой Index и будет соответствовать твоему элементу.
все понятно, спасибо большое! в VC++, вроде можно аналогично действовать, кроме этого есть возможность перехватывать сообщения на уровне окна, на котором расположены элементы и обрабатывать их в обработчике событий окна, если надо - то отправлять их дальше, элементам управления (через PreTranslateMessage).
все понятно, спасибо большое! в VC++, вроде можно аналогично действовать, кроме этого есть возможность перехватывать сообщения на уровне окна, на котором расположены элементы и обрабатывать их в обработчике событий окна, если надо - то отправлять их дальше, элементам управления (через PreTranslateMessage).
В классическом VB это тоже - не проблема (через API) так как там все элементы управления это либо окна, либо окноподобные объекты. А вот в VBA это не везде прокатит. Для того же Access 2000 большинство контролов - не больше, чем картинка поверх отображаемой области. И даже хендл этой картинки поймать - больше чем биг проблем, так как зачастую его просто не существует!:{
Budet zdelano,komandir:)
Я немного ошибся.
В Private Sub CbUnload_Click(Index As Long)
тип Long нужно заменить на Integer, иначе может вылетать ошибка - там передаётся на внутреннем уровне всё по ссылке, и при автоматическом преобразовании типов (неявном преобразовании так называемом) Windows может вываливать твой код в нечитаемую область памяти. С этим нужно быть очень внимательным - я когда в первый раз с этим столкнулся, очень долго парился. Ещё хуже было от того, что когда среда выпадает в Out of memory, или Memory culd not be read, то не только приложение "вылетает", но и вся среда. И приходится всё начинать заново.:{
Я немного ошибся.
В Private Sub CbUnload_Click(Index As Long)
тип Long нужно заменить на Integer, иначе может вылетать ошибка - там передаётся на внутреннем уровне всё по ссылке, и при автоматическом преобразовании типов (неявном преобразовании так называемом) Windows может вываливать твой код в нечитаемую область памяти. С этим нужно быть очень внимательным - я когда в первый раз с этим столкнулся, очень долго парился. Ещё хуже было от того, что когда среда выпадает в Out of memory, или Memory culd not be read, то не только приложение "вылетает", но и вся среда. И приходится всё начинать заново.:{
huh, ya to podumala problema s proqoy
i vot esho ne ponel vot eto
[COLOR=blue]If CbUnload.UBound = CbUnload.LBound And CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = False
[/COLOR]
насчет переменных...
Создай 1 кнопку и 1 объект для вывода текста (можно static, например). в обработчике нажатия кнопки используй одну локальную переменную. при нажатии на кнопку в объекте выводи количество нажатий на кнопку. ОБЯЗАТЕЛЬНОЕ УСЛОВИЕ: глобальные переменные использовать нельзя.
Kak vseqda ne moqu s pervoqo raza,reshit zadachu.
mojet kak to pomojete?Ya peremennix ne davno chital,i pomoemu prosil vas o nix zadachu dat.
Problema v tom chto ne moqu generirovat code v bashke (men kajetsya chto et iz toqo chto ya novichok) kak vi schitayete tak i dayte podskazku
. Я специально чуть - чуть "не дописал" код, чтобы, если у тебя будет время, ты мог подумать, как оптимизировать эту процедуру...
Voopsheta ya ne znayu nicheqo o optimizasiye,esli mojete podskajite kak et zdelat ,no poka kod ne dayte
Kak vseqda ne moqu s pervoqo raza,reshit zadachu.
mojet kak to pomojete?Ya peremennix ne davno chital,i pomoemu prosil vas o nix zadachu dat.
Problema v tom chto ne moqu generirovat code v bashke (men kajetsya chto et iz toqo chto ya novichok) kak vi schitayete tak i dayte podskazku
подсказка: переменную в процедуре нужно объявить специальным способом, чтобы она сохраняла свое значение.
кода тебе надо написать всего 3 строчки
huh, ya to podumala problema s proqoy
i vot esho ne ponel vot eto
[COLOR=blue]If CbUnload.UBound = CbUnload.LBound And CbUnload(CbUnload.LBound).Visible Then
CbUnload(CbUnload.LBound).Visible = False
[/COLOR]
Знать так,
UBound и LBound - это границы массивов элементов (такие эе свойства есть и у масссивов данных).
UBound - верхняя граница,
LBound - нижняя граница,
Count - количестиво
Тоесть, если ц тебя 4 элемента CbUnload, с индексами от 0 до 3, то
CbUnload.LBound = 0
CbUnload.UBound = 3
CbUnload.Count = 4
Тоесть CbUnload(CbUnload.LBound) это в данном случае всё равно, что CbUnload(0), просто ссылка не по фиксированному индексу, а по вычисляемому гораздо универсальнее.