powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
181 сообщений из 181, показаны все 8 страниц
Создание объекта shape программно
    #38864634
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гуглю уже минут 20. Нифига толкового нет на тему как программно создать фигуру shape.
Если не сложно, подскажите как это сделать.
Спасибо!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864645
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начать запись макроса
вставить shape мышкой
закончить запись макроса
посмотреть записанный макрос
понять записанный макрос
...
профит
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864650
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, Браво за аватарку!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864657
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой еще макрос? Я написал в ветке Visual Basiс. Хотел создать на VB6. Но тем не менее воспользовался идеей.
Antonariyначать запись макроса
вставить shape мышкой
закончить запись макроса
посмотреть записанный макрос
понять записанный макрос
В excel проделал это, ибо думаю код будет похож. Но этот макрос после записи пуст!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864688
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronКакой еще макрос? Я написал в ветке Visual Basiс. Хотел создать на VB6. тьфу, я-то уже и забыл, что эта ерунда есть в VB6, думал по офису вопрос.

Код: vbnet
1.
2.
3.
4.
5.
Private Sub Form_Load()
 Set sh = Me.Controls.Add("VB.Shape", "sh1")
 sh.Visible = 1
 sh.Shape = 3
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864709
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyтьфу, я-то уже и забыл, что эта ерунда есть в VB6ты, походу, еще забыл, чему равно True в VB )))

ЗЫ: Я тоже про офис подумал сначала
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864735
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proчему равно True в VBНу, главное помнить, чему не равно :-)
0 - False. А все остальное уже True. Поэтому можно и 3 поставить, VB воспримет как True.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864742
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist, да я-то в курсе, троллю по-тихому )
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38864860
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyтьфу, я-то уже и забыл, что эта ерунда есть в VB6ты, походу, еще забыл, чему равно True в VB )))да пофиг, +/- важен лишь в математике, и на самом деле я не брезгую заменять условия формулами, они быстрее работают, так что значение true мне прекрасно известно :).

просто из-за неопределенности типа sh интеллисенс не подсказал варианты для visible, а 1 пейсать короче, чем true.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865021
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,Shocker.Pro,The_Prist, Да тут целые баталии развернулись)
Спасибо! А насчет свойства Visible пока вчера гуглил прочитал. Что по умолчанию создается shape.visible=false , поэтому понятно почему =1 или true
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865066
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выполняется отскакивание shape1 от краев формы. Как только шар касается правого края, создается новый шар. Подскажите пожалуйста как организовать движение каждого нового появляющегося shape.
В учебнике этого нет, но мне уже самому интересно. Если не сложно подскажите.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Option Explicit
Dim stepY As Integer, stepX As Integer
Dim y As Integer, x As Integer, sh As Control

Private Sub Form_Load()
  stepY = -60
  stepX = 40
    y = Shape1.Top
    x = Shape1.Left
End Sub

Private Sub Timer1_Timer()
y = y + stepY
x = x + stepX

Shape1.Top = y
Shape1.Left = x

If y <= 0 Then stepY = 60
If y >= Form1.Height - Shape1.Width Then stepY = -60
If x > Width - Shape1.Width Then stepX = -40: Set sh = Me.Controls.Add("VB.Shape", "sh1"): sh.Visible = True: sh.Shape = 3
If x < 0 Then stepX = 40
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865119
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в этом коде
Код: vbnet
1.
Set sh = Me.Controls.Add("VB.Shape", "sh1")

переменной sh присваивается созданный шейп.

Соответственно, двигать нужно не Shape1, a sh
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865154
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProСоответственно, двигать нужно не Shape1, a sh
Я наверное снова не достаточно лаконично выразился Код, который скинул Антонарий я понял. Также как и то, что можно допустим Me.Controls.Add("VB.Shape", "sh1") писать без Me и то, что мы создали круг с именем sh.

Вопрос в другом. Я то его двигать смогу, например точно так же как и shape1 созданный в design.
НО ведь пока первый шар не ударится об край формы следующего шара нет, отсюда вытекают те вопросы, которые я некорректно задал:

1) Как прописать в таймере что если контрола нет, то .....
2) Как создавать каждый раз shape с новым именем( когда шар ударился второй раз об край формы вылезла ошибка - такой объект уже есть.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865249
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) Один вариант:

Задать контролу в дизайне свойство Index = 0. Это сделает его массивом контролов. Нулевой элемент скрываем - Visible = 0
Добавить новый контрол -
Код: vbnet
1.
2.
Load Shape1(x)
Shape1(x).Visible = 1



Другой вариант:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim colShapes As New Collection

Private Sub Form_Load()
 Set sh = Me.Controls.Add("VB.Shape", "sh" & colShapes.Count)
 sh.Visible = 1
 sh.Shape = 3
 colShapes.Add sh
End Sub

"sh" & colShapes.Count будет работать до тех пор, пока из коллекции не начнут удаляться элементы произвольным образом.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865449
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy"sh" & colShapes.Count будет работать до тех пор, пока из коллекции не начнут удаляться элементы произвольным образом.
Ну тут понятно, я смогу и сам ограничить число их появления. Самый главный вопрос в том как мне потом вдохнуть в эти sh жизнь
Код: 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.
Option Explicit
Dim stepY As Integer, stepX As Integer
Dim y As Integer, x As Integer, sh As Control

Private Sub Form_Load()
  stepY = -60
  stepX = 40
    y = Shape1.Top
    x = Shape1.Left
End Sub

Private Sub Timer1_Timer()
y = y + stepY
x = x + stepX

Shape1.Top = y
Shape1.Left = x

If y <= 0 Then stepY = 60
If y >= Form1.Height - Shape1.Width Then stepY = -60
If x > Width - Shape1.Width Then eddcontrol
If x < 0 Then stepX = 40
End Sub

Private Sub eddcontrol()
 Set sh = Me.Controls.Add("VB.Shape", "sh" & colShapes.Count)
  sh.Visible = 1
  sh.Shape = 3
  colShapes.Add sh
End Sub


Придется в процедуре таймера для каждого sh писать
Код: vbnet
1.
2.
Sh.Top = y
Sh.Left = x


Если так, то если контролов будет 100 , то строк будет 200, что как минимум не правильно. И второе, возвращаясь к первому своему вопросу, пока первый шар не ударился о край формы таймер выполнится несколько раз. И сразу выдаст ошибку, что необходим объект. Конечно и это можно обойти, опираясь на свой минимум знаний, и включить обработчик ошибок, но и это мне кажется не совсем правильно.
Может есть более правильный и простой способ избежать этого?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865752
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм опиши словами, а не кодом

Как я понял:
Шейп двигается до края экрана, как только достиг, мы на него плюем, создаем новый шейп и двигаем его.
И зачем нам эти 200 строк? мы двигаем только текущий шейп, на остальные забили.

Возможно, я неверно понял задачу.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865774
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProВозможно, я неверно понял задачу.

Нет(( Это я как обычно объяснил и думаю раз я знаю что нужно, то должны догадаться и все((

А на самом деле идея в том, что когда первый shape (созданный в design ) касается края появляется второй и он должен начать двигаться с того места где появился по тому же закону что и первый shape( который остается в движении и видимым) т.е.
Код: vbnet
1.
2.
stepY = -60
  stepX = 40


При чем если сделать даже как я написал
vdekameronПридется в процедуре таймера для каждого sh писать
Код: vbnet
1.
2.
Sh.Top = y
Sh.Left = x


То после появления второго sh он сразу сольется с первым и будут дружно лететь вместе как один т.к.
Код: vbnet
1.
2.
3.
4.
5.
y = y + stepY
x = x + stepX

Shape1.Top = y
Shape1.Left = x


Вот тут я и застрял. Надеюсь в этот раз понятнее объяснил
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38865813
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть у всех шейпов одно и то же место старта?

ЗЫ: не надо плодить сущности, зачем создавать 99 шейпов программно и один в дизайне? создавай все 100 программно, это сильно упростит программу.

ЗЗЫ: Делаешь процедуру, которая называется ОДИН_ШАГ и на входе получает шейп.

Процедура делает один шаг указанному шейпу (при этом ей все равно, с каким шейпом она работает, вспомни, чему я тебя учил - процедура не знает ничего о том, кто ее вызывает)

Далее устраиваешь цикл, который который вызывает этот шаг для каждого из существующих шейпов.

То есть имеет место быть стандартный прием программирования - инкапсуляция. Вышестоящая программа делает шаги, но не знает, каким образом реализуется сам шаг. Процедура делает шаг, но ей все равно, кто ее вызывает и зачем. Таким образом легче программу понимать, модифицировать и отлаживать.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866379
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proсоздавай все 100 программно, это сильно упростит программу.

Сделал.
Shocker.ProЗЗЫ: Делаешь процедуру, которая называется ОДИН_ШАГ и на входе получает шейп.
Сделал.

ИТОГ:-Первый созданный sh двигается и когда касается правого края появляется второй sh, который сразу оказывается возле первого, а не плавно начинает двигаться со своего места появления.
При этом первый sh уже стоит на месте т.к. Таймер уже работает со вторым.
Я не проигнорировал вашу строку-

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

Код: 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 stepY As Integer, stepX As Integer
Dim y As Integer, x As Integer, sh As Control
Dim colShapes As New Collection

Private Sub Form_Load()
Show
  stepY = -200
  stepX = 150
  eddcontrol
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
 One_step
   If y <= 0 Then stepY = 200
   If y >= Form1.Height - sh.Width Then stepY = -200
   If x > Width - sh.Width Then eddcontrol
   If x < 0 Then stepX = 150
End Sub

Private Sub One_step()
  y = y + stepY
  x = x + stepX
    sh.Left = x
    sh.Top = y
End Sub

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

Не пытайся написать программу, пока не придумал алгоритм, который ты можешь написать на бумаге и который будет работать в твоем сознании. Перевод алгоритма в код - дело техники, создание алгоритма - основная работа.

Естественно, если ты используешь переменные x и y для всех шейпов сразу, они и будут находиться в одном месте, разве это не очевидно?
И вообще, зачем нужны эти переменные, если те же самые значения хранятся в свойствах шейпа Top и Left? Не нужны вообще.

Единственная проблема возникнет сейчас в stepY и stepX. Давай пока ты ее решать не будешь, чтобы не морочить себе голову ее можно решать отдельно. Пусть задача выглядит так: один шейп вылетел из исходной точки и полетел в указанном направлении, через 10 шагов в исходной точке появился второй шейп и полетел туда же, через 10 третий и т.п. (при этом, естественно, первый лететь не прекращает).
Вот сделаешь это, тогда будем решать с отскоком от края.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866392
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eddcontrol естественно, должна быть тоже автономна. Она ничего не принимает на вход, но возвращает созданный шейп.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866422
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя зацикленность на общих переменных, я не понимаю, откуда это взялось и как заставить избавиться от этой зависимости.
Посмотри на свой код, ни одной переменной не определено в процедурах, ни одного параметра, ни одна процедура не возвращает результат, все переменные объявлены на уровне формы.

Это неверный подход в принципе. Он тебе мешает, из-за этого у тебя не работает программа, потому что она представляет собой спагетти (и это почти официальный термин в программировании ))).
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866464
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТы игнорируешь мои советы, я могу устать советовать.
Я понимаю, что вам может просто надоесть возня со мной, но я не игнорирую ваши советы вообще! Читаю по несколько раз, просто не совсем понимаю в виду своей недостаточной грамотности в этих вопросах. Но я же учусь. А переспрашивать не хочу) Ибо рискую тем, что пошлете или просто не ответите
Shocker.ProНе пытайся написать программу, пока не придумал алгоритм, который ты можешь написать на бумаге и который будет работать в твоем сознании.
Алгоритм я четко в своей голове представил и могу четко написать на бумаге и уже точно объяснил вам. Я бы не морочил вам голову, если бы сам не знал чего я хочу!
Избавился от глоб. переменных. оставил только коллекцию шейпов.
Shocker.Pro- One_step должна принимать шейп в качестве параметра и работать с ним
Не совсем понял(((
Shocker.Pro- One_step должна вызываться в цикле, который перебирает все имеющиеся на данный момент шейпы
Не могу понять как цикл записать чтобы перебирал все им. sh
Делаю вот так выдает ошибку - byref argument type mismatch
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Timer1_Timer()
 For i = 1 To 100
 sh.Name = i
 One_step sh
 Next
End Sub

Private Sub One_step(sh As Integer)
    sh.Left = sh.Left + 40
    sh.Top = sh.Top + 60
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38866468
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProУ тебя зацикленность на общих переменных, я не понимаю, откуда это взялось и как заставить избавиться от этой зависимости.
Посмотри на свой код, ни одной переменной не определено в процедурах, ни одного параметра, ни одна процедура не возвращает результат, все переменные объявлены на уровне формы.

Это неверный подход в принципе. Он тебе мешает, из-за этого у тебя не работает программа, потому что она представляет собой спагетти (и это почти официальный термин в программировании ))).

Эту базу мне дала книга, по которой сейчас занимаюсь. Хотел ее скинуть вам просто для оценки опытным взглядом, но ее размер 7 метров(
...
Рейтинг: 0 / 0
Создание объекта 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
Создание объекта 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
Создание объекта shape программно
    #38867762
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronТеперь когда первый уже коснется края он не вызовет третий шар, нужно чтобы второй ударился для появления третьего((все потому, что ты сделал глобальную переменную, которая непонятно как инициализируется и сбрасывается, то есть там полная ерунда с событиями.

Сделай как я сказал.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867763
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
Friend function OneStep(Byref Item as ShaperType) as Boolean
...
End Function
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867765
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
Dim b as Boolean

...
b = OneStep(myshape)
MsgBox b
...
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867766
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronЧто же мне ее объявлять в 2 местах ? в таймере и в one_step ?ее вообще не надо объявлять
vdekameronOne_step это же процедура, как я ее функцией сделаю типа Booleanты сказал, что тебе все понятно, каждая строчка 17188988

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

Shocker.Proты сказал, что тебе все понятно, каждая строчка
Sub Command1_Click() - процедура события click по кнопке Command1
Dim a As Integer - объявление переменной a как целочисленной обычной степени точности
a = 2 - присваиваем переменной a значение =2
a = MySum(a, 4) - Вызываем процедуру MySum передавая в нее параметры 2 для a и 4 для b , возвращая 18
MsgBox CStr(a) - выводим сообщением 18 (уже как строка)
Мне понятна каждая строчка но я теряюсь, не знаю что нужно сейчас сделать!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867801
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возьми листок чистой бумаги и нарисуй алгоритм движения с помощью квадратиков/ромбиков/стрелочек. когда всё нарисуешь , выложи картинку того, что наваял сюда, мы обсудим
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867809
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и вот этим воспользоваться
http://download.cnet.com/Code-Visual-to-Flowchart/3000-2212_4-10072756.html
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867825
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneвозьми листок чистой бумаги и нарисуй алгоритм движения с помощью квадратиков/ромбиков/стрелочек. когда всё нарисуешь , выложи картинку того, что наваял сюда, мы обсудим
Чет я не понял. Полностью этот код вырисовать графически на бумаге? или что-то произвольное?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867837
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronShocker.Proты сказал, что тебе все понятно, каждая строчка
Sub Command1_Click() - процедура события click по кнопке Command1
Dim a As Integer - объявление переменной a как целочисленной обычной степени точности
a = 2 - присваиваем переменной a значение =2
a = MySum(a, 4) - Вызываем процедуру MySum передавая в нее параметры 2 для a и 4 для b , возвращая 18
MsgBox CStr(a) - выводим сообщением 18 (уже как строка)
Мне понятна каждая строчкаа вот эта строчка? ты про нее ничего не сказал
Код: vbnet
1.
Function MySum(a As Integer, b As Integer)



мой косяк, правильно было бы так
Код: vbnet
1.
Function MySum(a As Integer, b As Integer) As Integer



но тем не менее.

vdekameronвозвращая 18А что мешает возвращать True или False????
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867842
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой вгляд, когда ты сделаешь как я сказал, то тебе и нам будет уже понятнее, что нужно сделать с алгоритмом появления нового шара, только сначала сделай это - не хочу на тебя вывалисать сразу кучу, давай последовательно
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867867
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Код: vbnet
1.
Function MySum(a As Integer, b As Integer) As Integer

Функция с параметрами а и b . MySum в данном случае задается как целочисленное.
Вы имеете в виду сделать так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Function One_step(ByRef mama As ShaperType) As Boolean
With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
    If .Left >= Form1.Width - .Width Then One_step = True: mama.StepX = -200 * Rnd Else One_step = False
    If .Left <= 0 Then One_step = 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 Function
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867876
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а что у вас функция false всегда возвращает.
мне кажется надо вам вернуться к алгоритму программы, а не к реализации. вы пока плохо представляете, что и как должно работать и при каких условиях
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867877
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это плохой стиль, не пишите так:
Код: vbnet
1.
If .Left >= Form1.Width - .Width Then One_step = True: mama.StepX = -200 * Rnd Else One_step = False



пишите так всегда:

Код: vbnet
1.
2.
3.
4.
5.
6.
If .Left >= Form1.Width - .Width Then 
     One_step = True
     mama.StepX = -200 * Rnd 
Else 
     One_step = False
End If
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867879
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо Form1.Width надо юзать Form1.ScaleWidth
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867885
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneмне кажется надо вам вернуться к алгоритму программы, а не к реализации. вы пока плохо представляете, что и как должно работать и при каких условиях
Да нет, алгоритм я хорошо представляю. Дело в недостатке знаний.

Konst_Oneну а что у вас функция false всегда возвращае
Почему.Возвращает true при ударе о край формы.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867889
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите
Код: vbnet
1.
MsgBox Form1.Width - Form1.ScaleWidth



то что у вас внутри формы работает в рамках ScaleWidth/ScaleHeight
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867893
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronKonst_Oneмне кажется надо вам вернуться к алгоритму программы, а не к реализации. вы пока плохо представляете, что и как должно работать и при каких условиях
Да нет, алгоритм я хорошо представляю. Дело в недостатке знаний.

Konst_Oneну а что у вас функция false всегда возвращае
Почему.Возвращает true при ударе о край формы.

да True возвращает. но условия я бы переписал, как-то всё не логично
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867896
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneто что у вас внутри формы работает в рамках ScaleWidth/ScaleHeight
Ну за этот совет спасибо! Но не в этом же дело.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867904
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneда True возвращает. но условия я бы переписал, как-то всё не логично
Код: 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.
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
  If One_step = True Then eddshape
End Sub

Private Function One_step(ByRef mama As ShaperType) As Boolean
With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
    If .Left >= Form1.ScaleWidth - .Width Then
       One_step = True
       mama.StepX = -200 * Rnd
    Else
       One_step = False
    End If
    If .Left <= 0 Then
       One_step = True
       mama.StepX = 200 * Rnd
    End If
    If .Top >= Form1.ScaleHeight - .Width Then mama.StepY = -300 * Rnd
    If .Top <= 0 Then mama.StepY = 300 * Rnd
End With
End Function

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


Как только переходит в процедуру таймера пишет argument not optional и подсвечивает One_step
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867915
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Timer1_Timer()
 Dim i As Integer
  For i = 1 To UBound(colShapes)
    If One_step colShapes(i) Then 
         eddshape
    End If
  Next i
  
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867916
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Timer1_Timer()
 Dim i As Integer
  For i = 1 To UBound(colShapes)
    If One_step(colShapes(i)) Then 
         eddshape
    End If
  Next i
  
End Sub



скобки забыл
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867922
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronКак только переходит в процедуру таймера пишет argument not optional и подсвечивает One_stepПотому что ты пытаешься вызвать функцию второй раз, но уже без аргумента. Ты так и не разобрался, что такое функция (((

vdekameronПочему.Возвращает true при ударе о край формы.только о левый или правый край, но не о верхний или нижний.

Ок, теперь тебе надо решить, в какой момент появляется новый шар?

Если при ударе ЛЮБОГО шара о край формы, то смотри код Кости.

Только при таком раскладе скорость появления шаров будет расти в геометрической прогрессии, так как шаров становится все больше и больше.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867928
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает но на этот раз при каждом касании любого шара появляется сразу 3 новых)))
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867933
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЕсли при ударе ЛЮБОГО шара о край формы, то смотри код Кости.
Так код Кости и взял. Выпуливает сразу по 3 новых шара
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867936
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну этот код не мой, я только подправил вызовы.
я же писал, что условия надо исправить, там что-то накручено в функции.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867944
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneя же писал, что условия надо исправить, там что-то накручено в функции.
Сейчас гляну
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867951
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего там не выпуливает по три шара.

17196622
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867984
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
Хахахах хотите прикол. Выпуливало по 3 шара сразу. убрал ети form1.scaleWidt и поставил как было. Теперь стало по 2 шара)))
А как только пытаюсь менять размеры шара, так все норм. По одному выпуливает Как только комментирую эту строку, снова по 2)))
И еще мне интересно почему я не могу сделать размер шаров от 500 до 1000? Они тупо появляются одного размера. А как только ставлю например от 200 до 500, то появляются разных размеров...
Код: vbnet
1.
check.Sh.Width = 500 + 500 * Rnd


Мамой клянусь Хотите через team viewer посмотрите
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867988
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто полный код дай

у меня тоже выпуливает по три шара и больше, но не сразу, а когда как минимум три шара уже летают, они как-то более менее одновременно касаются краев
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronИ еще мне интересно почему я не могу сделать размер шаров от 500 до 1000? Они тупо появляются одного размера. А как только ставлю например от 200 до 500, то появляются разных размеров...Кто-нибудь может это перевести на русский? Я не понял, то могу, то не могу.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867992
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой ScaleMode установлен для Form1?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38867995
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868001
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, понял, почему по несколько
Ты развернул шар, но условие нахождения у края какое-то время продолжает срабатывать (еще два тика таймера), поэтому их и появляется две-три штуки

Нужно грамотно проработать вопрос разворота шара
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868005
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно написать функцию расчёта траектории и её юзать с параметрами текущего положения шара на плоскости формы
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868009
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proпросто полный код дай
Жалко что ли ) Вы же его сами и написали) я только тыкался мыкался)
Код: 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.
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)
  addshape
  Timer1.Enabled = True
End Sub

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

Private Function One_step(ByRef mama As ShaperType) As Boolean
With mama.Sh
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
    If .Left >= Form1.Width - .Width Then
       One_step = True
       mama.StepX = -200 * Rnd
    Else
       One_step = False
    End If
    If .Left <= 0 Then
       mama.StepX = 200 * Rnd
    End If
    If .Top >= Form1.Height - .Width Then mama.StepY = -300 * Rnd
    If .Top <= 0 Then mama.StepY = 300 * Rnd
End With
End Function

Private Sub addshape()
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.Sh.FillStyle = vbSolid
  'check.Sh.FillColor = 16777216 * Rnd
  'check.Sh.Width = 500 + 500 * Rnd
  check.StepX = 200 * Rnd
  check.StepY = 300 * Rnd
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check
End Sub



Shocker.ProКто-нибудь может это перевести на русский? Я не понял, то могу, то не могу.
На русском вроде и писал) Перевести на более понятный для программиста язык сейчас постараюсь.
Когда пишу -
Код: vbnet
1.
check.Sh.Width = 500 + 500 * Rnd

то шары появляются все одинаковые, хотя по смыслу должны появляться шириной от 500 до 1000 твипов
Когда пишу
Код: vbnet
1.
check.Sh.Width = 200 + 500 * Rnd

тогда шары появляются разных размеров - как положено.

Konst_Oneкакой ScaleMode установлен для Form1?
1 Twip
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868013
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри, что в целом вообще может получаться.
Шар очередным шагом на 200 твипов шагнул к краю формы, при этом пересек его на 180 твипов допустим. Ты меняешь шаг на случайный, он начинает идти в другую сторону, но новый шаг оказывается только 50 твипов. И шар не выходит за пределы края формы за один шаг. Опять срабатывает условие, опять новый шар создается, опять меняется направление. То есть в итоге, шар на какое-то время может вообще «застрять» на краю формы, дергаясь там, пока не получит достаточно большой шаг в нужном направлении, чтобы выскочить из созданного таким образом «поля притяжения», попутно создавая новые шары.

Так что считай математику движения на бумажке
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868021
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronто шары появляются все одинаковые, хотя по смыслу должны появляться шириной от 500 до 1000 твиповпотому что ты высоту не трогаешь

поэкспериментируй в дизайне - поймешь
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868022
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТак что считай математику движения на бумажке
Ясно - понятно))
Ну и так вроде нормально, с моим нерусским объяснением что-то подскажите?
Shocker.ProКто-нибудь может это перевести на русский? Я не понял, то могу, то не могу.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868023
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя летает не квадрат, а прямоугольник, в этом несколько проблем:
- у круга есть "поля"
- не можешь сделать круг больше его высоты, то есть только растут поля
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868024
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proпотому что ты высоту не трогаешь

поэкспериментируй в дизайне - поймешь

Сорри как-раз писал ответ. Ща гляну
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868026
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProУ тебя летает не квадрат, а прямоугольник, в этом несколько проблем:
- у круга есть "поля"
- не можешь сделать круг больше его высоты, то есть только растут поля
А вот так дотюкал! Даже без design
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868032
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда вопрос в другом. Как VB6 сам решил какой у появившегося шара будет ширина и высота?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868037
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведь мы вначале определили ему только св-ва Visible и Shape
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868046
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronТогда вопрос в другом. Как VB6 сам решил какой у появившегося шара будет ширина и высота?а какая тебе нафиг разница?
задавай явно

ЗЫ: есть какое-то умолчание.
Если ты дважды щелкнешь в дизайнере по кнопке "шейп" (или любой другой контрол), он появится именно с размерами по умолчанию
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868050
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proа какая тебе нафиг разница?
Молчу, просто интересно
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868053
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется или движение на самом деле отрывистое какое-то. Дело в видео карте или в неслаженой работе таймера и цикла
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868054
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я ссылку давал на пример реализации отскока шаров
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868062
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronМне кажется или движение на самом деле отрывистое какое-то. Дело в видео карте или в неслаженой работе таймера и циклачаще таймер и меньше шаг
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868067
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProvdekameronМне кажется или движение на самом деле отрывистое какое-то. Дело в видео карте или в неслаженой работе таймера и циклачаще таймер и меньше шагкроме того, ты же изменяешь позицию не одновременно, то есть шарик прыгает сначала вбок, потом вниз
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868077
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proчаще таймер и меньше шаг
таймер в 40. В книге кот. я читаю написано, что меньше 40 уже нет смысла ставить. в 1сек. таймер не работает больше 18 раз
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868086
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, разве что, иметь два шара. Один невидимый, другой видимый. Невидимый двигаешь на новое место, потом делаешь видимым, а старый - невидимым. Таким образом он не будет прыгать вбок а как бы сразу окажется на новом месте
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868095
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНу, разве что, иметь два шара. Один невидимый, другой видимый. Невидимый двигаешь на новое место, потом делаешь видимым, а старый - невидимым. Таким образом он не будет прыгать вбок а как бы сразу окажется на новом месте
Уже предвкушаю сколько мне нужно будет вас мучить чтобы это реализовать
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868098
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам справишься.
Просто в контейнере у тебя будут жить два шарика.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868139
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПросто в контейнере у тебя будут жить два шарикаможно по-другому сделать. Завести один специальный буферный шар на все случаи (его можно и в дизайне создать). Изначально он невидимый. Перед тем как передвинуть очередной шар, буферному шару присваиваются все свойства старого, он делает видимым, а текущий шар делается невидимым, передвигается на новое место, показывается, а буферный шар прячется.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868169
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proможно по-другому сделать. Завести один специальный буферный шар на все случаи (его можно и в дизайне создать). Изначально он невидимый. Перед тем как передвинуть очередной шар, буферному шару присваиваются все свойства старого, он делает видимым, а текущий шар делается невидимым, передвигается на новое место, показывается, а буферный шар прячется.
а мерцания не станут еще больше?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868176
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronа мерцания не станут еще больше?нет, больше не станут
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868215
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proможно по-другому сделать. Завести один специальный буферный шар на все случаи (его можно и в дизайне создать). Изначально он невидимый. Перед тем как передвинуть очередной шар, буферному шару присваиваются все свойства старого, он делает видимым, а текущий шар делается невидимым, передвигается на новое место, показывается, а буферный шар прячется.
Чтобы я раньше времени не залез в дебри для начала выясню для себя алгоритм....
Это будет выглядеть примерно так?:-
1) Создаю в design обычный шейп. Никаких свойств в дизайне ему не устанавливая.
2) Делаю например процедуру "Подстава" в которой устанавливаю ему все свойства, которые есть у оригинала. Т.е.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  check.Sh.Shape = 3
  check.Sh.FillStyle = vbSolid
  check.Sh.FillColor = 16777216 * Rnd
  check.Sh.Height = 500 + 1000 * Rnd
  check.Sh.Width = 500 + 1000 * Rnd
   check.Sh.Height = 1000
   check.Sh.Width = 1000
  check.StepX = 150 * Rnd
  check.StepY = 200 * Rnd


Кроме св-ва visible которое нужно сделать true в посл. момент.
3) В One_Step я вызываю "Подстава" перед тем, как передвинулся оригинал и делаю подставной шар видимым а оригинал невидимым, двигаю его и делаю снова невидимым. Получается что будет тот же эффект, или я просто неправильно все понял.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде так, только код непонятен.
ты должен скопировать все свойства с оригинального шейпа, а не задать новые случайные значения
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868226
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proты должен скопировать все свойства с оригинального шейпа, а не задать новые случайные значения

Я это понимаю. Я имел в виду будет так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private sub Podstava()
  Shape1.FillStyle = check.Sh.FillStyle
  Shape1.FillColor = check.Sh.FillColor
  Shape1.Height = check.Sh.Height
  Shape1.Width =  check.Sh.Width 
  Shape1.Heigh  = check.Sh.Height
  Shape1 .Width =  check.Sh.Width 
' Вот сомневаюсь нужны ли эти две строки
  Shape1.left = check.StepX 
  Shape1.top = check.StepY 
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868231
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так возьми и подумай, что будет
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868243
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТак возьми и подумай, что будет
Получается что не нужны. Я вызову эту процедуру из One_step где и укажу
Код: vbnet
1.
2.
3.
4.
Shape1.left =.Left + mama.StepX
  Shape1.top = .Top + mama.StepY
Shape1.Visible=true
.Visible=False 


Потом будет
Код: vbnet
1.
2.
.Left = .Left + mama.StepX
    .Top = .Top + mama.StepY


И затем снова делаю подставной невидимым а оригинал видимым.
Мысль правильная или надо сделать сначала? Просто руководствуюсь тем, что вы говорили о четком представлении алгоритма
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868266
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут два равноценных варианта
хошь, ставь буферный круг на новое место, а потом двигай старый, хошь наоборот - без разницы
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868285
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ну этот вариант верен 17198493
Или я снова коряво объяснил
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868290
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вроде да, пробуй
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868331
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proну вроде да, пробуй
Ща буду пробовать. Но я вчера когда уже комп вырубил подумал о том что эффекта может и не быть. Т.к. мерцание у нас происходит почему, потому что сначала шар движется по X потом по Y как бы зигзагообразно. А если мы подключим подставной шейпт и придадим ему все свойства и все законы, отличае будет только в том что он будет появлятся на мгновение до или после основного. Так один хрен он же тоже будет зигзагообразно двигаться. Ну проверю опытно
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868342
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
важно то, что на экран не выводится промежуточное состояние шара, когда он отклонился от траектории.

проверь два варианта - сначала включать новый потом выключать старый или наоборот.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868380
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proважно то, что на экран не выводится промежуточное состояние шара, когда он отклонился от траектории.
Ага, вместо этого мы будем видеть промежуточное сост. другого шара- буферного. Т.к. будем уже видеть как он отклоняется от траектории
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868400
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
У меня опять неразбериха с этими процедурами. Не знаю что с ними делать. Так понимаю отдельно , а что касается дела. Сразу теряюсь и не понимаю как и что объявлять(((((((((((((((((((((((((((((((
Код: 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.
58.
59.
Private Sub Timer1_Timer()
 Dim i As Integer
  For i = 1 To UBound(colShapes)
    If One_step(colShapes(i)) Then
       addshape
    End If
  Next i
End Sub

Private Function One_step(ByRef mama As ShaperType) As Boolean
Randomize
With mama.Sh
                       .Visible = False
                       Podstava
                       
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
                       
                       Shape1.Visible = False
                      .Visible = True

If .Left >= Form1.Width - .Width Then
       One_step = True
       mama.StepX = -150 * Rnd
    Else
       One_step = False
    End If
    If .Left <= 0 Then
       mama.StepX = 150 * Rnd
    End If
    If .Top >= Form1.Height - .Width Then mama.StepY = -200 * Rnd
    If .Top <= 0 Then mama.StepY = 200 * Rnd
End With
End Function
Private Sub Podstava()

  Shape1.FillStyle = check.Sh.FillStyle
  Shape1.FillColor = check.Sh.FillColor
  Shape1.Height = check.Sh.Height
  Shape1.Width = check.Sh.Width
  Shape1.Left = .Left + mama.StepX
  Shape1.Top = .Top + mama.StepY
  Shape1.Visible = True
End Sub
Private Sub addshape()
Randomize
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.Sh.FillStyle = vbSolid
  check.Sh.FillColor = 16777216 * Rnd
  check.Sh.Height = 500 + 1000 * Rnd
  check.Sh.Width = 500 + 1000 * Rnd
  check.StepX = 150 * Rnd
  check.StepY = 200 * Rnd
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868562
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronбуферного. Т.к. будем уже видеть как он отклоняется от траекторииэто еще почему?
ты же двигаешь буферный шар, пока он невидимый, поэтому не увидишь его промежуточных состояний
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868565
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое mama и check в процедуре Podstava()????

Ты как запускаешь проект? Запускай не "Start", а "Start with full compile" - он тебе сразу все ошибки необъявленных переменных покажет
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868574
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЧто такое mama и check в процедуре Podstava()????
И то и то контейнеры в которых есть круг и его степы по X и Y
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868590
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronShocker.ProЧто такое mama и check в процедуре Podstava()????
И то и то контейнеры в которых есть круг и его степы по X и Yнет. Это неизвестные процедуре объекты.

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

Ясно. Хоть посоветуйте какую то хорошую книгу. Много искал, бесплатного в нете мало а если и есть то качество говно, можно глаза сломать!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868614
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я уже говорил, что посоветовать не могу, не готов перечитывать кучу книг, чтобы что-то посоветовать.

ну хотя бы погугли эти три темы, это же не бином Ньютона, это начальные знания, они будут в ЛЮБОМ учебнике, ну прочитай три разных.

Приходи, когда сможешь на вопрос 17201433 дать ответ, совпадающий с моим
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868617
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПриходи, когда сможешь на вопрос 17201433 дать ответ, совпадающий с моим
Ладно, спасибо!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868627
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сижу у себя в квартире. Ты сидишь у себя в квартире. Это разные квартиры. Но ты почему-то упорно продолжаешь считать, что я могу смотреть твой телевизор.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38868665
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я все прекрасно понимаю, но не знаю как объявить в процедуре.
Не буду вас раздражать и лучше реально почитаю для начала а потом просто вернусь к этому.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869085
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все-таки хочу посмотреть будет ли эффект
Не могу понять почему вылазит ошибка, я же объявил в процедуре переменную так, как нужно вроде.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub Podstava()
Dim check As ShaperType
  Shape1.FillStyle = check.Sh.FillStyle
  Shape1.FillColor = check.Sh.FillColor
  Shape1.Height = check.Sh.Height
  Shape1.Width = check.Sh.Width
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869121
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объявил. А что в ней лежит? От чего ты хочешь получить FillStyle?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869148
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProОбъявил. А что в ней лежит? От чего ты хочешь получить FillStyle?
В ней лежит созданный нами круг, от которого и хочу получить эти св-ва
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869179
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronВ ней лежит созданный нами круг, от которого и хочу получить эти св-вакак он туда попал? Ты только что объявил эту переменную. Она девственно чиста.

Ты продолжаешь считать, что я могу смотреть твой телевизор.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869200
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProОна девственно чиста.
Значит нужно передавать процедуре параметр.
Ну подскажите уже, обещаю прочитать то, что советовали)
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869206
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитать (и понять) уже сделанный к данному моменту код.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869213
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПочитать (и понять) уже сделанный к данному моменту код.

Вы очень строгий учитель
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869228
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronShocker.ProПочитать (и понять) уже сделанный к данному моменту код.

Вы очень строгий учительИ терпеливый. Я бы просто дал эту методичку http://www.studfiles.ru/dir/cat32/subj1259/file11577.html и закрыл тему.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869241
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyИ терпеливый.
Никто не спорит, я уже давно это отметил)
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869567
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочитать (и понять) уже сделанный к данному моменту код.вот твой код
Код: vbnet
1.
2.
Private Function One_step(ByRef mama As ShaperType) As Boolean
...


Что будет, если убрать параметр и объявить его как переменную? И почему?
Код: vbnet
1.
2.
3.
Private Function One_step() As Boolean
Dim mama As ShaperType
...
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869593
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЧто будет, если убрать параметр и объявить его как переменную? И почему?

Я считаю что раз мы не передаем параметр, и объявляем как переменную, то будем работать с пустым контейнером. Постоянно с одним и тем же кругом.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869606
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronПостоянно с одним и тем же кругом.блин, ну почему? Откуда там возьмется круг?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869609
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proблин, ну почему? Откуда там возьмется круг?
Хотя да((( Просто тупо пустой контейнер
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869614
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, посмотри примерчик. там что-то полезное для себя почерпнёшь.

зы
делал очень давно
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869615
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronShocker.Proблин, ну почему? Откуда там возьмется круг?
Хотя да((( Просто тупо пустой контейнерХорошо, почему совершенно аналогичная ситуация с процедурой Podstava вызывает у тебя проблему?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869649
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProХорошо, почему совершенно аналогичная ситуация с процедурой Podstava вызывает у тебя проблему?

Не знаю, ловлю ступор и хоть ты тресни!! Вот сейчас показал что ей передается.
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub Podstava(ByRef check As ShaperType)
  Shape1.FillStyle = check.Sh.FillStyle
  Shape1.FillColor = check.Sh.FillColor
  Shape1.Height = check.Sh.Height
  Shape1.Width = check.Sh.Width
End Sub


а как при вызове процедуры правильно указать снова ступор!
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38869712
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подумай то том, откуда ты хочешь это передать, что именно хочешь передать и где это хранится на момент возникновения желания передать
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870043
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proподумай то том, откуда ты хочешь это передать, что именно хочешь передать и где это хранится на момент возникновения желания передать

Ну в голове у меня так, не знаю правильно или нет:- передавать хочу тогда, когда вызывается Podstava.
Хочу передать имеющийся на данный момент заполненный контейнер и работать с кругом в нем. Этот контейнер есть в двух местах. 1) в addshapes 2) One_step Но как передать - СТУПОР! Не знаю что со мной.
Скажу вам честно, я схитрил, понимаю что это неправильно, что это разово и потом я все-равно упрусь в то, чего никак не могу понять. И поэтому если у вас еще есть желание дотолдычить это))
Короче вот. Эффекта ноль. Мерцание идет, а когда шаров больше становится вообще ужасно
Пробовал по-разному.
Код: 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.
Private Function One_step(ByRef mama As ShaperType) As Boolean
Randomize
With mama.Sh
                           .Visible = False
                       Shape1.FillStyle = .FillStyle
                       Shape1.FillColor = .FillColor
                       Shape1.Shape = .Shape
                       Shape1.Height = .Height
                       Shape1.Width = .Width
                       Shape1.Left = .Left + mama.StepX
                       Shape1.Top = .Top + mama.StepY
                       Shape1.Visible = True
    
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
                       
                       Shape1.Visible = False
                      .Visible = True

If .Left >= Form1.Width - .Width Then
       One_step = True
       mama.StepX = -150 * Rnd
    Else
       One_step = False
    End If
    If .Left <= 0 Then
       mama.StepX = 150 * Rnd
    End If
    If .Top >= Form1.Height - .Width Then mama.StepY = -200 * Rnd
    If .Top <= 0 Then mama.StepY = 200 * Rnd
End With
End Function

Private Sub addshape()
Randomize
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.Sh.FillStyle = vbSolid
  check.Sh.FillColor = 16777216 * Rnd
  check.Sh.Height = 1000 + 1000 * Rnd
  check.Sh.Width = 1000 + 1000 * Rnd
  check.StepX = 100 * Rnd
  check.StepY = 100 * Rnd
  ReDim Preserve colShapes(UBound(colShapes) + 1)
  colShapes(UBound(colShapes)) = check
End Sub
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870190
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameron,

немного помогает поменять местами переключение видимости
Код: vbnet
1.
2.
                       Shape1.Visible = True
                           .Visible = False

Код: vbnet
1.
2.
                      .Visible = True
                       Shape1.Visible = False


от "дерготни" мы избавились, а от мерцания - нет, для закрашенных кругов перерисовку видно, это уже проблема реализации перерисовки самого элемента shape, там, видимо, двойная буферизация не используется. Так что для улучшения качества придется использовать другие средства - рисовать самому круги с помощью GDI или DirectX
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870197
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proот "дерготни" мы избавились,

Поменял местами, эффекта ноль. Может я придираюсь, но движение какое-то дерганое , колеблющее. Режет глаз.
Код: 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.
Private Function One_step(ByRef mama As ShaperType) As Boolean
Randomize
With mama.Sh
                        
                       Shape1.Visible = True
                       Shape1.FillStyle = .FillStyle
                       Shape1.FillColor = .FillColor
                       Shape1.Shape = .Shape
                       Shape1.Height = .Height
                       Shape1.Width = .Width
                       Shape1.Left = .Left + mama.StepX
                       Shape1.Top = .Top + mama.StepY
                       .Visible = False
    
    .Left = .Left + mama.StepX
    .Top = .Top + mama.StepY
                       
                       .Visible = True
                       Shape1.Visible = False
                      
If .Left >= Form1.Width - .Width Then
       One_step = True
       mama.StepX = -150 * Rnd
    Else
       One_step = False
    End If
    If .Left <= 0 Then
       mama.StepX = 150 * Rnd
    End If
    If .Top >= Form1.Height - .Width Then mama.StepY = -200 * Rnd
    If .Top <= 0 Then mama.StepY = 200 * Rnd
End With
End Function
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870206
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proа от мерцания - нет, для закрашенных кругов перерисовку видно
Мерцания появляются даже без закраски кругов.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870273
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, хоть и не так заметно.

В общем, внутри шейп устроен так, что при самообновлении он сначала стирает себя полностью, потом рисует заново - от этого мерцание. Это внутреннее устройство шейпа, да и вообще, видимо, любого стандартного контрола VB - они же не предназначены для анимации.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870278
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если рисовать в контексте устройства, то лучше юзать API. там есть специализиврованные ф-ии обновления окна типа invalidaterect и тп
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870299
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
векторное рисование через API
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38870390
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneвекторное рисование через API
спасибо конечно, но далеко мне еще до этого
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38871139
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdekameronпередавать хочу тогда, когда вызывается Podstava.vdekameronЭтот контейнер есть в двух местах. 1) в addshapes 2) One_stepНикак не пойму, что же за ступор у тебя в голове, который мешает тебе осознать некоторые, вроде бы простые вещи. Еще одно предположение - может у тебя там напрочь отсутствует вектор времени? То есть тебе кажется, что программа выполняется вся и одновременно? Ты не можешь себе представить, что она выполняется последовательно, команда за командой? Что область локальных переменных существует только тогда, когда выполняются команды, находящиеся в этой области и не существует в другое время?

Ты вызываешь Podstava в момент выполнения кода процедуры One_step. Причем тут addshapes? Разве addshapes выполняется параллельно с One_step? Разве переменные addshapes существуют в момент выполнения Podstava?
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38871986
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProТы вызываешь Podstava в момент выполнения кода процедуры One_step. Причем тут addshapes? Разве addshapes выполняется параллельно с One_step? Разве переменные addshapes существуют в момент выполнения Podstava?
Это все мы возвращаемся к тому, что вы мне говорили еще в самом начале моего появления на этом форуме.
Все дело в том, что я отдельно понимаю эти простые вещи а когда много всего нового для меня, такого как массивы, контейнеры которые мы использовали в этой программке, то у меня возникает ступор. А именно из-за того, что вот про это новое я конечно прочитал. Но глубоко и досконально не изучил.
Курю сейчас по-тихому массивы Буду дальше читать.
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38871995
vdekameron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например только сейчас дошел до пользовательских типов данных, которые мы кстати тоже использовали для создания своего "контейнера"
...
Рейтинг: 0 / 0
Создание объекта shape программно
    #38872133
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть взялся, наконец, за учебник, о чем я просил с самого начала. Похвально. Лучше поздно, чем никогда.

Ок, ждем результатов.
...
Рейтинг: 0 / 0
181 сообщений из 181, показаны все 8 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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