Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Repeat med property ger exit för sent

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2008-05-12 14:54

Svår att rubriksätta...

Jag vill slänga upp en fråga med textsvar och två möjliga knappar (exkl Avbryt). Vald knapp ska bli default button. Frågan repeteras tills svaret är nåt annat än "". Men när man i skriptet svarar så hoppar det över svaret nästa gång och gör det förra svaret till svar.

Jag vet varför det blir så här, men inte hur man undviker att skriptet tar det gamla svaret utan att man förlorar repeat while myAnswer is "", typ.

Kommenterar man bort "Rad 1", "Rad 2" och "Rad 3" så fungerar det som jag vill fast utan repeatloopen och man får därmed en risk att myAnswer blir "".

property myAnswer : ""
property myAnswerDefaultButton : 2

repeat until myAnswer is not "" -- Rad 1
	set myQuestionResult to display dialog "Här är frågan." & return & "Vilken text vill du mata in?" default answer myAnswer buttons {"Avbryt", "Inget", "Ersätt"} default button myAnswerDefaultButton cancel button 1
	if button returned of myQuestionResult is "Inget" then exit repeat -- Rad 2
	set myAnswer to text returned of myQuestionResult
end repeat -- Rad 3

-- set myAnswer to text returned of myQuestionResult
set myAnswerButton to button returned of myQuestionResult
if myAnswerButton is "Ersätt" then
	set myAnswerDefaultButton to 3
else if myAnswerButton is "Inget" then
	set myAnswerDefaultButton to 2
	set myAnswer to ""
end if

Jag tror du blir tvungen att ha en temporär variabel också, annars hoppar den (som du säkert vet) inte in i repeaten eftersom myAnswer lever kvar...

Det här borde funka ( och nu får du berätta för mig hur man skapar kodblock )

property myAnswer : ""
property myAnswerDefaultButton : 2

set myCurrentAnswer to ""
repeat until myCurrentAnswer is not "" -- Rad 1
set myQuestionResult to display dialog "Här är frågan." & return & "Vilken text vill du mata in?" default answer myAnswer buttons {"Avbryt", "Inget", "Ersätt"} default button myAnswerDefaultButton cancel button 1
if button returned of myQuestionResult is "Inget" then exit repeat -- Rad 2
set myCurrentAnswer to text returned of myQuestionResult
set myAnswer to myCurrentAnswer
end repeat -- Rad 3

-- set myAnswer to text returned of myQuestionResult
set myAnswerButton to button returned of myQuestionResult
if myAnswerButton is "Ersätt" then
set myAnswerDefaultButton to 3
else if myAnswerButton is "Inget" then
set myAnswerDefaultButton to 2
set myAnswer to ""
end if

  • Medlem
  • 2008-06-10 21:58
Ursprungligen av tompamac:

Det här borde funka ( och nu får du berätta för mig hur man skapar kodblock )

Bang on target, pal! Exakt vad jag var ute efter!

Richard, kör båda varianterna och försök identifiera skillnaden om ditt klena intellekt mäkter med den utmaningen...

Tompa, för att kodkoda skriver du
(code)
kod
(/code)
fast med [ resp ] istf ( och ).

Tack!

Nu har jag läst frågan åtminstone 15 gånger och jag kan fortfarande inte fatta vad du vill uppnå.

Kan du förklara på en sjuårings nivå, så att jag kan förstå, så ska vi säkert kunna lösa det också

Mitt klena intellekt strävar efter att reducera saker, och därför har jag kortat ner det lite, men såvitt jag ser gör det samma sak

property myAnswer : ""
property myAnswerDefaultButton : "Inget"

set myCurrentAnswer to ""
repeat while myCurrentAnswer = ""
	set myQuestionResult to display dialog "Här är frågan." & return & "Vilken text vill du mata in?" default answer myAnswer buttons {"Avbryt", "Inget", "Ersätt"} default button myAnswerDefaultButton cancel button 1
	if button returned of myQuestionResult is "Inget" then exit repeat -- Rad 2
	set myCurrentAnswer to text returned of myQuestionResult
	set myAnswer to myCurrentAnswer
end repeat

Ett annat rätt vanligt sätt att lösa den här sortens saker på är genom en "rekursiv" funktion, dvs en funktion (handler) som anropar sig själv, såhär:

property myAnswer : ""
property myAnswerDefaultButton : "Inget"

my doDisplayDialog()

on doDisplayDialog()
	set myQuestionResult to display dialog "Här är frågan." & return & "Vilken text vill du mata in?" default answer myAnswer buttons {"Avbryt", "Inget", "Ersätt"} default button myAnswerDefaultButton
	set myAnswer to text returned of myQuestionResult
	set myAnswerDefaultButton to button returned of myQuestionResult
	if myAnswerDefaultButton = "Ersätt" and myAnswer = "" then my doDisplayDialog()
end doDisplayDialog

Sättet som det funkar på är att man anropar funktionen "manuellt" första gången, men därefter utvärderar funktionen svaren och om det behövs anropar den sig själv

  • Medlem
  • 2008-06-11 07:33

Det var snitsigare. Jag kan lägga till knappdefaultbytet själv...

edit: i den andra varianten fungerar det helt och hållet.

Jag missade bytet i den första varianten. Det som kan vara bra att veta är att du kan ange default-knapp antingen genom index (1,2 eller 3) eller genom knappens text (Avbryt, Inget, Ersätt)

1
Bevaka tråden