powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
25 сообщений из 181, страница 3 из 8
Создание объекта shape программно
    #38866974
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПо уже сделанному коду все понятно или есть неясности?
Все понятно.
Shocker.ProЕсть два варианта:
Я бы хотел первым.
А по второму могу только вякнуть, вдруг окажусь прав.
Shocker.ProНо оно - текстовое, а нам надо хранить два значения
Я в своем проекте организовывал склейку двух текстов, а потом в нужном месте возвращал значение и разбивал этот текс в нужном месте, получая снова 2 текстовых значения, которые ведь можно вернуть числом.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronЯ в своем проекте организовывал склейку двух текстов, а потом в нужном месте возвращал значение и разбивал этот текс в нужном месте, получая снова 2 текстовых значения, которые ведь можно вернуть числом.если захочешь попробовать - свойство шейпа (да и любого контрола) называется Tag, в нем можно хранить все, что хочешь в виде строки.

vdekameronЯ бы хотел первым.Ок. Для начала нам нужно организовать свой собственный составной тип переменной:
Код: vbnet
1.
2.
3.
4.
5.
Private Type ShaperType
  Sh As Shape,
  StepX As Integer,
  StepY As Integer
End Type

это некий контейнер, для шейпа и сопровождающих его данных. В коллекцию мы будем добавлять (и потом извлекать) не шейп, а этот контейнер:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub eddcontrol()
  Dim Cont As ShaperType
  Dim check As Shape
  Set check = Me.Controls.Add("VB.Shape", "sh" & colShapes.Count)
  check.Visible = 1
  check.Shape = 3
  ' тут мы заполняем нашу новую переменную и добавляем ее в коллекцию
  Set Cont.Sh = check
  Cont.StepX = 200
  Cont.StepY = 300
  colShapes.Add Cont
End Sub

Дальше сам. Обрати внимание, что в цикле For Each ты будешь извлекать уже не Shape, а ShaperType
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867037
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Так вроде более-менее понятно, единственное не могу понять почему когда заполняем контейнер пишем
Код: vbnet
1.
Set Cont.Sh = check

а не просто
Код: vbnet
1.
Cont.Sh = check

как и со степом?

Сегодня если дома будет время еще посмотрю, если что до завтра. Спасибо за терпение)) Ибо оно у вас огромное
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867056
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что передаём объект
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867064
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronа не просто как и со степома говорил, все понятно в предыдущем коде )))

на самом деле, со степом тоже не просто, это должно выглядеть так:
Код: vbnet
1.
2.
3.
  Set Cont.Sh = check
  Let Cont.StepX = 200
  Let Cont.StepY = 300

но бейсик позволяет пропустить слово Let, поэтому его почти никогда не пишут

Разница в том, что 200 и 300 представляют собой просто значения, а вот check, как и любой контрол, класс, форма и т.п. представляет собой объект. Для значений пишем Let, для объектов пишем Set.

Когда закончишь с этой программой, посмотри учебник на тему, что такое объект или объектный тип.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867415
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
Доброе утро!
Shocker.ProКогда закончишь с этой программой, посмотри учебник на тему, что такое объект или объектный тип. Хорошо, сделаю! Только у меня учебника нет, в интернете поищу.
Код: vbnet
1.
2.
3.
4.
5.
Private Type ShaperType
   Sh As Shape,
   StepX As Integer,
   StepY As Integer
End Type

Тут у меня вылазит ошибка - expected statament т.е. нужна переменная, какая, если все задали.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Timer1_Timer()
Dim figure As ShaperType
 k = k + 1
    For Each figure In colShapes
 One_step figure
 Next figure
   If k = 20 Then
     eddcontrol
     k = 0
   End If
End Sub

Private Sub One_step(ByRef mama As ShaperType)
With mama
    .Left = .Left + 30
    .Top = .Top + 40
End With
End Sub

Получается one_step уже не нужен? ведь в нашей новой переменной уже есть stepx и stepy. И кстати ведь они все-равно будут двигаться в одном и том же направлении.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867444
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronТут у меня вылазит ошибказапятые не нужны )
пишу на трех языках, "путаю педали" )))
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867451
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronПолучается one_step уже не нужен?как это не нужен?
суть программы остается как есть, просто ты расширяешь ее функциональность.

Просто в one_step теперь нужно реализовать проверку и отскок. Он ведь у тебя был в самом начале топика. Теперь интегрируй его в one_step

Далее:
Код: vbnet
1.
2.
3.
4.
With mama
    .Left = .Left + 30
    .Top = .Top + 40
End With

какого типа mama? Откуда у этого типа возьмутся свойства Left и Top?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867455
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proсуть программы остается как естьсуть архитектурного подхода тоже не меняется. one_step знает, как сделать шейпу шаг. Все остальные процедуры это абсолютно не волнует. В этом принцип разделения ответственности - один из основных столпов программирования.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867469
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proкакого типа mama? Откуда у этого типа возьмутся свойства Left и Top?
mama as shaperType. Мы же передаем в one_step уже контейнер.
Код: vbnet
1.
2.
3.
4.
5.
Dim figure As ShaperType
 k = k + 1
    For Each figure In colShapes
 One_step figure
 Next figure

Получается left и top там уже не нужны.
И еще вылазит ошибка. Интернет перевдчик ее не переводит.((
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronПолучается left и top там уже не нужны.а как ты тогда будешь двигать шейп? нужны. только они уже не к контейнеру применяются, а к шейпу, который лежит в контейнере
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867486
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameron И еще вылазит ошибка. Интернет перевдчик ее не переводит.(( В коллекцию могут быть добавлены только те пользовательские типы, которые объявлены как Publiс в модулях.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867489
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyvdekameronИ еще вылазит ошибка. Интернет перевдчик ее не переводит.(( В коллекцию могут быть добавлены только те пользовательские типы, которые объявлены как Publiс в модулях.неа, все хуже.
не "как Public", а в публичных модулях, то есть в отдельной библиотеке по факту.

Эх, блин, ограничение VB.
Ну ладно, тогда используем массив вместо коллекции, ща напишу как
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867496
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНу ладно, тогда используем массив вместо коллекции, ща напишу как
Не успеваю за вашим ходом мыслей блин)
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867499
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, точно.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867511
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronНе успеваю за вашим ходом мыслей блин)к сожалению, столкнулись с ограничением VB, которое не позволит использовать коллекцию в нашем случае.

Так что, вместо коллекции будет массив (просто немного больше телодвижений)

Вот рабочий переделанный код, изучи его.
(небольшой комментарий - массив нумеруется с нуля, а не с единицы, просто я не использую нулевой элемент, иначе пришлось бы ввести еще одну проверку)
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Option Explicit


Private Type ShaperType
   Sh As Shape
   StepX As Integer
   StepY As Integer
End Type

Dim colShapes() As ShaperType
Dim k As Integer

Private Sub Form_Load()

  ReDim colShapes(0)
  eddcontrol
  Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer()

  Dim i As Integer
  For i = 1 To UBound(colShapes)
    One_step colShapes(i)
  Next i
  k = k + 1
  If k = 10 Then
    eddcontrol
    k = 0
  End If
  
End Sub

Private Sub One_step(ByRef mama As ShaperType)
  
  With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
  End With

End Sub

Private Sub eddcontrol()
  
  Dim check As ShaperType
  
  Set check.Sh = Me.Controls.Add("VB.Shape", "sh" & UBound(colShapes) + 1)
  check.StepX = 200
  check.StepY = 300
  check.Sh.Visible = 1
  check.Sh.Shape = 3
  
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check

End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867574
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProВот рабочий переделанный код, изучи его.
Не учил еще работу с массивами. Сейчас читал. Получается:-
Код: vbnet
1.
Dim colShapes() As ShaperType

делаем массив из ShaperType
ReDim Preserve - позволяет менять верхнюю размерность массива.
Ubound - возвращаем верхний эл-т массива.
Я немного изменил код, посмотрите пожалуйста.
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
Option Explicit
Dim colShapes() As ShaperType
Private Type ShaperType
   Sh As Shape
   StepX As Integer
   StepY As Integer
End Type

Private Sub Form_Load()
Show
  ReDim colShapes(0)
 eddshape
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
 Dim i As Integer
  For i = 1 To UBound(colShapes)
    One_step colShapes(i)
  Next i
End Sub

Private Sub One_step(ByRef mama As ShaperType)
With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
    If .Left >= Form1.Left Or .Left <= 0 Then eddshape: mama.StepX = -200
    If .Top >= Form1.Height Or .Top <= 0 Then mama.StepY = -300
End With
End Sub

Private Sub eddshape()
Dim check As ShaperType
  Set check.Sh = Me.Controls.Add("VB.Shape", "sh" & UBound(colShapes) + 1)
  check.Sh.Visible = 1
  check.Sh.Shape = 3
  check.StepX = 200
  check.StepY = 300
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check
End Sub


Задал что при отскоке создается новый эл. массива и меняются координаты движения.
После выполнения примерно 10-15 one_step вылазит ошибка
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867616
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
писал жа выше, что нужно свою коллекцию юзать, а то вот уже до массивов добрались
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867623
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

Он мне пытается объяснить как проще Никто-ж не знал что вылезут эти косяки)
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867626
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Массив действительно временно заблокирован, потому как мы в этот момент используем один из его элементов

Вариант 1) не блокировать элемент:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Timer1_Timer()
 Dim i As Integer
 Dim ShapeCont As ShaperType
 
  For i = 1 To UBound(colShapes)
    ShapeCont = colShapes(i)
    One_step ShapeCont
  Next i
End Sub

это для общего образования

Вариант 2 ПРАВИЛЬНЫЙ) вернуться к пути единственной ответственности.

One_step должен заниматься только движением шейпа, его ничего другое не интересует. Заметь, ведь в предыдущем коде было именно так - новый шейп добавляла процедура Timer1_Timer, которая у нас по факту является управляющей всем процессом.
Ты нарушил принцип и опять столкнулся с проблемой.

Сделай One_step функцией типа boolean, пусть он возвращает признак - в процессе шага шейп коснулся края формы. Что будет кто-то делать с этой информацией - его не волнует.
А управляющая программа Timer1_Timer проанализирует этот признак и решит, что нужно добавить новый шейп. Это - ее проблема, когда добавлять новый шейп, через десять шагов, после касания края, после прошествия определенного времени и т.п. One_step это никак не должно волновать.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867628
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneписал жа выше, что нужно свою коллекцию юзать, а то вот уже до массивов добрались ну а что ж ты сразу не сказал, что usertype в коллекцию нельзя добавить? )))
Shocker.Proможно тупо хранить в коллекции структуру, объявленную тут жеKonst_OneможноЯ считаю, что работа с классами очень сильно запутает автора, пусть лучше массив пока.

Можно подчеркнуть для автора - в больших проектах массивы действительно используется редко. Но знать о них надо )
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867636
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не ну пусть шишки набивает на своём коде, так больше поймёт. я не против такого метода.
когда готовый рабочий код даёшь, то ничему не научится.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867714
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Конечно все получилось, но это немного не то, что я изначально хотел)
Сейчас работает так - появляется шар , ударяется об правый край и вызывает за собой след. Теперь когда первый уже коснется края он не вызовет третий шар, нужно чтобы второй ударился для появления третьего(((
В итоге 4-ый шар как-то непонятно зацикливается на маленьком stepX, и пооооока он доползет до края остальные три шара там уже по 20 раз каждый ударяется. Не помог и Randomize( в этом случае зацикливается 5 или 6 шар)
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Option Explicit
Dim colShapes() As ShaperType
Private Type ShaperType
   Sh As Shape
   StepX As Integer
   StepY As Integer
End Type
Dim edd As Boolean

Private Sub Form_Load()
Show
  ReDim colShapes(0)
  eddshape
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
 Dim i As Integer
  For i = 1 To UBound(colShapes)
    One_step colShapes(i)
  Next i
  If edd = True Then eddshape
End Sub

Private Sub One_step(ByRef mama As ShaperType)

With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
    If .Left >= Form1.Width - .Width Then edd = True: mama.StepX = -200 * Rnd Else edd = False
    If .Left <= 0 Then edd = True: mama.StepX = 200 * Rnd
    If .Top >= Form1.Height - .Width Then mama.StepY = -300 * Rnd
    If .Top <= 0 Then mama.StepY = 300 * Rnd
End With
End Sub

Private Sub eddshape()

Dim check As ShaperType
  Set check.Sh = Me.Controls.Add("VB.Shape", "sh" & UBound(colShapes) + 1)
  check.Sh.Visible = 1
  check.Sh.Shape = 3
  check.StepX = 200 * Rnd
  check.StepY = 300 * Rnd
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867747
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что же это такое? Зачем тут опять взялась глобальная переменная?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867755
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProДа что же это такое? Зачем тут опять взялась глобальная переменная?
Что же мне ее объявлять в 2 местах ? в таймере и в one_step ?
Shocker.ProСделай One_step функцией типа boolean One_step это же процедура, как я ее функцией сделаю типа Boolean
...
Рейтинг: 0 / 0
25 сообщений из 181, страница 3 из 8
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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