[GastForen Programmierung/Entwicklung AppleScript Wie Springe ich ??

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Wie Springe ich ??

michael m.
Beiträge gesamt: 162

4. Mär 2011, 12:39
Beitrag # 1 von 8
Bewertung:
(4444 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich würde gerne wissen wie ich Springe.
Code
-- wie Springe ich ?? 

main()

on main()
-- Anfang
display dialog " das ist jetzt der Anfang vom Script" buttons {"weiter"} default button 1
set varA to "001"
set varB to "AABB"
datenAnzeigen(varA, varB)
display dialog "jetzt geht es weiter"
end main


-- Handler --

on datenAnzeigen(varA, varB)
display dialog "Variable A = " & varA & return & "Variable B = " & varB buttons ¬
{"Abbrechen", "Speichern"} default button 1
if button returned of result = "Abbrechen" then
-- zurück zum Anfang im Hauptscript
main()

else if button returned of result = "Speichern" then
-- weiter im Hauptscript
end if
end datenAnzeigen


Wenn Abbrechen geklickt wird, soll main() wieder von vorne ausgeführt werden.

Wenn ich auf Speichern klicke, wird das Script wie gewünscht weitergeführt.

Vielen Dank

Michael
X

Wie Springe ich ??

Hans Haesler
  
Beiträge gesamt: 5822

4. Mär 2011, 14:06
Beitrag # 2 von 8
Beitrag ID: #466269
Bewertung:
(4432 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ein Klick auf den Button "Abbrechen" führt in einem deutschen Umfeld zum Abbruch der Ausführung.

Der Test ...

Code
if button returned of result = "Abbrechen" then 

... hat keine Chance, durchgeführt zu werden.

Wenn man den Klick abfangen will, damit nachher weitere Aktionen ausgeführt werden können (z.B. Aufräumen oder Wiederherstellen der Ausgangslage) dann gibt es einen Trick: Den Button-Text mit Leerschlägen einrahmen. Dadurch wird die sofortige Abbruch-Wirkung aufgehoben.

Code
display dialog "Variable A = " & varA & return & "Variable B = " & varB buttons ¬ 
{" Abbrechen ", "Speichern"} default button 1
if button returned of result = " Abbrechen " then

Abgesehen davon, sollte result vermieden werden. Das ist ein flüchtiger Zustand, der nur einmal konsultiert werden kann. Dann ist das Ergebnis weg. Dazu kommt, dass für jeden Test mit "button returned of result" das Ergebnis erneut verlangt werden muss.

Besser ist, das Ergebnis in eine Variable zu geben:

Code
main() 

on main()
-- Anfang
display dialog " das ist jetzt der Anfang vom Script" buttons {"weiter"} default button 1
set varA to "001"
set varB to "AABB"
datenAnzeigen(varA, varB)
display dialog "jetzt geht es weiter"
end main

-- Handler --

on datenAnzeigen(varA, varB)
set bR to button returned of (display dialog "Variable A = " & varA & return & "Variable B = " & varB buttons ¬
{" Abbrechen ", "Speichern"} default button 1)
if bR is " Abbrechen " then
-- zurück zum Anfang im Hauptscript
main()
else if bR is "Speichern" then
-- weiter im Hauptscript
return
end if
end datenAnzeigen

Gruss, Hans


als Antwort auf: [#466252]
(Dieser Beitrag wurde von Hans Haesler am 4. Mär 2011, 22:44 geändert)

Wie Springe ich ??

michael m.
Beiträge gesamt: 162

4. Mär 2011, 15:41
Beitrag # 3 von 8
Beitrag ID: #466287
Bewertung:
(4408 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank, dann hatte das mit der mai() Routine doch seine Richtigkeit und das Problem lag nur an der Button Geschichte.

Ich werde solche Abfragen in Zukunft über eine Variable machen.

Ich habe bisher immer mit result gearbeitet, aber mann sieht ja was dabei heraus kommt.

Wofür ist denn dann result geeignet?

Viele Grüsse
Michael


als Antwort auf: [#466269]

Wie Springe ich ??

Hans Haesler
  
Beiträge gesamt: 5822

4. Mär 2011, 16:02
Beitrag # 4 von 8
Beitrag ID: #466292
Bewertung:
(4405 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

bitteschön.

Das vorliegende Beispiel funktioniert auf beide Arten.

Der kleine Unterschied: Wenn das Ergebnis direkt in eine Variable gegeben wird, geschieht das nur einmal. Und in der Folge kann man den Wert der Variablen testen.

Beim Verwenden von result muss bei jedem Test erneut der Wert verlangt werden.

Die Ausführung wird dabei nicht messbar verlangsamt. Aber es ist besserer Stil, wenn mehrmaliges Wiederholen vermieden wird. Wenn man sich das für kleine Dinge angewöhnt, wird es sich lohnen, wenn man es konsequent auch im Grossen umsetzt.

result kann geeignet sein, um ein Ergebnis zu holen und dann sofort etwas damit zu machen. Ohne vorherigen Test. Und wenn, dann nur einen einfachen if/else/end. Beispiel ohne Wert:

Code
set x to 12 
if result is greater than 10 then
-- mach dies
display dialog "Grösser als 10"
else
-- mach das
display dialog "Gleich oder kleiner als 10"
end if

Gruss, Hans


als Antwort auf: [#466287]

Wie Springe ich ??

michael m.
Beiträge gesamt: 162

4. Mär 2011, 17:09
Beitrag # 5 von 8
Beitrag ID: #466300
Bewertung:
(4387 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank.
Ich bin mit meinem neuen Skript fast fertig.
Die neue Programmierstruktur ist wirklich sehr übersichtlich.
Es fällt mir noch leichter die Fehler zu finden und die Erweiterbarkeit ist sehr einfach. Ich sende es Dir zu sobald es fertig ist.

Ich habe es auch schon erweitert, indem es nicht nur für PDF zugeschnitten ist, sondern auch für andere Dokumente. Es wird auch ebenfalls an eine Datenbank angebunden werden. Es besitzt auch einen StichwortTransformer und es werden mir noch jede Mende Funktionen einfallen, die ich nun Problemlos implementieren kann.

Viele Grüsse
Michael


als Antwort auf: [#466292]

Wie Springe ich ??

Hans Haesler
  
Beiträge gesamt: 5822

4. Mär 2011, 20:09
Beitrag # 6 von 8
Beitrag ID: #466312
Bewertung:
(4360 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

bitteschön. Gut zu hören, dass die neue Struktur die Arbeit erleichtert.

Die PDFs werden ja ziemlich einfach an der Endung ".pdf" erkannt und der Inhalt kann mit "Skim" ausgezogen werden. Textdateien haben die Endung ".txt". Werden diese mit "TextEdit" geöffnet? Aber was ist mit Dokumenten wie ".eps", ".psd", ".qxp" oder ".indd"? Kommen nicht vor? Dann ist ja alles gut.

Ab morgen werde ich für eine Woche abwesend sein: Ski-Urlaub! :-)

Deshalb wird eine Antwort etwas länger auf sich warten lassen, obwohl mein E-Mail-Konto ab Dienstag endlich wieder aktiv sein wird.

Gruss, Hans


als Antwort auf: [#466300]

Wie Springe ich ??

michael m.
Beiträge gesamt: 162

5. Mär 2011, 23:58
Beitrag # 7 von 8
Beitrag ID: #466351
Bewertung:
(4275 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich bin dabei mein Skript neu zu Strukturieren und habe dazu eine Frage bezüglich von Variablen und Handler.

Wenn ich das Startscript so schreibe, dann funktioniert es gut.

Code
set hauptOrdner to "Macintosh HD:Users:michael:Desktop" 
set quellOrdner to hauptOrdner & ":" & "quelle"
set zielOrdner to hauptOrdner & ":" & "ziel"
set prefEinstellung to hauptOrdner & ":" & "Einstellungen"

-- schreiben der Liste mit allen Dokumenten im Verzeichnis (ohne unsichtbare Dateien)
set alleDokumente to list folder quellOrdner without invisibles

-- Ermittlung der Anzahl Dokumente
set dokumentAnzahl to count of alleDokumente

-- Schleife Dokumentenmanipulation
repeat with dokumentSchleife from 1 to dokumentAnzahl

-- Speichert das erste Dokument von alleDokumente in die Variable aktueller Name
set aktuellerName to (item dokumentSchleife of my alleDokumente)

end repeat


Wenn ich aber jetzt den Handler ins Spiel Bringe bekomme ich einen Fehler, der lautet

Zitat AppleScript-Fehler
alleDokumente kann nicht in Typ reference umgewandelt werden.

Code
set hauptOrdner to "Macintosh HD:Users:michael:Desktop" 
set quellOrdner to hauptOrdner & ":" & "quelle"
set zielOrdner to hauptOrdner & ":" & "ziel"
set prefEinstellung to hauptOrdner & ":" & "Einstellungen"

main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)

on main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)

-- schreiben der Liste mit allen Dokumenten im Verzeichnis (ohne unsichtbare Dateien)
set alleDokumente to list folder quellOrdner without invisibles

-- Ermittlung der Anzahl Dokumente
set dokumentAnzahl to count of alleDokumente

-- Schleife Dokumentenmanipulation
repeat with dokumentSchleife from 1 to dokumentAnzahl

-- Speichert das erste Dokument von alleDokumente in die Variable aktueller Name
set aktuellerName to (item dokumentSchleife of my alleDokumente)

end repeat
end main


Alle Variablen wurden durchgeschliffen das heisst, das alle Informationen verfügbar sind.

In diesem müsste nur das erste Dokument als Ergebnis zurückgemeldet werden.

Das Skript funktioniert erst wenn die ich Variable global setze.
Zitat alleDokumente


Code
global alleDokumente 

set hauptOrdner to "Macintosh HD:Users:michael:Desktop"
set quellOrdner to hauptOrdner & ":" & "quelle"
set zielOrdner to hauptOrdner & ":" & "ziel"
set prefEinstellung to hauptOrdner & ":" & "Einstellungen"

main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)

on main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)
-- schreiben der Liste mit allen Dokumenten im Verzeichnis (ohne unsichtbare Dateien)
set alleDokumente to list folder quellOrdner without invisibles

-- Ermittlung der Anzahl Dokumente
set dokumentAnzahl to count of alleDokumente

-- Schleife Dokumentenmanipulation
repeat with dokumentSchleife from 1 to dokumentAnzahl

-- Speichert das erste Dokument von alleDokumente in die Variable aktueller Name
set aktuellerName to (item dokumentSchleife of my alleDokumente)

end repeat
end main


Warum funktioniert es nur wenn die Variable "alleDokumente"
global gesetzt wurde??

Vielen Dank
Michael


als Antwort auf: [#466312]
(Dieser Beitrag wurde von michael m. am 6. Mär 2011, 00:16 geändert)

Wie Springe ich ??

masterkey
Beiträge gesamt:

9. Mär 2011, 09:52
Beitrag # 8 von 8
Beitrag ID: #466543
Bewertung:
(4184 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
so gehts bei mir auch ohne globale variable...

Code
set hauptOrdner to "Macintosh HD:Users:michael:Desktop" 
set quellOrdner to hauptOrdner & ":" & "quelle"
set zielOrdner to hauptOrdner & ":" & "ziel"
set prefEinstellung to hauptOrdner & ":" & "Einstellungen"

main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)

on main(hauptOrdner, quellOrdner, zielOrdner, prefEinstellung)
-- schreiben der Liste mit allen Dokumenten im Verzeichnis (ohne unsichtbare Dateien)
set alleDokumente to list folder quellOrdner without invisibles

-- Schleife Dokumentenmanipulation
repeat with dokumentSchleife in alleDokumente

-- XXX Speichert das erste Dokument von alleDokumente in die Variable aktueller Name
-- setzt die variable aktuellerName jeweils auf den filenamen. am ende des skripts enthält die variable den namen der letzten datei im ordner.
set aktuellerName to dokumentSchleife as text

end repeat
end main



viel spass!


als Antwort auf: [#466351]
X