Проблема с классом

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Проблема с классом

Сообщение beat_swamp » 21.06.2006 (Ср) 16:04

добрый день всем1 пытался на сайте найти какие нить примеры работы с классами1 безрезультатно1 +/
вот мой код класса cArrow (рисует стрелку):
Код: Выделить всё
Option Explicit

Public linMain As Line    ' главная линия стрелки     
Public linFirst As Line     ' перо стрелки
Public linSecond As Line ' перо стрелки
Public intLineLenght As Integer 'длина стрелки
Public sngAngle As Single       'угол между стрелкой и пером

'зануление координат линий при создании объекта
Private Sub Class_Initialize()
    linMain.x1 = 0
    linMain.y1 = 0
    linMain.x2 = 0
    linMain.y2 = 0
   
    linFirst.x1 = 0
    linFirst.y1 = 0
    linFirst.x2 = 0
    linFirst.y2 = 0
   
    linSecond.x1 = 0
    linSecond.y1 = 0
    linSecond.x2 = 0
    linSecond.y2 = 0
   
    intLineLength = 0
    sngAngle = 0 * PI
End Sub

'устанавливаем
Public Sub SetArrowParams(intX1 As Integer, intY1 As Integer, intX2 As Integer, intY2 As Integer, angle As Single, length As Integer)
    sngAngle = angle / 180 * PI         'перводим угол из градусов
    intLineLength = length
    linMain.x1 = intX1
    linMain.y1 = intY1
    linMain.x2 = intX2
    linMain.y2 = intY2
   
    linFirst.x2 = intX1
    linFirst.y2 = intY1
    GetSubLinesCoords 1, linFirst.x2, linFirst.y2
    linSecond.x2 = intX1
    linSecond.y2 = intY1
    GetSubLinesCoords 2, linSecond.x2, linSecond.y2
    SetArrowParams = 0
End Sub

'получаем координаты конца пера стрелки взависимости от ее номера bytLineNum
Public Sub GetSubLinesCoords(bytLineNum As Byte, ByRef intX2 As Integer, ByRef intY2 As Integer) As Integer
   Dim i As Integer
    Dim sngAlfa As Single 
    Dim sngBetta As Single 
   
    sngAlfa = Atn(CSng((linMain.y2 - linMain.y1) / (linMain.x2 - linMain.x1)))
    sngBetta = sngAlfa + IIf(bytLineNum = 1, sngAngle, -sngAngle)
    intX2 = CInt(linMain.x2 - Cos(sngBetta) * CSng(intLineLength))
    intY2 = CInt(linMain.y2 - Sin(sngBetta) * CSng(intLineLength))
    GetSubLinesCoords = 0
End Sub

Далее я на форме сделал кнопку1 вот код:
Код: Выделить всё
Dim myArr As cArrow

Private Sub Command1_Click()
    myArr.SetArrowParams 10, 10, 200, 200, 30.0, 30
End Sub

запускаю проект1 му кнопку1 ругается1 "run-time error 91. Object variable or With block variable not set."

подскажите пожалуйста в чем дело? правильно ли я создаю объект (обычным Dim'ом) или надо как то по другому?
Последний раз редактировалось beat_swamp 21.06.2006 (Ср) 16:17, всего редактировалось 1 раз.

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 21.06.2006 (Ср) 16:12

sngAlfa = Atn(scng((linMain.y2 - linMain.y1) / (linMain.x2 - linMain.x1)))


Код: Выделить всё
dim var1  as NEW YourClass
[/syntax]
Пора уже всем хорошим людям собраться и убить всех плохих людей.

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 21.06.2006 (Ср) 16:16

исправил1
sngAlfa = Atn(scng((linMain.y2 - linMain.y1) / (linMain.x2 - linMain.x1)))
до этого дело даже не доходит1
ошибка возникает когда я пытаюсь обратиться к свойствам linMain, linFirst или linSecond вот1

может надо вот так объявлять член класса:
Код: Выделить всё
public linMain as VB.Line

но я пробовал1 все равно ошибка вылетает1

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.06.2006 (Ср) 16:23

Код: Выделить всё
Private Sub Command1_Click()
Dim myArr As Object
Set myArr = New cArrow
myArr.SetArrowParams 10, 10, 200, 200, 30.0, 30
End Sub

или
Код: Выделить всё
Private Sub Command1_Click()
Dim myArr As New cArrow
myArr.SetArrowParams 10, 10, 200, 200, 30.0, 30
End Sub

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 21.06.2006 (Ср) 16:29

Amed, все равно та же ошибка1 в дебагере видно что она возникает при обращении к свойствам линий1

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 21.06.2006 (Ср) 18:37

beat_swamp
Вообще-то контролы в рантайме создаются посредством:
Код: Выделить всё

Контейнер(например форма).Controls.Add(Имя_класса(например VB.Line), Имя_контрола)
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.06.2006 (Ср) 19:10

Если хочешь добавлять из класса линии на форму, пиши вот так примерно:
Код: Выделить всё
Option Explicit

Public Sub Start(frm As Form, Number As Integer)
Dim strN As String

strN = "x" & Number

frm.Controls.Add "VB.Line", strN

Dim ct As Control
For Each ct In frm.Controls
    If ct.Name = strN Then
        ct.Visible = True
        ct.X1 = Number * 100
        ct.Y1 = 0
   
        ct.X2 = 1000 + Number * 100
        ct.Y2 = 1000
       
        Exit For
    End If
Next ct
End Sub

И вызывай в форме
Код: Выделить всё
Option Explicit

Private x() As New cArrow

Private Sub Command1_Click()
ReDim Preserve x(UBound(x) + 1)
x(UBound(x) - 1).Start Me, UBound(x)
End Sub

Private Sub Form_Load()
ReDim x(0)
End Sub

Но это кривой путь. Лучше рисуй из класса линии на форме методами Line. Стопроцентно выгоднее.

UPD:
Фу, отвратительный вариант получился :)
Самому противно аж стало.

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 22.06.2006 (Чт) 12:27

Лучше рисуй из класса линии на форме методами Line. Стопроцентно выгоднее.
но мне надо будет их (линии) потом удалять1

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 22.06.2006 (Чт) 14:07

но мне надо будет их (линии) потом удалять!


Точнее прекратить рисовать ;о)...
Пора уже всем хорошим людям собраться и убить всех плохих людей.

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 23.06.2006 (Пт) 11:39

GB826 писал(а):
но мне надо будет их (линии) потом удалять!


Точнее прекратить рисовать ;о)...
неее1 сначала нарисовать линии в одном месте1 потом их переместить в другое1 или удалить а потом заново отрисовать1 вот1

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 23.06.2006 (Пт) 11:58

Ты не понял. Сделай процедуру DrawAllMyLines, в ней сначала очищай поле, на котором у тебя все рисуется, а затем перерисовывай все заново.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 6

    TopList