How to save variables after quitting and reopening in AppleScript?

Viewed 729

I am writing a very complicated AppleScript application that requires variables to be saved after quitting. So if I set the variable while it is running, close it, reopen it the variable will still be the same.

This script is intended to bring up a setup menu on first run. Then save the preferences for after the application is closed. More Technical explanation:

When it starts (on run) it will check if isSetup is false if it is it will go to the function setup(). The setup() function sets preferences and sets isSetup to true. When I quit and reopen the application is runs the setup() function again.

I know I am not supposed to copy and paste full scripts but I can't find the replicate the error without it. Here it is:

--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki     Naganoya adapted by ----
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502

property aStatusItem : missing value
global theToggle
global theMenuTitle
global aTag
global aTitle
global isSetup
global usrName
global usrPass
global usrProtocol
property usrName : missing value
property usrPass : missing value
property isSetup : false
property usrProtocol : missing value
on run
    if isSetup is false then
        setup()
    else
        set theToggle to "Connect"
        set theMenuTitle to "Server Helper"
        init()

    end if
end run

on init()
    set aList to {theToggle, "Preferences", "Change Password", "",  "Quit"}
    set aStatusItem to current application's NSStatusBar's  systemStatusBar()'s statusItemWithLength:(current application's     NSVariableStatusItemLength)

    aStatusItem's setTitle:theMenuTitle
    aStatusItem's setHighlightMode:true
    aStatusItem's setMenu:(createMenu(aList) of me)
end init

on createMenu(aList)
    set aMenu to current application's NSMenu's alloc()'s init()
    set aCount to 1
    repeat with i in aList
        set j to contents of i
        if j is not equal to "" then
            set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        else
            set aMenuItem to (current application's NSMenuItem's separatorItem())
        end if
        (aMenuItem's setTarget:me)
        (aMenuItem's setTag:aCount)
        (aMenu's addItem:aMenuItem)
        if j is not equal to "" then
            set aCount to aCount + 1
        end if
    end repeat

    return aMenu
end createMenu

on setup()
    display dialog "                Welcome to the Server setup     Utility. 
                        To Begin click " & quote & "Continue" & quote & " below." buttons {"Cancel", "Continue"} default button 2
    set theButton to the button returned of the result

    if theButton is "Continue" then
        display dialog "Please enter your " & quote & "Username" & quote & " for the Brown Server." default answer "Username" buttons {"Continue"} default button 1
        set usrName to the text returned of the result
        display dialog "Please enter your " & quote & "Password" & quote & " for the Brown Server." default answer "" buttons {"Continue"} default button 1 with hidden answer
        set usrPass to the text returned of the result
        set listDeProtocols to {"AFP", "SMB", "WebDav", "FTP"}
        set usrProtocol to (choose from list listDeProtocols with prompt "Choose Your Prefered Protocol. AFP is recomended. If AFP does not work try SMB. All others are not supported at this time")
        set isSetup to true
        postSet()
    end if
end setup
on postSet()
    if isSetup is false then
        setup()
    else
        set theToggle to "Connect"
        set theMenuTitle to "Server Helper"
        init()
    end if
end postSet

on changePref()

end changePref
on pref()
    set length1 to the length of usrPass
    set p1 to ""
    set p2 to ""
    repeat length1 times
        set p1 to "•"
        set p2 to p1 & p2
    end repeat
    display dialog "These are your following preferences. Click the " & quote & "Change" & quote & " to change.

Username: " & usrName & "
Password:  " & p2 & "

Prefered Protocol: " & usrProtocol buttons {"Back", "Change"}
    set theButton to the button returned of the result

    if theButton is "Change" then
        changePref()
    end if
end pref

on actionHandler:sender
    set aTag to tag of sender as integer
    set aTitle to title of sender as string

    if aTitle is not equal to "Quit" then
        current application's NSStatusBar's systemStatusBar()'s     removeStatusItem:aStatusItem
        if aTitle is "Connect" then
            set theToggle to "Disconnect"
            init()
        end if
        if aTitle is "Disconnect" then
            current application's NSStatusBar's systemStatusBar()'s     removeStatusItem:aStatusItem
            set theToggle to "Connect"
            init()
        end if

        if aTitle is "Preferences" then
            pref()
        end if

        if aTitle is "Change Password" then
            changePass()
        end if
    else
        current application's NSStatusBar's systemStatusBar()'s     removeStatusItem:aStatusItem
    end if
end actionHandler:
1 Answers

Update: doesn't work

YES!!!! I finally found the answer. You have to remove the property aStatusItem : missing value from the stop of the script. This will prevent aStatusItem from being used between functions. Because of this the menu bar won't be removed when you press quit. To fix that problem at the end change current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem to tell me to quit. This quits the application resulting in the menu bar item being removed.

Related