Я пытаюсь заставить приложение «повторно запускаться», когда нажата кнопка «вернуться к списку формул».
Я думал, что это сработает, так как я в основном возвращаю его к основному списку, но как только он возвращается к списку и делается другой выбор, он выходит из приложения. это явно не весь код, я просто включил первые два варианта.
--DIVE FORMULAS--
--RUN FORMULA LIST--
set x to item 1 of (choose from list {"Divers consumption at depth", "Free Gas Volume (FGV)", "Cylinder Duration", "Partial Pressure", "Initial Depth", "Cylinder Mixing"})
--DIVERS CONSUMPTION AT DEPTH--
if x is "Divers consumption at depth" then
--VARIABLES--
display dialog "What is divers breathing volume (L/min) (default 35 l/min?" default answer "35"
set varDvol to text returned of result
display dialog "What is divers absolute depth pressure (bar)" default answer ""
set varPbar to text returned of result
--FORMULA--
set answer to varDvol * varPbar
--ANSWER--
display dialog "A diver breathing " & varDvol & " l/min, at an absolute pressure of " & varPbar & " bar, will have a consumption of " & answer & " l/min" as text buttons {"See formula", "Return to formula list", "Exit"}
--OPTIONS--
set response to button returned of result
--SEE FORMULA--
if response = "See formula" then
display dialog "Divers Consumption = Divers Breathing Volume * Absolute pressure of depth (bar)" buttons ("Return to Formula List")
--RETURN TO FORMULA LIST--
set response to button returned of result
if response = "Return to Formula List" then
set x to item 1 of (choose from list {"Divers consumption at depth", "Free gas volume (FGV)", "Cylinder Duration", "Prartial Pressure", "Initial Depth", "Cylinder Mixing"})
end if
--RETURN TO FORMULA LIST--
else if response = "Return to formula list" then
set x to item 1 of (choose from list {"Divers consumption at depth", "Free gas volume (FGV)", "Cylinder Duration", "Prartial Pressure", "Initial Depth", "Cylinder Mixing"})
--EXIT APP--
else if response = "Exit" then
display dialog "Are you sure you wish to exit?" buttons {"Return to Formula List", "Exit"}
set response to button returned of result
if response = "Return to Formula List" then
set x to item 1 of (choose from list {"Divers consumption at depth", "Free gas volume (FGV)", "Cylinder Duration", "Prartial Pressure", "Initial Depth", "Cylinder Mixing"})
end if
else if response = "EXIT" then
quit
end if
--FREE GAS VOLUME--
else if x is "Free gas volume (FGV)" then
--VARIABLES--
display dialog "What is the floodable volume of the cylinder (L)?" default answer ""
set varFvol to text returned of result
display dialog "What is the pressure of the cylinder (bar)?" default answer ""
set varCylPress to text returned of result
--FORMULA--
set answer to varFvol * varCylPress
--ANSWER--
display dialog "The free gas volume is (L)" & answer as text buttons {"See formula", "Return to formula list", "Exit"}
--OPTIONS--
set response to button returned of result
--SEE FORMULA--
if response = "See formula" then
display dialog "FGV = Floodable volume of cylinder * Pressure of cylinder (bar)"
--RETURN TO FORMULA LIST--
else if response = "Return to formula list" then
set x to item 1 of (choose from list {"Divers consumption at depth", "Free gas volume (FGV)", "Cylinder Duration", "Partial Pressure", "Initial Depth", "Cylinder Mixing"})
--EXIT APP--
else if response = "Exit" then
#do a third thing
end if
как я уже сказал, кнопка «вернуться к списку формул» работает, но когда я делаю другой выбор из основного списка, приложение закрывается, оно не переходит к следующей выбранной функции, которую я ищу
Я даже не хочу, чтобы кнопка отмены была там, есть ли способ избавиться от нее?? Я просто хочу кнопку ОК
Нет, кнопки choose from list
жестко закодированы.
Вы должны изучить использование обработчиков (подпрограмм), иначе ваш сценарий будет занят и его будет трудно отслеживать/отлаживать, когда вы реализуете (или добавляете) другие параметры.
да, я начинаю сталкиваться с этим сейчас, лол, к счастью, это много копий и вставок, и коды для большинства из них одинаковы, так как он просто выполняет математику и меняет переменные
Это должно сработать для вас…
Везде в вашем коде вы видите это...
if response = "Return to Formula List" then
set x to item 1 of (choose from list {"Divers consumption at depth", "Free gas volume (FGV)", "Cylinder Duration", "Prartial Pressure", "Initial Depth", "Cylinder Mixing"})
end if
Попробуйте заменить на это...
if response = "Return to Formula List" then
run me
end if
@PaulBrann Рад, что смог помочь. Если вы считаете, что мой ответ был лучшим решением вашего вопроса, пожалуйста, отметьте его как принятый ответ и или проголосуйте за него, пожалуйста.
Я думаю, что самое простое решение — заключить ваш код в цикл повторения и позволить циклу повторения обрабатывать все действия «возврата к списку». Затем вы можете удалить все повторяющиеся choose from list
строки, и все, что вам нужно сделать, это вызвать exit repeat
, когда вы захотите выйти.
--DIVE FORMULAS--
--RUN FORMULA LIST--
repeat
set x to item 1 of (choose from list {"Divers consumption at depth", "Free Gas Volume (FGV)", "Cylinder Duration", "Partial Pressure", "Initial Depth", "Cylinder Mixing"})
--DIVERS CONSUMPTION AT DEPTH--
if x is "Divers consumption at depth" then
--VARIABLES--
display dialog "What is divers breathing volume (L/min) (default 35 l/min?" default answer "35"
set varDvol to text returned of result
display dialog "What is divers absolute depth pressure (bar)" default answer ""
set varPbar to text returned of result
--FORMULA--
set answer to varDvol * varPbar
--ANSWER--
display dialog "A diver breathing " & varDvol & " l/min, at an absolute pressure of " & varPbar & " bar, will have a consumption of " & answer & " l/min" as text buttons {"See formula", "Return to formula list", "Exit"}
set response to button returned of result
--SEE FORMULA--
if response = "See formula" then
display dialog "Divers Consumption = Divers Breathing Volume * Absolute pressure of depth (bar)" buttons ("Return to Formula List")
else if response = "Exit" then
display dialog "Are you sure you wish to exit?" buttons {"Return to Formula List", "Exit"}
set response to button returned of result
if response = "exit" then
exit repeat
end if
end if
--FREE GAS VOLUME--
else if x is "Free gas volume (FGV)" then
--VARIABLES--
display dialog "What is the floodable volume of the cylinder (L)?" default answer ""
set varFvol to text returned of result
display dialog "What is the pressure of the cylinder (bar)?" default answer ""
set varCylPress to text returned of result
--FORMULA--
set answer to varFvol * varCylPress
--ANSWER--
display dialog "The free gas volume is (L)" & answer as text buttons {"See formula", "Return to formula list", "Exit"}
--OPTIONS--
set response to button returned of result
--SEE FORMULA--
if response = "See formula" then
display dialog "FGV = Floodable volume of cylinder * Pressure of cylinder (bar)"
--EXIT APP--
else if response = "Exit" then
#do a third thing
end if
end if
end repeat
Вам не нужно явно вызывать 'quit', если только ваше приложение не разработано как постоянно открытое приложение. Как только вы выйдете из цикла повторения и нажмете последнюю строку кода, приложение автоматически прекратит работу.
Вы должны изучить использование обработчиков (подпрограмм), иначе вы довольно быстро потеряетесь, когда будете реализовывать другие параметры или расширять функции в сценарии.
Один из способов сделать это — реструктурировать сценарий, поместив основной список в оператор повтора и запустив каждый вариант выбора в отдельном обработчике. Эти обработчики будут связаны только со своей конкретной функцией (также удобной для просмотра и отладки) и могут возвращать кнопку последнего диалога для использования основным циклом, например:
on run -- main
repeat -- forever
set choice to (choose from list {"Divers consumption at depth", "Free Gas Volume (FGV)", "Cylinder Duration", "Partial Pressure", "Initial Depth", "Cylinder Mixing"} cancel button name "Exit") as text — just one item
if choice is "Divers consumption at depth" then
set theResult to consumption()
else if choice is "Free Gas Volume (FGV)" then
set theResult to volume()
else if choice is "Cylinder Duration" then
set theResult to duration()
else if choice is "Partial Pressure" then
set theResult to pressure()
else if choice is "Initial Depth" then
set theResult to depth()
else if choice is "Cylinder Mixing" then
set theResult to mixing()
end if
if choice is "false" or theResult is "Exit" then -- exit
set response to (display dialog "Are you sure you wish to exit?" buttons {"Return to Formula List", "Exit"})
if button returned of response is "Exit" then exit repeat
end if
end repeat
end run
on consumption() -- Divers consumption at depth
--VARIABLES--
set response to (display dialog "What is divers breathing volume (L/min) (default 35 l/min?" default answer "35" buttons {"Exit", "OK"} default button 2)
if button returned of response is "Exit" then return "Exit"
set varDvol to text returned of response
set response to (display dialog "What is divers absolute depth pressure (bar)" default answer "1" buttons {"Exit", "OK"} default button 2)
if button returned of response is "Exit" then return "Exit"
set varPbar to text returned of response
--FORMULA--
set answer to varDvol * varPbar
--ANSWER--
set response to (display dialog "A diver breathing " & varDvol & " l/min, at an absolute pressure of " & varPbar & " bar, will have a consumption of " & answer & " l/min" as text buttons {"See formula", "Return to formula list", "Exit"})
--SEE FORMULA--
if button returned of response = "See formula" then
set response to (display dialog "Divers Consumption = Divers Breathing Volume * Absolute pressure of depth (bar)" buttons {"Return to Formula List", "Exit"})
end if
return button returned of response
end consumption
on volume() -- Free Gas Volume (FGV)
set response to (display dialog "volume" buttons {"Exit", "OK"} default button 2)
return button returned of response
end volume
on duration() -- Cylinder Duration
set response to (display dialog "duration" buttons {"Exit", "OK"} default button 2)
return button returned of response
end duration
on pressure() -- Partial Pressure
set response to (display dialog "pressure" buttons {"Exit", "OK"} default button 2)
return button returned of response
end pressure
on depth() -- Initial Depth
set response to (display dialog "depth" buttons {"Exit", "OK"} default button 2)
return button returned of response
end depth
on mixing() -- Cylinder Mixing
set response to (display dialog "mixing" buttons {"Exit", "OK"} default button 2)
return button returned of response
end mixing
что def очищает его, я предполагаю, что просто добавлю формулы перед «конечными командами»
Да, каждая on whatever() … end whatever
— это отдельная подпрограмма, которая будет обрабатывать один параметр в вашем списке. Мои примеры подпрограмм возвращают кнопку последнего диалога, чтобы вы могли использовать кнопку с именем «Выход» для подтверждения выхода из приложения без дублирования кода для диалогов.
Не имеет отношения, но имейте в виду, что возникает ошибка, если кнопка
Cancel
нажата во всехchoose from list
строках.