Страница 1 из 1

Обнуление переменной

Добавлено: 23 Август 2013, 10:33
OTiger
Странное поведение локальной переменной в форме.
Clarion 6.3, Template Clarion. Нарвался на глюк. Форма довольно сложная, много закладок, несколько броузеров и форма редактирования. Завел локальную переменную LONG. Под кнопкой присвоил ей InsertRecord, нажимаю другую кнопку переменная равна 0. Больше она нигде не встречается, только в этих двух местах. Пробовал другую локальную, эффект тот же. Глобальная работает все ок. Понимаю что где то накосячил очяпятку в тексте. Может у кого было подобное? Хоть в какую сторону вообще копать?

Re: Обнуление переменной

Добавлено: 23 Август 2013, 11:03
kreator
В одном окне такой эффект? Не может быть, текст в студию.

Re: Обнуление переменной

Добавлено: 23 Август 2013, 11:16
OTiger
ну весь текст врядли получится))

да в одном окне!

вот завел новую переменную локальную
Loc:MessAction long

?Button1
CASE EVENT()
OF EVENT:Accepted
GET(messupd,0)
CLEAR(MSU:Record,0)
MSU:id_oto = seta:NumOTO
MSU:typemsg = 'from'
Loc:MessAction = 1 !InsertRecord
!select(?TabNewMsg)
select(?MSU:title)
END


?Button2
CASE EVENT()
OF EVENT:Accepted
message(Loc:MessAction) ! Результат 0
END

Сам сижу и удивляюсь!
Прогнал поиском по сырцу, переменная встречается два раза в тексте, ни в какую группу она не входит.

Re: Обнуление переменной

Добавлено: 23 Август 2013, 12:12
OTiger
Короче. Пошел старым дедовским способом. Стал коментить блоками текст. Вышел на такую ерунду.
В этой процедуре есть объявление второго окна. И я его открываю в тексте. Само открытие ни н что не влияет, но как только я хочу обработать его события и вставляю accept - получаю вышеописанный эффект!
Упаковал в routine, все работает!

Re: Обнуление переменной

Добавлено: 23 Август 2013, 13:40
kreator
Вообще, интересно. При открытом окне Вы пытаетесь открыть другое, не обращая внимания на Accept. Наверно, в этом проблема. Строго говоря, после открытия окна должен следовать цикл Accept, а при закрытии окна нужен break. А почему второе окно не вызывать отдельной процедурой?

Re: Обнуление переменной

Добавлено: 23 Август 2013, 16:11
OTiger
Ну в принципе не ожидал, что для Клариона это проблема. Я не ожидал что в одной процедуре может быть только один accept, видимо он как то перекрывает основной accept. При этом достаточно было вынести открытие второго окна и его же accept в отдельную routine и проблема ушла. Но сам факт интересен, любопытная реакция получилась.

Re: Обнуление переменной

Добавлено: 23 Август 2013, 16:32
Shur
У Клариона, как известно, нет проблем. Есть проблема его недопонимания.
Иметь несколько окон в одной процедуре не запрещается, но как бы вам не запутаться в циклах accept, которых вы, собственно, можете иметь тоже сколько угодно.
В этой связи мне хотелось бы понять, когда вы нажимаете кнопку ?Button1, ваше второе окно уже открыто? Нельзя ли в этом случае вставить message(Loc:MessAction) после присвоения, которое бы утвердительно сказало, что кнопка точно была нажата, а код отработан?

Re: Обнуление переменной

Добавлено: 23 Август 2013, 17:41
OTiger
Основное окно открыто, естественно ставил stop() и выдавало значение 1. При нажатии на другую кнопку получал 0 этой же переменной. С accept-ами не путался, при нажатии на третью кнопку открывалось окно начала обработки некого процессика(небольшого), там текста на 20 строчек было. Соответственно все закрывал красиво по break и т.д. Но Самое любопытное что я это второе окно даже не октрывал, то есть просто этот текст присутствовал в коде. При входе в программу сразу шел к той переменной и получал этот прикол. Второе окно не задействовал еще.

Re: Обнуление переменной

Добавлено: 23 Август 2013, 17:43
Admin
OTiger писал(а):Ну в принципе не ожидал, что для Клариона это проблема. Я не ожидал что в одной процедуре может быть только один accept, видимо он как то перекрывает основной accept. При этом достаточно было вынести открытие второго окна и его же accept в отдельную routine и проблема ушла. Но сам факт интересен, любопытная реакция получилась.
На счет одного окна - ерунда...

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

        program
        map
        end

Window1 WINDOW('Window 1'),AT(,,395,224),FONT('MS Sans Serif',8,,FONT:regular),GRAY,DOUBLE
       BUTTON('Window 2'),AT(151,91,103,25),USE(?Button1),DEFAULT
     END

Window2 WINDOW('Window 1'),AT(,,395,224),FONT('MS Sans Serif',8,,FONT:regular),GRAY,DOUBLE
       BUTTON('Window 2'),AT(151,91,103,25),USE(?Button2),DEFAULT
     END

Window3 WINDOW('Window 1'),AT(,,395,224),FONT('MS Sans Serif',8,,FONT:regular),GRAY,DOUBLE
       BUTTON('Window 2'),AT(151,91,103,25),USE(?Button3),DEFAULT
     END

  CODE

  OPEN(Window1)
  ACCEPT
    CASE ACCEPTED()
    OF ?Button1
      OPEN(Window2)
      ACCEPT
        CASE ACCEPTED()
        OF ?Button2
           OPEN(Window3)
           ACCEPT
           END
           CLOSE(Window3)
        END
      END
      CLOSE(Window2)
    END
  END
  CLOSE(Window1)

Re: Обнуление переменной

Добавлено: 23 Август 2013, 17:46
Admin
И вообще... Для разбора "полетов", проще всего вам сделать небольшой пример повторяющий данный "глюк"
Типа моего кода а не APP на несколько метров кода.
Сразу все решим!