Переменная Form

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

Переменная Form

Сообщение sergey-911 » 06.04.2007 (Пт) 0:04

Доброго времени суток уважаемые.
Есть форма frmForm, содержащая переменную
Код: Выделить всё
Public Form As Form
В зависимости от того, определена ли переменная, или нет, меняется интерфейс данной формы. Если переменная определена, то можно сделать проверку
Код: Выделить всё
If Form.Name <> Empty Then <Формируем нужный интерфейс формы>
НО , если переменная не определена (Set Form = Nothing), то при выполнении условия выдаётся ошибка “Run-time error ’91’: Object variable or With block variable not set”. Как правильно осуществить данную проверку? Прикрепляю пример к сообщению.
Вложения
Form.rar
Переменная Form
(1.28 Кб) Скачиваний: 25
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.04.2007 (Пт) 0:20

If Form.Name <> Empty

Ты в курсе, что =Empty не будет никогда? :roll:

Как правильно

Оператором IS.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.04.2007 (Пт) 0:56

Спасибо, конечно GSerg.
Но я дико извиняюсь, не догоню, как применить этот оператор... :(
Код: Выделить всё

Option Explicit
Public Form As Form

Private Sub Command1_Click()
    Set Form = Me
    IsForm
End Sub

Private Sub Command2_Click()
    Set Form = Nothing
    IsForm
End Sub

Private Sub IsForm()
    Dim b As Boolean
    b = Form Is Form
    If b = True Then
        Label1.Caption = "Переменная определена, значение = " & Form.Name
    Else
        'Здесь появляется ошибка
        Label1.Caption = "Переменная не определена"
    End If
End Sub

Такой вариант тоже не работает, т.к.
Код: Выделить всё
b = Form Is Form
всегда выводит
Код: Выделить всё
True
, соответственно...
MSDN читал, никак не расбирусь.
Дело в том, что я не знаю заранее, чему равна переменная Form? Поэтому мне необходимо знать, равтяется ли оно значению Nothing, или нет.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.04.2007 (Пт) 1:05

Извиняюсь, в данном примере ошибка теперь здесь
Код: Выделить всё
Label1.Caption = "Переменная определена, значение = " & Form.Name
(Form.Name)
При вызове процедуры
Код: Выделить всё
Private Sub Command2_Click()
    Set Form = Nothing
    IsForm
End Sub
[/b]
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 06.04.2007 (Пт) 1:49

енто реально в твоей программе
Код: Выделить всё
Public Form As Form

:shock:
Код: Выделить всё
bFlag = (Form1 Is Nothing) - работает

Код: Выделить всё
bFlag = (Form1 Is "SomeForm") - нет работает

Код: Выделить всё
If TypeOf Form1 Is frmForm1 Then MsgBox "-1" - работает


А что хотел спросить :?:

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.04.2007 (Пт) 19:13

Спасибо Dmitriy2003 огромное.
Код: Выделить всё

Option Explicit
Public Form As Form

Private Sub Command1_Click()
    Set Form = Me
    IsForm
End Sub

Private Sub Command2_Click()
    Set Form = Nothing
    IsForm
End Sub

Private Sub IsForm()
    Dim b As Boolean
    b = (Form Is Nothing)
    If b = False Then
        Label1.Caption = "Переменная определена, значение = " & Form.Name
    Else
        'Здесь появляется ошибка
        Label1.Caption = "Переменная не определена"
    End If
End Sub

Всё прекрасно работает. :D
С уважением, Сергей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.04.2007 (Сб) 3:53

sergey-911 писал(а):
Код: Выделить всё
...
    Dim b As Boolean
    b = (Form Is Nothing)
    If b = False Then
...



Ужас. Ты хоть понимаешь всю групость этого куска, да и вообще всей этой идеи?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 07.04.2007 (Сб) 9:18

А в чём ужас Хакер?
Я так написал для большей читаемости кода.
Если я напишу, как в программе,
Код: Выделить всё

'Настройка тулбара, в зависимости от значения Form
If (Form Is Nothing = True) Then
    Call Bar.LoadBar(Bar.MDI.SSActiveToolBars1, Me)
Else
    Call Bar.LoadBar(Bar.MDI.SSActiveToolBars1, Me, True)
End If

думаю легче не станет.
С уважением, Сергей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.04.2007 (Сб) 9:34

Ужас продолжается...




А написать
Код: Выделить всё
If Form Is Nothing Then
    Call Bar.LoadBar(Bar.MDI.SSActiveToolBars1, Me)
Else
    Call Bar.LoadBar(Bar.MDI.SSActiveToolBars1, Me, True)
End If


Не судьба?

ADDED:
И немного подумав: А написать

Код: Выделить всё
Bar.LoadBar Bar.MDI.SSActiveToolBars1, Me, Not Form Is Nothing

вместо всех этих IF-ов не судьба?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 07.04.2007 (Сб) 19:46

Bar.LoadBar Bar.MDI.SSActiveToolBars1, Me, Not Form Is Nothing

Согласен! Спасибо! :)
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 07.04.2007 (Сб) 20:40

А поизвращатся:

Код: Выделить всё

Private Sub Command1_Click()
    '
    If IsForm(Form2) Then
        Form2.Show
        Form2.Caption = "Hallo1"
    Else
        Set Form2 = New Form2
        Form2.Show
        Form2.Caption = "Hallo"
    End If
    '
End Sub

Public Function IsForm(ByVal f As Form) As Boolean
    '
    IsForm = IIf(ObjPtr(f) > 0, True, False)
    '
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.04.2007 (Сб) 21:35

Фу.. бред...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 07.04.2007 (Сб) 23:18

Хакер писал(а):Фу.. бред...


Ясен пень, не дипломная работа.... :)

Хакер а как работает "From is Nothing" ? чет любопытство одолело, правда без подвоха :?: ну вдруг ты уже знаеш :?:

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

Сообщение Amed » 08.04.2007 (Вс) 0:54

Если указатель на форму нулевой, она Is Nothing...

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 08.04.2007 (Вс) 2:55

Получается, отбросив предрассудки, следующее...

Код: Выделить всё

Public Function VBIsNothing(object As Object) As Boolean
    '
    VBIsNothing = IIf(ObjPtr(object) = 0, True, False)
    '
End Function


тормозит то как аж в 3 разу! Настоящее извращение!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.04.2007 (Вс) 8:13

Dmitriy2003 писал(а):Получается, отбросив предрассудки, следующее...

Код: Выделить всё
Public Function VBIsNothing(object As Object) As Boolean
    '
    VBIsNothing = IIf(ObjPtr(object) = 0, True, False)
    '
End Function


тормозит то как аж в 3 разу! Настоящее извращение!


Да что у вас за извращение? Сравнивать True c True и возвращать True, или True c False и возвращаться False :twisted: ?


Чем тебя строка VBIsNothing = (ObjPtr(object) = 0
не устроила?
или VBIsNothing = Not CBool(ObjPtr(object)) ?

Извращенцы...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 08.04.2007 (Вс) 12:35

Хакер писал(а):Да что у вас за извращение? Сравнивать True c True и возвращать True, или True c False и возвращаться False :twisted: ?

Чем тебя строка VBIsNothing = (ObjPtr(object) = 0
не устроила?
или VBIsNothing = Not CBool(ObjPtr(object)) ?
Извращенцы...


Потому-что так быстрее...

Код: Выделить всё

VBIsNothing = (ObjPtr(object) = 0
VBIsNothing = Not CBool(ObjPtr(object))


А быстрее не нужно...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.04.2007 (Вс) 12:51

А как нужно? Медленнее? Ну тогда вставь Sleep 100 в каждую вторую строчку.

Или нужно "читаемее" ?

А, что, по твоему,
    VBIsNothing = IIf(ObjPtr(object) = 0, True, False)
читаемее чем
    VBIsNothing = (ObjPtr(object) = 0

?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 08.04.2007 (Вс) 17:07

Ну, Хакер, я не спорю с тобой! Можно-сказать что тема изьедена на нет, я полагаю.


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

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

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 93

    TopList