Forenindex » Programmierung/Entwicklung » AppleScript » eingabefeld

eingabefeld

Gast
Beiträge gesamt:

26. Nov 2003, 11:44
Bewertung:

gelesen: 6980

Beitrag als Lesezeichen
hallo hans,

wie lautet der befehl zum anzeigen eines eingabefeldes?
den text der eingabe moechte spaeter im script beim sichern verwenden; als docbasename.

schoenen tag

cu

hans

eingabefeld

Hans Haesler
  
Beiträge gesamt: 5826

26. Nov 2003, 13:10
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Hans(-Gerd?),

damit in einem Dialog ein Eingabefeld erscheint, muss die Befehlszeile die Worte 'default answer', gefolgt von zwei Anführungszeichen (= ein leerer String) enthalten.
Code
display dialog "Deine Eingabe:" default answer "" 

(N.B.: Man sollte in diesem Fall darauf verzichten, ein Icon anzuzeigen. Das ist nicht "Mac-like".)

Mit dem oben gezeigten Befehl erscheint die Textzeile (welche nach Belieben angepasst werden kann) und darunter eine leeres Eingabefeld (= der leere String) mit blinkendem Cursor.

Es gibt Fälle, in welchen man dem Anwender eine Eingabe vorschlägt, welcher er dann ändern oder mit "OK" bestätigen kann:
Code
display dialog "Randstilstärke:" default answer "0.5 pt" 

Jetzt erscheint in der Eingabezeile der ausgewählte Vorgabewert. Wenn man das Script ausführt und auf "OK" klickt, dann sieht man im Ergebnisfenster eine Liste mit zwei Elementen: --> {text returned:"0.5 pt", button returned:"OK"}

Das Übernehmen der Antwort geschieht am elegantesten mit folgender Syntax:
Code
set docbasename to text returned of (display dialog "Name eingeben:" default answer "") 

Damit enthält die Variable 'docbasename' schon den gewünschten Namen. Weil die buttons "Abbruch" und "OK" automatisch eingefügt werden, muss man sich nicht darum kümmern, was denn der 'button returned' nun war. Wenn der Anwender "OK" klickt, ist seine Eingabe in der Variablen, wenn er "Abbruch" gewählt hat, dann wird die Ausführung beendet.

Klar muss man das Ergebnis testen: Ist es kein leerer String? Ist der Name nicht zu lang? Enthält er kein verbotenes Zeichen?

Hans Haesler <hsa@ringier.ch>

eingabefeld

Anonym
Beiträge gesamt: 22827

27. Nov 2003, 01:00
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hi!

man ist ja auch schon mal gerne gast ;-)

danke fuer die prompte und hilfreiche antwort.

naechste woche werde ich mich naeher mit dem script beschaeftigen. es geht darum unsere hausfotografen in einer recht stupiden arbeit zu entlasten. fuer mich springt dabei im erfolgsfalle ein feines abendessen heraus ;-)

eventuell braeuchte ich dann nochmal deine hilfe, wenn es darum geht die files mit docbasename + indexnummerierung zu speichern. also name der datei = docbasename + nummer . ich werde das ganze wohl als droplet anlegen.

die ps-befehle werde ich wohl (hoffentlich) alleine hinbekommen ;-)


schlafet fein und traeumet suess und macht ins bettchen kein gemues (sorry, ist schon frueh &#133;)

cu

hans

eingabefeld

Anonym
Beiträge gesamt: 22827

28. Nov 2003, 23:06
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hallo hans,

ich habe mich heute abend mal daran probiert. das auslesen der antwort aus display dialog klappt prima, aber nun weiss ich nicht wie man die dateien in der "benamung" durchzaehlen kann.

die dateien sollen also folgenermassen gesichert werden:
name01
name02
name03 usw.

hier das bisherige script:

on open droppedfile
 
 set temp to display dialog "hallo michael! tu mal name:" default answer ""
 
 set outputFolder to choose folder
 set filesList to droppedfile
 repeat with aFile in filesList
   
  set fileIndex to 0
 
  tell application "Finder"
   set theFile to aFile as alias
   set theFileName to name of theFile
  end tell
 
  tell application "Adobe Photoshop 7.0"
   
   open theFile
   
   
   &laquo;event miscdosc&raquo; "dateiinfo"
   
   set docBaseName to text returned of temp
   set newFileName to (outputFolder as string) & docBaseName&fileindex+1
   save current document in file newFileName as JPEG appending lowercase extension
   close current document without saving
   
  end tell
 
 end repeat
 
end open

- - - - - -

fileindex+1 schreibt natuerlich immer nur name1 &#133;


wenn ich die dateien beim oeffnen durchzaehlen koennte, dann waere es mir ja schon moeglich eine variable zu setzen.

geht das irgendwie?

cu

hans-gerd

eingabefeld

Hans Haesler
  
Beiträge gesamt: 5826

29. Nov 2003, 00:21
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Hans-Gerd,

ja, das geht. Zunächst aber zwei wichtige Korrekturen:
1) 'droppedfile' ist schon eine Liste von Aliassen. Man braucht also die Variablen 'filesList' nicht und statt 'theFile' zu öffnen, kann man 'aFile' benutzen.
2) Wie schon gesagt, 'aFile' ist ein Alias und muss nicht in ein solches verwandelt werden. Der Finder kann also mit einem (effizienteren) Einzeiler eingesetzt werden.

Eine weitere Vereinfachung: die Variable 'docBaseName' direkt mit der Eingabe des Anwenders füttern.

Zur Numerierung: Am einfachsten wäre, die automatische Zählervariable, z.B. 'repeat with i from 1 to ...' zu benutzen. Denn diese wird automatisch bei jedem Umgang um eins erhöht. Die führende Null kann man leicht einfügen, indem getestet wird, ob der Zähler einstellig ist oder nicht: 'if i < 10 then...'. Aber es geht auch einfacher. Siehe weiter unten.

Weil Du aber mit 'aFile' die Liste durchgehst, muss man einen zusätzlichen Zähler einrichten. Der Ansatz ist mit 'fileIndex' schon da. Und auch das Erhöhen des Wertes mit '+1'. Allerdings nicht komplett. Und an der falschen Stelle. Deshalb folgende zwei Korrekturen:
1) 'set fileIndex to 1' --> bei Eins beginnen
2) 'set fileIndex to fileIndex + 1' --> vor dem 'end repeat' einfügen.

Und wie kommt die Null dazwischen? So: '... & text -2 thru -1 of ("0" & fileIndex)'

Alles klar? Nicht ganz. Also &#133; die "0" und der Wert von 'fileIndex' wird zu einem String zusammengefasst. Davon nimmt man den Text ab zweitletztem Buchstaben (= -2) bis (= thru) zum letzten Buchstaben (= -1). Von "01" bis "09": kein Problem. Aber auch mit "010", "011" usw. funktioniert diese Formulierung. Ohne Test von wegen Wert. Dass die Null ab '10' "umsonst" vorgehängt wird, tut nicht weh.

Hier die angesprochenen Zeilen im Zusammenhang (aber ich habe das Script ausnahmsweise nicht getestet):
---
on open droppedfile
set docBaseName to text returned of (display dialog "hallo michael! tu mal name:" default answer "")
set outputFolder to choose folder

repeat with aFile in droppedfile
set fileIndex to 1
tell application "Finder" to set fileName to name of aFile

tell application "Adobe Photoshop 7.0"
open aFile
&laquo;event miscdosc&raquo; "dateiinfo"
set newFileName to (outputFolder as string) & docBaseName & text -2 thru -1 of ("0" & fileIndex)
save current document in file newFileName as JPEG appending lowercase extension
close current document without saving
end tell

set fileIndex to fileIndex + 1

end repeat
end open
Code
Dabei ist mir nicht klar, weshalb der Name der Datei festgestellt wird. Sollte dieser nicht noch eingefügt werden? Zum Beispiel so: 

set newFileName to (outputFolder as string) & docBaseName & fileName & text -2 thru -1 of ("0" & fileIndex)
Code
Oder auch &#133; 

set newFileName to (outputFolder as string) & docBaseName & "_" & fileName & "_" & text -2 thru -1 of ("0" & fileIndex)
---
&#133; damit der neue Name etwas lesbarer wird.

Hans Haesler <hsa@ringier.ch>

eingabefeld

Anonym
Beiträge gesamt: 22827

29. Nov 2003, 15:18
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
ich kann's grad nicht testen, aber ich bin mir relativ sicher das es funzt.

vielleicht verstehe ich sogar noch wie das funktioniert ;-)


also danke!!!


by the way:
zu thefile aus einem samplescript von adobe:

tell application "Finder"
  -- The step below is important because the 'aFile' reference as returned by
  -- Finder associates the file with Finder and not Photoshop. By converting
  -- the reference below 'as alias', the reference used by 'open' will be
  -- correctly handled by Photoshop rather than Finder.
  set theFile to aFile as alias
  set theFileName to name of theFile
 end tell

cu

hans-gerd

eingabefeld

Anonym
Beiträge gesamt: 22827

29. Nov 2003, 17:22
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hallo hans,

das zaehlen funktioniert nicht. es wird immer noch eine datei mit dem namen01 abgelegt und dann von den folgenden files ersetzt.

???

cu

hans-gerd

eingabefeld

Hans Haesler
  
Beiträge gesamt: 5826

30. Nov 2003, 19:06
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Hans-Gerd,

das verstehe ich nicht. Bitte sende mir doch das Script, welches nicht zählen kann.

Natürlich fängt die vorgeschlagene Version bei jeder Ausführung bei 1 an. Aber wenn fünf Dateien darauf gezogen werden, dann sollten sie mit den Nummern 01 bis 05 versehen werden.  Wenn beim nächsten Ausführen mit der Nummer 06 fortgefahren werden sollte, dann muss man die Variable 'fileIndex' zu Beginn des Scripts als 'property' deklarieren und zugleich initialisieren:
Code
property fileIndex : 1 

Damit wird erreicht, dass der aktuelle Wert gespeichert wird. Und bei der nächsten Ausführung unter gleichem 'database'-Namen werden bestehende Dateien nicht überschrieben. Aber nochmals: wenn das Script innerhalb der Repeat-Schleife die Zeile 'set fileIndex to fileIndex + 1' enthält, dann sollten während der gleichen Session die Dateien, welche die gleiche Wurzel haben, nicht überschrieben werden.

Hans Haesler <hsa@ringier.ch>

eingabefeld

Anonym
Beiträge gesamt: 22827

1. Dez 2003, 09:35
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hallo hans,

ich habe einfach dein obiges script ohne aenderung kopiert und als programm abgelegt. ich hab's auf zwei rechnern probiert; einmal mit as 1.6 und einmal mit 1.8x.

????

schoenen wochenanfang!

cu

hans-gerd

eingabefeld

Hans Haesler
  
Beiträge gesamt: 5826

1. Dez 2003, 12:49
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Hans-Gerd,

ja, natürlich! Jetzt sehe ich es: das kann nicht funktionieren. Beim Ändern Deines Scripts habe ich die Initialisierung von 'fileIndex' am ursprünglichen Platz belassen. Diese Zeile muss ausserhalb der Repeatschleife stehen. So &#133;
---
set fileIndex to 1
repeat with aFile in droppedfile
---
&#133; sonst wird der Wert bei jedem Umgang wieder auf '1' gesetzt.

Ich habe zwar darauf hingewiesen, dass ich das ganze Script nicht getestet habe. Trotzdem: entschuldige bitte die Fehlinformation.

Hans Haesler <hsa@ringier.ch>

eingabefeld

Anonym
Beiträge gesamt: 22827

2. Dez 2003, 00:38
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hallo hans,


vielen, vielen, vielen dank fuer deinen einsatz.

cu

hans-gerd

eingabefeld

Anonym
Beiträge gesamt: 22827

3. Dez 2003, 09:26
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
hallo hans,


leider koennen unsere fotografen nur auf ps 5.5 zurueckgreifen (haet ich vielleicht mal vorher abklaeren sollen ;-)). das bedeuted, das die umbennenung der files schon im finder geschehen muss.

wie immer: mein versuch funktioniert nicht


on open droppedfile
 set fileIndex to 1
 
 set docBaseName to text returned of (display dialog "hallo michael! tu mal name:" default answer "") & text -2 thru -1 of ("0" & fileIndex)
 set outputFolder to choose folder
 
 repeat with aFile in droppedfile
  tell application "Finder" to duplicate file aFile to outputFolder with replacing
  set name of selection to (docBaseName as string) & ".jpg"
 
  ...
 
 
 
 
  set fileIndex to fileIndex + 1
 
 end repeat
end open




erwartungsvoll

hans-gerd

eingabefeld

Hans Haesler
  
Beiträge gesamt: 5826

3. Dez 2003, 11:09
Bewertung:

gelesen: 6979

Beitrag als Lesezeichen
Hallo Hans-Gerd,

nicht verzagen! Das kriegen wir schon hin. Zwei Probleme:
1) Das Durchnumerieren ist ausserhalb der Repeat-Schleife.
2) 'name of selection' kann nicht funktionieren, weil alle Dateien ausgewählt sind.

Es gibt drei Möglichkeiten:
A) Die Dateien umbenennen und in den Zielordner verschieben.
B) Die Dateien umbenennen und in den Zielordner kopieren.
C) Die Dateien in den Zielordner kopieren und erst dann umbenennen.

A und B sind einfach. C auch &#133; aber nur wenn man den Wert von 'fileIndex' zur Identifikation nehmen kann, das heisst, wenn die Aktion nur ein einziges Mal mit dem gleichen Zielordner ausgeführt wird (oder er würde geleert). Sonst muss man den Namen der Datei speichern, damit man sie im Zielordner identifizieren kann

Hier schon mal der Code für die Lösung B:
---
on open droppedfile
  set docBaseName to text returned of (display dialog "hallo michael! tu mal name:" default answer "")
  set outputFolder to choose folder
  set fileIndex to 1
 
  repeat with aFile in droppedfile
    set newName to docBaseName & text -2 thru -1 of ("0" & fileIndex) & ".jpg"
    tell application "Finder" to set name of file aFile to newName
    tell application "Finder" to move file aFile to outputFolder with replacing
    set fileIndex to fileIndex + 1
  end repeat
 
end open
---
Zum Duplizieren ganz einfach 'move' durch 'duplicate' ersetzen.
Und so sieht die Lösung C aus, mit dem Speichern des alten Namens:
---
on open droppedfile
  set fileIndex to 1
 
  set docBaseName to text returned of (display dialog &not;
    "hallo michael! tu mal name:" default answer "")
  set outputFolder to choose folder
 
  repeat with aFile in droppedfile
    tell application "Finder" to set fileName to name of file aFile
    tell application "Finder" to duplicate file aFile to outputFolder with replacing
    set newName to docBaseName & text -2 thru -1 of ("0" & fileIndex) & ".jpg"
    tell application "Finder" to set name of file fileName of outputFolder to newName
    set fileIndex to fileIndex + 1
  end repeat
 
end open
---

Ich habe den Zwischenschritt 'set newName &#133;' mit der Zusammensetzung (= concatenation) des neuen Names eingefügt. Dadurch wird die Befehlszeile kürzer und der geplagte Finder hat es etwas einfacher.

Hans Haesler <hsa@ringier.ch>