powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
25 сообщений из 181, страница 2 из 8
Создание объекта shape программно
    #38866507
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronА переспрашивать не хочутем самым делая еще хуже, так как я считаю, что ты понял
vdekameronпошлете или просто не ответитепошлю в гугл или учебник, если считаю, что там есть ответ, но если ты возвращаешься из гугла или учебника, не разобравшись, попытаюсь все же объяснить.

vdekameronНе совсем понял(((так. мы возвращаемся на две недели назад - основы процедур:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub Command1_Click()

Dim a As Integer
a = 2
a = MySum(a, 4)
MsgBox CStr(a)

End Sub
Function MySum(a As Integer, b As Integer)

MySum = a + b ^ 2

End Function


не запуская код ответь, что выведет MsgBox при нажатии кнопки и почему, потом проверь
Пока нет понимания этого кода, нет смысла идти дальше
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866515
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronДелаю вот так выдает ошибку - byref argument type mismatchа надо взять словарь английского и перевести ошибку.

Код: vbnet
1.
sh As Integer

на основании каких соображений ты так определил аргумент?

vdekameronНе могу понять как цикл записать чтобы перебирал все им. shКоллекцию удобнее всего перебирать с помощью цикла For Each, а не с помощью For. Тогда тебе не надо будет думать о том, сколько у тебя элементов в коллекции и как они называются.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866634
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proне запуская код ответь, что выведет MsgBox при нажатии кнопки и почему, потом проверь
Пока нет понимания этого кода, нет смысла идти дальше
Сначала прочитал, ответил и проверил- сошлось. Я понимаю смысл каждой строчки этого кода.
Код: vbnet
1.
a = MySum(a, 4)

- вызываю функцию, передавая ей a=2 и b=4. Возвращаем из нее 18
Shocker.Proна основании каких соображений ты так определил аргумент?
на основании того, что кол-во шейпов это же число.

Shocker.ProКоллекцию удобнее всего перебирать с помощью цикла For Each, а не с помощью For.
Сейчас читал про For each.
Код: vbnet
1.
2.
3.
4.
5.
Private Sub Timer1_Timer()
 For Each sh In Me.Controls
 One_step
 Next sh
End Sub

Не могу понять почему он присваивает sh имя - Таймер Разве sh не коллекция контролов?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866644
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronна основании того, что кол-во шейпов это же число.А причем тут количество шейпов? Ты разве количество передаешь в процедуру? Что ты должен передать туда? И как ты у КОЛИЧЕСТВА потом нашел свойства Left и Top?


vdekameronСейчас читал про For each.
Код: vbnet
1.
2.
3.
4.
5.
Private Sub Timer1_Timer()
 For Each sh In Me.Controls
 One_step
 Next sh
End Sub


Не могу понять почему он присваивает sh имя - Таймер Разве sh не коллекция контролов?Всё не то.
Во-первых, тебе нужно перебирать в цикле коллекцию шейпов, а не коллекцию контролов формы
Во-вторых, где и как у тебя объявлена sh? Уже десять раз сказал, что переменные надо в процедурах объявить, а ты опять ее неизвестно где объявил.
Нет, sh - это не коллекция контролов.
Код: vbnet
1.
Dim colShapes As New Collection 'вот твоя коллекция шейпов

Код: vbnet
1.
colShapes.Add sh 'вот ты добавляешь туда очередной шейп
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866759
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProВо-вторых, где и как у тебя объявлена sh? Уже десять раз сказал, что переменные надо в процедурах объявить, а ты опять ее неизвестно где объявил.
Объявляю в процедуре возникает ошибка, а так работает. значит неправильно объявил ее?
Вот до чего дошел. Все работает, только не знаю куда вопхнуть счетчик k=k+1. когда один sh он отрабатывает 10 шагов первого sh , а когда появляется второй sh то третий уже появляется после 5 шагов первого и 5 второго. т .е. в прогрессии уменьшается число шагов каждого до появления след.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Dim sh As Control
Dim colShapes As New Collection
Dim k As Integer

Private Sub Form_Load()
Show
  eddcontrol
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
 For Each sh In colShapes
 One_step
 Next sh
End Sub

Private Sub One_step()
    sh.Left = sh.Left + 200
    sh.Top = sh.Top + 300
    k = k + 1
    If k = 3 Then eddcontrol
End Sub

Private Sub eddcontrol()
  k = 0
  Set sh = Me.Controls.Add("VB.Shape", "sh" & colShapes.Count)
  sh.Visible = 1
  sh.Shape = 3
  colShapes.Add sh
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronОбъявляю в процедуре возникает ошибка, а так работает. значит неправильно объявил ее?значит ты не понимаешь, где и для чего она используется. Ты мыслишь тем, что переменная sh у тебя глобальная, поэтому затык, второй день никак не получается выбить из тебя эту дурь.
Забудь, у тебя нет глобальной переменной sh. Чтобы тебе было проще, забудь вообще про слово "sh" и объяви несколько переменных для шейпов с РАЗНЫМИ именами в каждой из процедур. Когда ты это сделаешь правильно, у тебя ВНЕЗАПНО прояснится в голове.

Кроме того, ты не сделал что я просил. У One_step должен быть параметр на входе - он должен принимать шейп и работать С НИМ (а не с каким-то непонятно каким sh). Ты пока все еще не понял принцип автономности процедур.

Как сделаешь, будем со счетчиком разбираться.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866784
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Timer1_Timer()
 For Each sh In colShapes
     One_step sh
 Next sh
End Sub

Private Sub One_step(ByRef Item as Shape)
    With Item 
        .Left = .Left + 200
     ...

    End With
...
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866827
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proзабудь вообще про слово "sh" и объяви несколько переменных для шейпов с РАЗНЫМИ именами в каждой из процедур

Я запутался!(((
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866833
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, давай по порядку.
Удали строку
Код: vbnet
1.
Dim sh As Control

она не нужна

Где у тебя использовалась эта sh?

1) в Timer1_Timer
напиши внутри собственный Dim (только другое имя дай)
кстати, лучше объявлять как Shape, а не как Control, ведь это же шейп

2) в One_step
тут у тебя должен быть входной параметр (см. подсказку Кости)

3) в eddcontrol
см. п. 1
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866839
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddcontrol

переименуй в AddShape, а то глаз режет
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866856
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного прояснилось, но честно сказать все-равно не понимаю до конца. Уже тупым себя начинаю чувствовать.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Dim colShapes As New Collection
Dim k As Integer

Private Sub Form_Load()
Show
  eddcontrol
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim figure As Shape
 For Each figure In colShapes
 One_step figure
 Next figure
End Sub

Private Sub One_step(ByRef mama As Shape)
With mama
    .Left = .Left + 200
    .Top = .Top + 300
    k = k + 1
    If k = 3 Then eddcontrol
    End With
End Sub

Private Sub eddcontrol()
Dim check As Shape
  k = 0
  Set check = Me.Controls.Add("VB.Shape", "sh" & colShapes.Count)
  check.Visible = 1
  check.Shape = 3
  colShapes.Add check
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866869
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот теперь все ок.
Спрашивай, что не понимаешь.

Что касается счетчика шагов.
Смотри, каждый тик таймера сначала двигает только один шейп (и прибавляет счетчик на единицу)
Потом начинает двигать сразу два шейпа (и счетчик меняется на две единицы за один тик)
Потом начинает двигать сразу три шейпа (и счетчик меняется на три единицы за один тик)
поэтому каждый следующий шейп у тебя появляется все быстрее и быстрее.

Чтобы счетчик считал один раз за один тик таймера, его надо поместить.... куда??? )
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866900
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proкуда??? )
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Timer1_Timer()
Dim figure As Shape
 k = k + 1
    For Each figure In colShapes
 One_step figure
 Next figure
   If k = 20 Then eddcontrol
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866920
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно, но зачем eddcontrol чего-то вообще знать о счетчике? Это - не ее предметная область
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Timer1_Timer()
  Dim figure As Shape
  For Each figure In colShapes
    One_step figure
  Next figure
  k = k + 1
  If k = 20 Then
    eddcontrol
    k = 0
  End If
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866924
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Проверил, все работает. Как теперь быть со step? чтобы каждый шар летел в своем направлении а не все в линеечку) Я так понимаю только после этого можно будет задать условие, что делать новый шар после удара об край.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866925
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProВерно, но зачем eddcontrol чего-то вообще знать о счетчике? Это - не ее предметная область
тогда получается что и k можно объявить только в этой процедуре
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866926
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- сделать типизованную коллекцию на основе своего класса
- в этом классе реализовать нужные методы
- вызывать методы с требуемыми параметрами для каждого элемента коллекции
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866928
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vdekameronтогда получается что и k можно объявить только в этой процедуре

беру слова назад.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866932
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One- сделать типизованную коллекцию на основе своего класса
- в этом классе реализовать нужные методы
- вызывать методы с требуемыми параметрами для каждого элемента коллекции

А поподробнее можно?))
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866934
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делается через визард коллекций в студии , дальше уже сам ручками модифицируй
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866939
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronтогда получается что и k можно объявить только в этой процедуреда, только ее придется объявить как Static, чтобы значение не обнулялось между вызовами. А можно оставить и так.

По уже сделанному коду все понятно или есть неясности?

Что касается отскоков, давай думать.
Для того, чтобы организовать отскок, нам нужно знать, в какую сторону летит конкретный шейп. Тут одной переменной не обойдешься, ведь у каждого шейпа своя траектория.

Есть два варианта:
1) Хранить нужные данные в имеющейся коллекции шейпов. Только теперь там придется хранить не сам шейп, а некоторую структуру, которую надо организовать. Структура будет включать в себя ссылку на сам шейп, а также его StepX и StepY. Почти такой вариант предложил Костя.

2) Хранить нужные данные в самом шейпе. Для этого у каждого контрола есть специальное свойство. Но оно - текстовое, а нам надо хранить два значения (или, как вариант, шифр направления движения, типа СВ - северо-восток). Тогда при каждом шаге нужно будет его расшифровывать и проверять.

Каким путем ты хочешь пойти?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866941
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneделается через визард коллекций в студии , дальше уже сам ручками модифицируйсовсем необязательно, можно тупо хранить в коллекции структуру, объявленную тут же
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866942
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно, но со своей коллекцией удобней и гибче, опять же можно глобальные методы сделать, общие для всех элементов и тд и тп
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866945
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneможно, но со своей коллекцией удобней и гибче, опять же можно глобальные методы сделать, общие для всех элементов и тд и тпто понятно, но рано еще ))
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866949
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 181, страница 2 из 8
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]