Как обратится ко всем элементам?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Как обратится ко всем элементам?

Сообщение MIT » 18.12.2008 (Чт) 19:41

Задача вроде не сложная - обратится ко всем контролам определенного типа на форме. Но что если контрол лежит не на форме, а в другом контроле?
Написал следующую процедуру:

Код: Выделить всё
    Private Sub ClearAllTB(ByVal Cls As ControlCollection)
        For Each c As Control In Cls
            If c.GetType.ToString = "TextBox" Then c.Text = ""
            If Not IsNothing(c.Controls) Then ClearAllTB(c.Controls)
        Next
    End Sub


но она не работает, VS жалeется, что не может персональный ControlCollection контрола (например TabPageControlCollection) распознать как базовый ControlCollection (как из Form. так и из Control.), соответственно ничего не получается. Как правильно?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как обратится ко всем элементам?

Сообщение Nord777 » 18.12.2008 (Чт) 22:17

Код: Выделить всё
  Private Sub ClearAllTB(ByVal Cls As System.Windows.Forms.Control.ControlCollection)
    For Each c As Control In Cls
      If TypeOf c Is TextBox Then c.Text = ""
      If c.Controls IsNot Nothing Then ClearAllTB(c.Controls)
    Next
  End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 18.12.2008 (Чт) 23:58

Спасибо, работает.
А чем отличается запись c.Controls IsNot Nothing от Not IsNothing(c.Controls)?

Nord777 писал(а):If TypeOf c Is TextBox Then
Офигеть... Впервые увидел применение Is, теперь умнее буду...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Как обратится ко всем элементам?

Сообщение Williams » 19.12.2008 (Пт) 0:04

MIT писал(а):Спасибо, работает.
А чем отличается запись c.Controls IsNot Nothing от Not IsNothing(c.Controls)?

Nord777 писал(а):If TypeOf c Is TextBox Then
Офигеть... Впервые увидел применение Is, теперь умнее буду...


Первое - классический вариант, второе - функция. Результат практически одинаковый
И вы думаете, что вас оставят в живых после прочтения этого поста?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 19.12.2008 (Пт) 0:14

Williams писал(а):Результат практически одинаковый
Если практически, значит не одинаковый, значит есть причина, по которой стоит юзать первый и не юзать второй вариант.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alexkr.net
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 19.12.2008 (Пт) 11:50
Откуда: Germany

Re: Как обратится ко всем элементам?

Сообщение alexkr.net » 19.12.2008 (Пт) 12:18

Разница между NOT и ISNOT заключается в следующем: ISNOT это противоположность IS. ISNOT проверяет указывают ли два поинтера на разные объекты. NOT же просто оператор отрицания. Итак, если ты работаешь с объектами, можешь исаользовать isnot как и not. Если же работаешь с простыми переменными, к примеру boolean, isnot в этом случае не подойдёт.

Пример1:
Код: Выделить всё
Dim a as Object
dim b as Object

if not a is b then
'работает.
end if

if a isnot b then
'результат тот же,
end if


Пример2:
Код: Выделить всё
Dim a as boolean
dim b as boolean

If Not a then
'Всё отлично работает.
end if

if a isnot then
'а вот это уже не прокатит, так как здесь мы работаем с простой переменной, а не с объектом.
end if


Вывод: NOT в сочитании с IS можно использовать всегда. ISNOT же только если сравниваются два поинтера.
Ничто так не ограничивает полет мысли программиста, как компилятор

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 19.12.2008 (Пт) 12:30

Интересно...
И все же, почему способ IsNot Nothing лучше чем использование функции IsNothing?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alexkr.net
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 19.12.2008 (Пт) 11:50
Откуда: Germany

Re: Как обратится ко всем элементам?

Сообщение alexkr.net » 19.12.2008 (Пт) 13:21

Смотри пример. Маленькая процедура, в которой я проверяю объект a на nothing
Сравнение делаю тремя методоми: NOT IS Nothing, ISNOT Nothing и IsNothing().

Код: Выделить всё
Private Sub test()
        Dim a As Object


        'IsNot Nothing
        If a IsNot Nothing Then
            MessageBox.Show("IsNot")
        End If

        'Non Is
        If Not a Is Nothing Then
            MessageBox.Show("Not")
        End If

        'IsNothing
        If Not IsNothing(a) Then
            MessageBox.Show("IsNothing")
        End If
    End Sub

Результат, во всех случаях будет один. Но посмотрим, как в конечном счёте выглядит код для компилятора:


Код: Выделить всё
        Private Sub test()
            Dim a As Object

            If Not (a) Is Nothing Then
                MessageBox.Show("IsNot")
            End If
            If Not (a) Is Nothing Then
                MessageBox.Show("Not")
            End If
            If Not Information.IsNothing(RuntimeHelpers.GetObjectValue(a)) Then
                MessageBox.Show("IsNothing")
            End If
        End Sub


IsNot стало Not Is! Как я уже и говорил Not Is всегда можно использовать вместо IsNot, так как в конечном счёте это одно и тоже.
С IsNothing дело выглядит иначе, это уже не просто оператор, а полноценная функция, которая возвращаяе "булочное" значение.
Быстрей ли эта функция чем операторы или нет, не знаю. Думаю это больше дело вкуса. Я например ещё ниразу не использовал функцию IsNothing.
Последний раз редактировалось alexkr.net 19.12.2008 (Пт) 14:16, всего редактировалось 1 раз.
Ничто так не ограничивает полет мысли программиста, как компилятор

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 19.12.2008 (Пт) 13:46

alexkr.net писал(а):Я например ещё ниразу не использовал функцию IsNothing.

Я, например, всегда использую именно ее. А по поводу скорости - надо тест провести.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alexkr.net
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 19.12.2008 (Пт) 11:50
Откуда: Germany

Re: Как обратится ко всем элементам?

Сообщение alexkr.net » 19.12.2008 (Пт) 14:17

Проверил! IsNot намного быстрее чем IsNothing. Смотри в проекте.
Вложения
IsNotVSIsNothing.zip
(71.29 Кб) Скачиваний: 39
Ничто так не ограничивает полет мысли программиста, как компилятор

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 19.12.2008 (Пт) 14:32

Ну да, это аргумент.

P.S. Блин, везет тебе: есть время всякой ерундай заниматься...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

alexkr.net
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 19.12.2008 (Пт) 11:50
Откуда: Germany

Re: Как обратится ко всем элементам?

Сообщение alexkr.net » 19.12.2008 (Пт) 14:49

Благодоря "всякой ерунде" и возникают, грамотнонаписанные, хорошо оптимированные программы! :wink:
Ничто так не ограничивает полет мысли программиста, как компилятор

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как обратится ко всем элементам?

Сообщение Nord777 » 20.12.2008 (Сб) 0:09

Проверил! IsNot намного быстрее чем IsNothing.
Это утверждение не совсем верно. Попробуй обьявить переменную не как Object....
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Как обратится ко всем элементам?

Сообщение MIT » 20.12.2008 (Сб) 0:21

Интересно... Результаты почти одинаковые.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 98

    TopList