Livecode: две разные функции кнопок в зависимости от того, были ли они нажаты до этого

В Livecode я пытаюсь заставить кнопку работать с функцией «подключиться»/«отключить». Как я могу заставить кнопку узнать, была ли она уже нажата ранее, выполняя код A, а затем, при повторном нажатии, должен выполнять код B? Кнопку нужно нажимать несколько раз между "подключено" и "отключено"


person Adrian Munther    schedule 16.11.2015    source источник


Ответы (3)


Если вы используете стандартную кнопку и у вас есть только 2 состояния (отключено/подключено), простой способ — отключить свойство autoHilite кнопки и вручную установить hilite кнопки в ее скрипте:

on mouseUp
   set the hilite of me to not the hilite of me
   if the hilite of me then
       -- do connecting stuff here
   else
       -- do disconnecting stuff here
   end if
end mouseUp



Вы не объясняете, почему кнопку нужно нажимать несколько раз, но если вам нужно более двух состояний подключения, вы можете использовать настраиваемое свойство для сохранения текущего состояния. Например, вы можете использовать значения «пусто» (отключено), «рукопожатие» (запуск процесса), «подключение» (в процессе) и «связано» (подключено) для каждого состояния. Что-то типа:

# STORE CURRENT CONNECTING STATE IN connectionState

on mouseUp
   switch the connectionState of me
      case empty
         -- start connection process, show HANDSHAKING feedback here
         hilite me
         set the connectionState of me to "handshaking"
      break
      case "handshaking"
         -- if initial handshake successful, begin connecting to system
         if handShakeSuccessful is true then
             -- start connection process, show CONNECTING feedback here
             set the connectionState of me to "connecting"
         end if
      break
      case "connecting"
         -- if initial connection is successful, show LINKED feedback here
         if connectionSuccessful is true then
            set the connectionState of me to "linked"
         end if
      break
      case "linked"
         -- do disconnecting stuff here
         set the connectionState of me to empty
         unhilite me
   end switch
end mouseUp
person Scott Rossi    schedule 16.11.2015
comment
Ну, я должен признать, что мое описание было немного неясным (результат меньшего времени сна прошлой ночью...). Что касается кнопки многократного нажатия, то для соединения между клиентом (приложением LiveCode) и сервером графики/воспроизведения этой кнопке необходимы два разных состояния (включено/выключено). Сервер использует простой текстовый протокол, поэтому рукопожатие не требуется. Графический оператор должен иметь возможность подключаться и отключаться во время использования, если сервер нуждается в перезагрузке. Следовательно, кнопка должна знать, подключена ли она уже или отключена. - person Adrian Munther; 16.11.2015
comment
Решение № 1 отлично работает, но мне просто любопытно, есть ли другое решение, в котором вам не нужен обходной путь hilite. - person Adrian Munther; 16.11.2015
comment
Вы можете установить метку кнопки как угодно, как упоминалось выше (метка кнопки не зависит от ее имени). Метка может выступать в качестве переключателя или индикатора состояния: если метка меня отключена, то ‹выполнить действия по подключению›, установите метку меня на Подключен. Наоборот. Или вы можете использовать настраиваемое свойство, как указано в примере, что-то вроде: установите для isConnected меня значение true (или false). Использование hilite кнопки — это еще один визуальный индикатор, показывающий разницу в состоянии. - person Scott Rossi; 16.11.2015

В стеке ChatRev мы используем метку кнопки, чтобы указать ее статус.

if the label of me is "Connect" then
  set the label of me to "Disconnect"
  open socket gSocket
  write "helo" & cr to socket gSocket
  read from socket gSocket with message "connected"
else // "Disconnect"
  set the label of me to "Connect"
  write "disconnect" to socket gSocket
  repeat for each line myLine in the openSockets
    close socket myLine
  end repeat
end if

Если метка «Подключено», соединение должно быть закрыто, а если метка «Подключено», соединение должно быть установлено.

person Mark    schedule 16.11.2015

Я обычно использую обработчики setProp в подобных ситуациях. Кнопка используется только как «тумблер».

# the button script
on mouseUp
   set the uConnectedState of this cd to not the uConnectedState of this cd
end mouseUp

# in the card script (or wherever appropriate)
setProp uConnectedState pIsConnected
   if pIsConnected then
      set the label of btn "connect" to "Disconnect"
      # any other interface updates or logic here
   else
      set the label of btn "connect" to "Connect"
      # any other interface updates or logic here
   end if
   pass uConnectedState
end uConnectedState

Выполнение этого таким образом означает, что все, что мне нужно сделать, это установить пользовательское свойство, и все дела обрабатываются обработчиком setProp. Например, если мне нужно инициализировать соединение на openCard, все, что мне нужно сделать, это установить для uConnectedState карты значение false/true.

person Devin    schedule 17.11.2015