Подскажите решение (activ Controls In Runtime)

  • Автор темы Maxim84
  • Дата начала
M

Maxim84

#1
Здравствуйте!
Я пишу игровой движок с нуля, для РПГ. Сделал уже систему инвентаря на Drag and Drop как в Diablo. Сейчас подошла очередь делать систему вытаскивания шмоток из сундуков. Проблема в том, что в моём движке, каждая вещь выглядит как отдельный PictureBox, в котором забита начинка, как картинка, свойства и параметры которая прибавляет вещь. Теперь самое главно! Так как я не собираюсь под каждый сундук создавать отдельный PictureBox, я бы хотел просто копировать их с шаблона. Тоесть функционал такой, открыл сундук, на рандоме выпадает шмотка, которая появляется как PictureBox, этот PictureBox вызывается с формы где лежат все шмотки из игры. Примерно так. У меня получаеться вызывать PictureBox оператором Load, но это только на один раз. А надо что бы они копировались в сундук а не перемещались. Так как же решить поставленную задачу? Если кто писал что то подобное поделитись пожалйста идеями, ну и примерами если можно.

Заранее спасибо!

з.ы. Пишу на VB 6.0 Изучаю VB по мере написания движка. Так что если для кого -то вопрос кажится глупым, ИЗВИНИТЕ!

Private WithEvents NewButton As CommandButton 'Сообщаем системе что хотим использовать обработчик событий с кнопкой
Private Sub NewButton_Click() 'Код обработки события нажатия на кнопку
MsgBox "Вы нажали на новую кнопку"
End Sub
Private Sub Form_Click()
Set NewButton = Controls.Add("VB.CommandButton", "NewButton") 'при клике по форме появляется новая кнопка
NewButton.Visible = True
NewButton.Height = 1000
NewButton.Width = 1000
NewButton.Top = 0
NewButton.Left = 0
NewButton.Caption = "Нажми на меня!!!!"
End Sub
Что нить из этой опиры, только с PicBox и загрузкой и с копированием его на другую форму.
 
S

Serrr

#2
Controls.Add("VB.CommandButton", "NewButton") 'при клике по форме появляется новая кнопка
Попробуйте так:

Во-первых свою кнопку объявить как NEW COMMANDBUTTON

Во-вторых перед "Controls.Add("VB.CommandButton", "NewButton") " поставить имя той формы, куда надо ставить этот PictureBox,
например Form1.Controls.Add("VB.CommandButton", "NewButton")
 
S

Serrr

#4
Извините, не могли бы по подробний об этом. Не очень понимаю. Для меня работа с контроллами новая наука.
Большое спасибо!
Private WithEvents NewButton As CommandButton заменить на Private WithEvents NewButton As New CommandButton - в этом случае вы сообщите системе, что хотите создать новый экземпляр класса (копию) контрола.

далее, в обработчике события какой-нибудь переменной (Ddd например) присваеваем значение этой вашей NewButton:

Dim Ddd = NewButton

потом можно ей параметры разные задать:

Ddd.Height=33 например и т.д.

А потом уже добавляем на форму, где этот контрол должен появиться

Form1.Controls.Add(Ddd)

Должно получиться
 
M

Maxim84

#5
Private WithEvents NewButton As CommandButton заменить на Private WithEvents NewButton As New CommandButton - в этом случае вы сообщите системе, что хотите создать новый экземпляр класса (копию) контрола.

далее, в обработчике события какой-нибудь переменной (Ddd например) присваеваем значение этой вашей NewButton:

Dim Ddd = NewButton

потом можно ей параметры разные задать:

Ddd.Height=33 например и т.д.

А потом уже добавляем на форму, где этот контрол должен появиться

Form1.Controls.Add(Ddd)

Должно получиться
Я понял Вашу идею, но тогда нужно создавать новый класс, потому что в этом случае, New не распoзнаёт CommandButton, и выдаёт синтаксическую ошибку Compil Error (Invalid use of New key word ). А я как раз только что классы начал изучать. Так что чуствую придёться по париться. ))))

Тогда наверное лучше, поставить вопрос ребром, и спросить, - "Как создать новый класс для кнопки?" . Спасибо Вам за внимание и ответы.
 
S

Serrr

#6
Я понял Вашу идею, но тогда нужно создавать новый класс, потому что в этом случае, New не распoзнаёт CommandButton, и выдаёт синтаксическую ошибку Compil Error (Invalid use of New key word ). А я как раз только что классы начал изучать. Так что чуствую придёться по париться. ))))

Тогда наверное лучше, поставить вопрос ребром, и спросить, - "Как создать новый класс для кнопки?" . Спасибо Вам за внимание и ответы.
Не понял... вам нужна копия шмотки, которая представляет собой PictureBox?
Если где-то на другой форме уже есть готовый ПиктуреБокс с картинкой шмотки, то
Public Ddd as New ПиктуреБокс
Ddd=ИмяФормыГдеЛежитПитуреБокс.ИмяПиктуреБокса

а кнопку тогда трогать не надо
 
M

Maxim84

#7
Не понял... вам нужна копия шмотки, которая представляет собой PictureBox?
Если где-то на другой форме уже есть готовый ПиктуреБокс с картинкой шмотки, то
Public Ddd as New ПиктуреБокс
Ddd=ИмяФормыГдеЛежитПитуреБокс.ИмяПиктуреБокса

а кнопку тогда трогать не надо
Я пока что на кнопке учусь. ))) Потому про кнопку и говорю. Сечас попробую, как вы говорите. Может получится.
 
M

Maxim84

#8
Добавляем все контролы на формы. В форму1 вводим код!

Private Sub Command1_Click()
Dim Ddd As New PictureBox

Ddd = Forma2.Picture1
Form1.Controls.Add (Ddd)

End Sub

На форме2 создана картинка Picture1. Выводит ошибку "Invalid USE of key words" ... Я писал об этом выше, в примере с кнопкой... Ощущение что я что то забыл добавить...
 
M

Maxim84

#10
Picture1 - это имя PictureBox_a или картинки?
Спасибо что вы не бросили тему просто так, а решили разобраться с моей пробеломй до конца. Picture1 это стандартное имя PictureBox по умолчянию.
Тут всё чётко. Пробовал разобраться с классами, но гемор ещё тот. Чувствуеться мне что класс надо новый создавать, что бы вот так вот делать как вы говорите...
 
S

Serrr

#11
Спасибо что вы не бросили тему просто так, а решили разобраться с моей пробеломй до конца. Picture1 это стандартное имя PictureBox по умолчянию.
Тут всё чётко. Пробовал разобраться с классами, но гемор ещё тот. Чувствуеться мне что класс надо новый создавать, что бы вот так вот делать как вы говорите...
По-моему не надо создавать новый класс. Ведь ПиктуреБокс это и есть класс. Дело в том, как его экземпляр создать, то есть разобраться что чему присваивать.. Я-то писал применительно к VB.NET А это чуть по-другому.
Попробуйте

Set Ddd = Forma2.Picture1
 
M

Maxim84

#12
По-моему не надо создавать новый класс. Ведь ПиктуреБокс это и есть класс. Дело в том, как его экземпляр создать, то есть разобраться что чему присваивать.. Я-то писал применительно к VB.NET А это чуть по-другому.
Попробуйте

Set Ddd = Forma2.Picture1
Serrr. Спасибо за помощь. Я решил проблему за счёт Index As Integer. В моём случае идеальный вариант оказался. Тему можно закрыть.
1. Создаёшь пикбокс шмотки на отдельной странице как и говорилось, ставишь индекс ноль, в распихиваешь шмот по сундукам, и вызываешь коммандой Load. Очень удобно.