Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

26 Март 2017, 10:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Глобальная переменная  (Прочитано 1779 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Стартовое сообщение: 22 Ноябрь 2016, 15:32 »

Доброе время суток всем! Подскажите как сделать глобальную(для модуля) переменную?
Сделал так:
Объявление:
Код:
    Option Explicit
    Public LastUserID%
Использование:
Код:
Sub LoadRep(N as Integer)

  print LastUserID
..........
LastUserID = N
..........
  print LastUserID

End Sub

LoadRep вызывается по смене списка (ЛистБокс)
В сообщениях всегда первым показывается "0", вторым выбранный Номер Итема в списке.
Такое ощущение как будто LastUserID не глобальная....
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #1: 22 Ноябрь 2016, 16:45 »

Я так понял, что я не правильно объявляю переменную:
Код:
Public LastUserID%

Если закомментировать, то все работает как надо, ну т.е. переменная сохраняет свое значение:
Код:
REM  *****  BASIC  *****
' Option Explicit
'    Public LastUserID%
   
Sub LoadRep(N as Integer)

  print LastUserID

LastUserID = N

  print LastUserID

End Sub

Sub Test
    LoadRep(RND*50)
End Sub
но мне нужен Option Explicit
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #2: 22 Ноябрь 2016, 17:03 »

Если правильно понял, то так:
Код:
REM  *****  BASIC  *****
Option Explicit
  
Sub LoadRep(N as Integer)
  print LastUserID

LastUserID = N

  print LastUserID

End Sub

Sub Test
Static LastUserID%        'переменная объявляется здесь, видна во всех макросах модуля и сохраняет значение до следующего изменения
    LoadRep(RND*50)
End Sub

Ошибся, переменную LastUserID% нужно объявлять как Global вне макроса, а не как Static Грустный
« Последнее редактирование: 23 Ноябрь 2016, 11:50 от rami » Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #3: 22 Ноябрь 2016, 17:13 »

Если правильно понял, то так:
Ну в общем-то да, результат - что нужно. Просто как-то неожиданно Улыбка Глобальная переменная объявляется внутри подпрограммы.
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 22 Ноябрь 2016, 17:19 »

Если правильно понял, то так:
Ну в общем-то да, результат - что нужно. Просто как-то неожиданно Улыбка Глобальная переменная объявляется внутри подпрограммы.
А она не глобальная. Она видна во всех библиотеках и модулях только текущего документа.
« Последнее редактирование: 22 Ноябрь 2016, 17:27 от rami » Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #5: 22 Ноябрь 2016, 17:26 »

А она не глобальная.
Как это не глобальная??? Она ж доступна из всех макросов модуля...
Глобальная для текущего документа Улыбка
« Последнее редактирование: 22 Ноябрь 2016, 17:37 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #6: 22 Ноябрь 2016, 17:44 »

Как это не глобальная??? Она ж доступна из всех макросов модуля...
Глобальная, не глобальная — лишь бы здорова была Смеющийся Смеющийся Смеющийся  Не будем ругаться за терминологию.

Переменная Static должна объявляться в процедуре, должна же она чем-то отличаться от Global и других.
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #7: 22 Ноябрь 2016, 20:42 »

Не будем ругаться за терминологию.
Я даже не посмею этого сделать здесь Улыбка Более того, отдельное и большущее Вам и всем на этом форуме - Спасибище! Улыбка
Но в догонку у меня вопрос. Помимо этой переменной у меня еще есть такие:
В начале модуля:
Код:
' Option Explicit
'    Public shtSystem as Object
Затем в процедуре, которая вызывается при открытии данного документа:

Код:
shtSystem = ThisComponent.Sheets(0)

Ну и далее в разных процедурах использую переменную shtSystem. И вроде таких глюков, как с LastUserID - нет.
Отсюда вопрос - а правильно ли я делаю и не наступлю ли на более тяжелые грабли?
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #8: 22 Ноябрь 2016, 22:56 »

Ну и далее в разных процедурах использую переменную shtSystem. И вроде таких глюков, как с LastUserID - нет.
Отсюда вопрос - а правильно ли я делаю и не наступлю ли на более тяжелые грабли?
А какие глюки были с LastUserID Непонимающий Есть разные требования к переменным и разные способы их объявления. Естественно, нужно подбирать правильный тип и способ объявления каждой переменной. Если после завершения макроса нужно запоминать значение переменной для последующего использования — выбираем Static, если не нужно — другую в зависимости от условий видимости переменной.

По возможности нужно избегать объявление переменной в модуле (вне процедуры), так ка это может привести к неожиданным и нежелательным эффектам (нашествие Чужих Azn Azn Azn — переменных из других библиотек или модулей). Объявлять переменную в модуле нужно только если она должна быть видна в разных макросах.
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #9: 23 Ноябрь 2016, 09:41 »

По возможности нужно избегать объявление переменной в модуле (вне процедуры)
т.е. так:



Код:
       Option Explicit
       Public shtSystem as Object, shtReport as Object.....


Sub MainInit
shtSystem = ThisComponent.Sheets(0)
shtReport = ThisComponent.Sheets(1)
shtData   = ThisComponent.Sheets(2)
...........
End Sub

ну и далее в разных Sub, Function - обращаемся к ним.
лучше так не делать?

У меня вопрос, наверное уже, не про видимость и место объявления, а про время жизни переменной.
Получается объявить их можно в начале модуля, а инициализировать в каждой Sub, Function. Хотя уже и смысл в объявлении вне процедур - теряется.
« Последнее редактирование: 23 Ноябрь 2016, 11:13 от Alex16 » Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #10: 23 Ноябрь 2016, 10:00 »

Что-то не пойму, что случилось, но сегодня перестал работать этот пример:
Код:
REM  *****  BASIC  *****
Option Explicit
  
Sub LoadRep(N as Integer)
  print LastUserID   <<< Ошибка времени выполнения BASIC. Переменная не определена.

LastUserID = N

  print LastUserID

End Sub

Sub Test
Static LastUserID%        'переменная объявляется здесь, видна во всех макросах модуля и сохраняет значение до следующего изменения
    LoadRep(RND*50)
End Sub
Если курсор поставить в sub Test и нажать F5 то ошибка.
(В момент эксперимента в либре открыт только новый документ Calc и весь модуль с макросами в этом сообщении.)
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 020


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #11: 23 Ноябрь 2016, 11:42 »

Вот и я попал в засаду Грустный : сначала переменная LastUserID% была объявлена как Global, а она сохраняется до закрытия офиса — именно её действие я по ошибке принял за Static. Сама Static, как я и сказал раньше не глобальная, а локальная переменная и действует до полного завершения макроса. Пример от Питоньяка:
Код:
Sub ExampleStatic
  ExampleStaticWorker()
  ExampleStaticWorker()
End Sub

Sub ExampleStaticWorker
  Static iStatic1 As Integer
  Dim iNonStatic As Integer
  iNonStatic = iNonStatic + 1
  iStatic1 = iStatic1 + 1
Msgbox "iNonStatic = " & iNonStatic & CHR$(10) & "iStatic1 = " & iStatic1
End Sub

То поведение переменной, о котором писали вчера, относится к Global, а не Static. Это хороший пример как нужно быть осторожным с переменными объявленными в модуле вне макросов.
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #12: 23 Ноябрь 2016, 13:28 »

Так. Меня радует, что вопрос с засадой разъяснился, хоть и не в мою пользу)
Тогда получается мой вопрос переменной не решить? Мне нужно что бы в переменной (глобальной) сохранялось значение, выбранного последним в списке элемента.
У меня конечно же созрел коварный план. Сохранять не в переменную, а в "секретную" ячейку какого-нибудь "специального" листа... Но как-то это не камильфо.... не по программистски)))
Записан
mikekaganski
Старожил
****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 375


« Ответ #13: 23 Ноябрь 2016, 13:48 »

https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Scope_of_Variables
Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 227


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #14: 23 Ноябрь 2016, 13:52 »

как-то это не камильфо.... не по программистски)))
Нормально-нормально! Программисты тоже бывают разные (индусы, например). Главное, чтобы решение работало и выполняло поставленную задачу. А как именно это сделано - уже не так уж и важно. "Не важно, как идёт процесс. Главное - как это выглядит со стороны" (с) один из Законов Мерфи
Секретная ячейка - только один из возможных вариантов. Есть еще куча мест, где это значение можно спрятать - пользовательские свойства документа, именованный диапазон, внешний текстовый файл (.ini), системный реестр... А можно просто каждый раз заглядывать в тот же самый ListBox и читать его значение. Любое из этих решений может быть реализовано и, скорее всего, будет работать годами.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!