Применение With ... End With

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Применение With ... End With

Сообщение ger_kar » 08.07.2011 (Пт) 18:50

With удобный оператор для многократных (серии) действий с объектом. Если производится действие над одним объектом то все понятно. Но если например в действии принимают участие не один, а два объекта, как в этом случае можно, и можно ли вообще при помощи этого оператора получить ссылки на два объекта одновременно? Ну например два диапазона в разных листах Excel для одновременной работы.
Бороться и искать, найти и перепрятать

Filyus
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 07.07.2011 (Чт) 11:54

Re: Применение With ... End With

Сообщение Filyus » 08.07.2011 (Пт) 19:48

Только если один объект вложен в другой.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 2:04

А параллельно никак? Жаль - было бы удобно.
Бороться и искать, найти и перепрятать

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

Re: Применение With ... End With

Сообщение Хакер » 09.07.2011 (Сб) 2:04

Как ты себе это представляешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 2:34

А я это себе и не представляю, даже приблизительно. И даже уверен что стандартными средствами это не реализуемо, но зато я знаю, что стандартное это не значит, что-то незыблемое, и для некоторых (не буду показывать пальцем :shock: ) эти ограничения обойти раз плюнуть ;) . Примеры я думаю приводить не нужно и так понятно.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.07.2011 (Сб) 9:47

Не помню, чтобы были ограничения на вложенные With.

Filyus
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 07.07.2011 (Чт) 11:54

Re: Применение With ... End With

Сообщение Filyus » 09.07.2011 (Сб) 9:49

Хотя вполне можно...
Код: Выделить всё
  With Command1
    .Caption = "1"
    With Command2
      .Caption = "2"
    End With
  End With

Код: Выделить всё
Private Sub Worksheet_Activate()
    With Worksheets(1).Range("A1:A2")
        .Value = "1"
        With Worksheets(2).Range("B1:B2")
            .Value = "2"
        End With
    End With
End Sub


или так:
Код: Выделить всё
  With Command
    .Item(0).Caption = "1"
    .Item(1).Caption = "2"
  End With

Код: Выделить всё
Private Sub Worksheet_Activate()
    With Worksheets
        .Item(1).Name = "1"
        .Item(2).Name = "2"
    End With
End Sub
Последний раз редактировалось Filyus 09.07.2011 (Сб) 10:07, всего редактировалось 2 раз(а).

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

Re: Применение With ... End With

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

ger_kar писал(а):эти ограничения обойти раз плюнуть ;) .

Не надо придумывать ограничения там, где их нет. То, что у треугольника нет двух тупых углов, это не кем-то придуманное ограничение, это данность.

И обойти его нельзя, имея даже самое крутое визуальное воображение. Но если кто-то нарисует, то пожалуйста.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 11:58

Хакер писал(а):Не надо придумывать ограничения там, где их нет. То, что у треугольника нет двух тупых углов, это не кем-то придуманное ограничение, это данность.И обойти его нельзя, имея даже самое крутое визуальное воображение. Но если кто-то нарисует, то пожалуйста.
Да с треугольником засада, если я такой когда нибудь нарисую, то можно сразу будет номинироваться на Нобелевскую премию по геометрии ;) А вот с With я думаю можно было бы попытаться, чтобы например можно было писать так:
Код: Выделить всё
Private Sub Worksheet_Activate()
    With Worksheets.Item(1) as 1,  Worksheets.Item(2) as 2
        1.Name = "1"
        2.Name = "2"
    End With
End Sub

Я немного видоизменил пример Filyus. В принципе оригинальный пример довольно лаконичен, но он отражает частную ситуацию, когда идет работа с элементами коллекции, а вот если бы можно было бы использовать With в таком примере как у меня, то было бы классно. Вы не находите ?
Бороться и искать, найти и перепрятать

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

Re: Применение With ... End With

Сообщение Хакер » 09.07.2011 (Сб) 12:06

ger_kar писал(а):а вот если бы можно было бы использовать With в таком примере как у меня

Смысл With исключительно в том, чтобы ничего не писать перед точкой. Ты же предпочёл писать что-то перед точкой. Почему бы тогда просто не объявить соотв. переменные?

ger_kar писал(а):то было бы классно. Вы не находите ?

Я нахожу это отвратительным. Кажется ни в одном языке мира нет идентификаторов, которые составляют десятичное число.

1.Name = "1"
Как отличить переменную 1 от строчной метки 1?

Как понять, где 1.e+3 — это твой чудо-подход, а где просто альтернативная запись числа 1000?

Большего надругательства над синтаксисом сложно придумать :|
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Применение With ... End With

Сообщение alibek » 09.07.2011 (Сб) 12:15

Хакер писал(а):И обойти его нельзя, имея даже самое крутое визуальное воображение. Но если кто-то нарисует, то пожалуйста.

Можно. Нарисуй треугольник на сфере.
Lasciate ogni speranza, voi ch'entrate.

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

Re: Применение With ... End With

Сообщение Хакер » 09.07.2011 (Сб) 12:31

Мало кто имеет в виду сферическую геометрию вместо евклидовой, когда говорит о фигурах.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 12:54

Хакер писал(а):Я нахожу это отвратительным.
:D А мне все равно нравится :D
Хакер писал(а):Почему бы тогда просто не объявить соотв. переменные?

Ну не знаю у кого как, как а у меня уже выработалась привычка давать переменным осмысленные имена и префиксы соответствующие типу, и как правило такие имена гораздо длиннее чем 1 или 2 ;) , тем более зачем вводить лишние переменные, а в качестве идентификаторов можно использовать не только десятичное число.
Хакер писал(а):Как отличить переменную 1 от строчной метки 1?
Ну как раз этим и отличается, что в VB переменная не может начинаться с цифры (скобки [] не в счет), да плюс к тому же она находится в блоке With ... End With, соответственно по этим признакам ее и идентифицировать.
Ну на крайняк ее можно в скобки упрятать [1].
Хакер писал(а):Как понять, где 1.e+3 — это твой чудо-подход, а где просто альтернативная запись числа 1000?
Не использовать такие идентификаторы если предполагается юзать числа с плавающей запятой.
ЗЫ:
Сильно понравились фразы "твой чудо-подход" и "Большего надругательства над синтаксисом сложно придумать", посмеялся от души :D
Бороться и искать, найти и перепрятать

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

Re: Применение With ... End With

Сообщение Хакер » 09.07.2011 (Сб) 12:57

ger_kar писал(а): тем более зачем вводить лишние переменные

Можно подумать With не создаёт ту же самую переменную.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 13:15

Хакер писал(а):Можно подумать With не создаёт ту же самую переменную
Да, но при этом читабельность кода не страдает, т.е. проблема не в создании самой переменной, а в том, что бы не загромождать код с ее объявлением, присвоением, обнулением. ИМХО если сама переменная в логике работы не нужна, то использование With гораздо удобнее.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 09.07.2011 (Сб) 14:00

Что, моя идея, не такая уж и отстойная, как показалось на первый взгляд, или дело совсем плохо :) ? (Полный клинический случай)
Кстати ее как мне кажеться вполне можно реализовать Add-In 'ом. Т.е. Запись будет выглядеть так как я записал, а в натуре аддин будет подставлять код с объявлением переменной, и присвоением/уничтожением ссылки на объект?
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Применение With ... End With

Сообщение iGrok » 09.07.2011 (Сб) 16:06

В дельфи (и ещё где-то, но не помню, где) есть такая фишка:
Код: Выделить всё
with record, other_record, object do
begin
  a := 1; //record.a
  b := 2; //other_record.b
  c := 3; //object.c
end;

Но это работает ровно до тех пор, пока можно однозначно идентифицировать, к чему мы обращаемся (т.е. пока член/поле с нужным именем есть только в одном из перечисленных объектов/структур). Иначе - облом на этапе компиляции.

А вот в варианте с "1.(чё-то там); 2.(чё-то там)" действительно нет ровным счётом никакого смысла. Читабельность и понятность это не улучшает. Это вообще ничего, по сути, не меняет.

Дельфийский же вариант, который с виду смотрится компактнее и на первый взгляд даже удобнее, тоже ни разу не улучшает читабельность и понятность (а наоборот только ухудшает), ибо глядя только на этот код вообще невозможно понять, к чьему полю/члену идёт обращение.
label:
cli
jmp label

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Применение With ... End With

Сообщение Antonariy » 11.07.2011 (Пн) 9:40

Хакер писал(а):Мало кто имеет в виду сферическую геометрию вместо евклидовой, когда говорит о фигурах.

Не полагайся на подобные суждения, если будешь, допустим, спорить на деньги с серьезными людьми.
Лучший способ понять что-то самому — объяснить это другому.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 11.07.2011 (Пн) 9:49

Уж незнаю, кто как, а я что-то даже на сфере, ну никак не могу себе представить треугольник с двумя тупыми углами :scratch:
Бороться и искать, найти и перепрятать

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

Re: Применение With ... End With

Сообщение Хакер » 11.07.2011 (Пн) 10:05

Ну с тремя углами по 90 можешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 11.07.2011 (Пн) 10:59

Ну представляется нечто похожее на треугольник (не знаю можно ли его так назвать) вобщем если к дуге опоясывающей шар по экватору под углом 90 градусов пришпандорить два отрезка, которые вверху также сходятся под углом 90 гр. Вот такую конструкцию вполне представляю ;)
Бороться и искать, найти и перепрятать

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

Re: Применение With ... End With

Сообщение Хакер » 11.07.2011 (Пн) 12:48

ger_kar писал(а):Ну представляется нечто похожее на треугольник (не знаю можно ли его так назвать) вобщем если к дуге опоясывающей шар по экватору под углом 90 градусов пришпандорить два отрезка, которые вверху также сходятся под углом 90 гр.


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

Random
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 21.02.2006 (Вт) 6:08
Откуда: Пермь

Re: Применение With ... End With

Сообщение Random » 24.07.2011 (Вс) 9:19

Если причина Вашего недовольства повторяющиеся километровые пути к нужным медам/свойствам, можно использовать переменные объектных типов.
:)

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Применение With ... End With

Сообщение ark » 24.07.2011 (Вс) 9:42

Random писал(а):Если причина Вашего недовольства повторяющиеся километровые пути к нужным медам/свойствам, можно использовать переменные объектных типов.

Круто. А на сколько это уменьшит километровость с учетом объявления этих самых переменных?

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Применение With ... End With

Сообщение Zenitchik » 24.07.2011 (Вс) 12:53

Если Вам религия не позволяет объявлять однобуквенные переменные - это сугубо ваша проблема.

Сугубо ИМХО, если некая переменная используется только в ограниченном фрагменте кода, и этот фрагмент кода можно охватить одним взглядом - такая переменная ОБЯЗАНА быть однобуквенной.
Знание английского языка - затрудняет понимание кода

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 24.07.2011 (Вс) 19:21

В принципе можно заменить блок With ... End With примерно такой конструкцией:
Код: Выделить всё
Dim a As App: Set a = App
        Debug.Print a.EXEName
        Debug.Print a.Comments
Set a = Nothing
Бороться и искать, найти и перепрятать

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Применение With ... End With

Сообщение ark » 25.07.2011 (Пн) 0:50

Zenitchik писал(а):Если Вам религия не позволяет объявлять однобуквенные переменные

А при чем тут With...End With?
если некая переменная используется только в ограниченном фрагменте кода, и этот фрагмент кода можно охватить одним взглядом - такая переменная ОБЯЗАНА быть однобуквенной.

Declare Function DeviceIoControl Lib "kernel32" (ByVal h As Long, ByVal d As Long, _
ByRef i As Any, ByVal n As Long, ByRef p As Any, _
ByVal w As Long, ByRef r As Long, ByVal o As Long) As Long

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Применение With ... End With

Сообщение ark » 25.07.2011 (Пн) 1:06

ger_kar писал(а):можно заменить блок With ... End With

With ... End With именно так и делает. Тютелька в тютельку

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Применение With ... End With

Сообщение ger_kar » 25.07.2011 (Пн) 10:19

ark писал(а):With ... End With именно так и делает. Тютелька в тютельку
Да, по принципу действия совпадает, но немного отличается по написанию :) . Вот Хакер ругается на волшебные константы, вместо именованных, хотя суть действия от этого не меняется. Я считаю ту запись, которую я привел, вполне удобоваримой, но это мое мнение, а что думают другие? Конечно в приведенном примере, я просто привел альтернативную запись, которую можно расширить и написать например так (VBA Excel):
Код: Выделить всё
Dim a As WorkSheet: Set a = WorkSheet(1)
Dim b As WorkSheet: Set a = WorkSheet(2)
        a.Range ("A5")  = b.Range ("B10")
        a.Range ("A10") = b.Range ("B20")
Set a = Nothing: Set b = Nothing

При надобности и третий и четвертый элементы можно использовать. А вместо одного, смысла так писать конечно нет, для этого есть более удобное средство With ... End With.
Бороться и искать, найти и перепрятать

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Применение With ... End With

Сообщение Antonariy » 25.07.2011 (Пн) 11:29

ger_kar писал(а):Вот Хакер ругается на волшебные константы
А следует бить линейкой по пальцам.
хотя суть действия от этого не меняется
Меняется суть восприятия. Но это мелочь. Главное, если константа изменилась, при наличии имени ее нужно изменить в одном месте, а не 100500 с возможностью прошляпить пару-тройку мест и иметь потрясающий секс с трудно вылавливаемыми багами.
Лучший способ понять что-то самому — объяснить это другому.

След.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 26

    TopList  
cron