powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
25 сообщений из 181, страница 1 из 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
25 сообщений из 181, страница 1 из 8
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание объекта shape программно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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