Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Alle Einträge in Records auf einmal ändenr

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pat_morita
•->
•->


Anmeldedatum: 17.03.2010
Beiträge: 10

BeitragVerfasst am: 17.03.2010 - 15:01    Titel: Alle Einträge in Records auf einmal ändenr Antworten mit Zitat

Hallo

ich habe folgenden Record (beispielhaft)

Code:

{Hans:false,Heinz:true,Laura:false}
--hunderte verschiedene Einträge mit Boolean im Record


und will im anschluss alles auf true haben:

Code:

{Hans:true,Heinz:true,Laura:true} -- ... usw


geht das auf einfache art und weise? wie komme ich an die einzelnen Einträge ran, item geht logischerweise nicht und die Namen sind alle unterschiedlich.

Jemand ne Idee?


Gruss
Pat
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 17.03.2010 - 22:38    Titel: Antworten mit Zitat

Der Tenor der Dokumentationen / Bücher zu appleScript sagt: Records sind keine Hashes. Records sind keine assoziativen Arrays. Wer mit Records arbeitet kennt die Feldnamen.

Die Frage ist nun: Warum haben Deine Felder Vornamen? Woher kommen die? Vielleicht findet sich da ein Ansatz, wie man das besser oder anders macht.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pat_morita
•->
•->


Anmeldedatum: 17.03.2010
Beiträge: 10

BeitragVerfasst am: 18.03.2010 - 09:29    Titel: Antworten mit Zitat

die felder sind nur beispielhaft. In der Software ist es ungefähr so:

Code:

set presets to {preset_soundso:false,preset_woganzanders:true .... etc}


und ich würd gerne alle presets mit einem Schlag resetten ohne sie einzeln ansprechen zu müssen... brauche diese Ansprechbarkeit aber um Sie leichter abzurufen/speichern zu können (in den user defaults)
Mist wenn das nicht geht...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hubionmac
•--->
•--->


Anmeldedatum: 26.02.2004
Beiträge: 245
Wohnort: Münster

BeitragVerfasst am: 18.03.2010 - 11:04    Titel: Antworten mit Zitat

Also Apple schreibt über Records:
Zitat:
You cannot refer to properties in records by numeric index. For example, the following object specifier, which uses the index reference form on a record, is not valid.


einen Absatz drunter werden aber gleich 2 Methoden Aufgezeigt, mit denen man die Länge eines Records bestimmen kann.

Arrow Dumm gelaufen würde ich mal sagen, schreib' doch mal sjobs@apple.com und unterstreiche wie inkonsequent so etwas ist.

Ein Workaround könnte auch folgender sein,

Zitat:
--value list für spezielle:
set_presets({{"preset_soundso", true}, {"preset_woganzanders", false}})
--oder einfach alle values alf false
set_presets({{"*", false}})


on set_presets(value_list)
   repeat with myvalues in value_list
      set mykey to item 1 of myvalues as text
      set myvalue to item 2 of myvalues as boolean
      
      
      -- ab hier beginnt die Schreibarbeit
      if mykey = "preset_soundso" or mykey = "*" then
         set preset_soundso to myvalue
      end if
      if mykey = "preset_woganzanders" or mykey = "*" then
         set preset_woganzanders to myvalue
      end if
      
   end repeat
end set_presets


Du baust Dir einfach eine 2-dimensionale Liste, die Zuordnung der Werte ist dann aber zumindest einmal eine Fleisaufgabe... das sollte wohl aber jetzt nicht unbedingt ein Problem sein, wenn die Anzahl der Felder nicht allzu groß ist.

Dabei fällt mir noch ein anderer möglich Pfusch ein. Du kannst mit


Zitat:
do shell script "osascript -e \"tell application \\\"Finder\\\" to get properties of startup disk\""
quasi über die Kommando-Zeile AppleScript ausführen, bekommst aber immer nur Strings zurück. Du gibst aber auch immer nur Strings in die Funktion ein, das heisst...:

nun man könnte diese etwas verschachtelte Idee weiter führen und sich über String-Manipulationen die gewünschte AppleScript-Code Zeile bauen. Ganz schön aufwendig und mindestens genau so viel Schreibarbeit.
_________________
hubionmac.com akzeptiere Paypal und Pizza
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pat_morita
•->
•->


Anmeldedatum: 17.03.2010
Beiträge: 10

BeitragVerfasst am: 18.03.2010 - 14:12    Titel: Antworten mit Zitat

Ja, über Liste geht das, das krieg ich auch hin, aber es sind wie gesagt hunderte Einträge. Und die jedesmal über das "Item XY" anzusprechen wird mir zuviel Texterei.

Schade, dann muss ich mir was ausdenken!

Danke dennoch!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 19.03.2010 - 09:49    Titel: Antworten mit Zitat

hubionmac hat Folgendes geschrieben:
Also
Zitat:
do shell script "osascript -e \"tell application \\\"Finder\\\" to get properties of startup disk\""
quasi über die Kommando-Zeile AppleScript ausführen, bekommst aber immer nur Strings zurück.

Das funktioniert nur dann, wenn das Objekt auch die Property "properties" kennt. Ansonsten: Dumm gelaufen.

Frage an den Ersteller: Du schreibst "In der Software sieht es so aus". Was ist das für Software? Woher hast Du den Source? Hast Du wirklich Zugriff auf den? Dann sollte das doch ziemlich einfach sein.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pat_morita
•->
•->


Anmeldedatum: 17.03.2010
Beiträge: 10

BeitragVerfasst am: 19.03.2010 - 11:36    Titel: Antworten mit Zitat

Den Source hab ich selber geschrieben. SInd aber mittlerweile so knapp 60.000 Zeilen verteilt auf dutzende Skripte.

Und ich kenne ja auch alle Labels, es sind nur so viele, das ich dachte, jemand hat ne Idee wie man alle labels eines Records auf einemal (oder mit ner repeat schleife o.ä.) einen Wert zuweisen kann ohne sie mit Namen anzusprechen.

In Applescript geht das imho nicht, aber vielleicht kann man ausweichen auf ne andere Sprache (die ich nicht kenne ^^)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 22.03.2010 - 23:55    Titel: Antworten mit Zitat

pat_morita hat Folgendes geschrieben:
In Applescript geht das imho nicht, aber vielleicht kann man ausweichen auf ne andere Sprache (die ich nicht kenne ^^)

Ich zitiere mal aus "AppleScript, the definitive Guide, Kapitel 13":
Zitat:
There is no built-in way to obtain a list of the names of the items of a record. A record has
no such introspective abilities. You (a human being) can see the names of the items of a
record in AppleScript's display of the record's value. But your code can't see this
information; the names of the items are not values of any kind, and cannot easily be turned
into values. I have seen many elaborate attempts to work around this problem, but I'm not
going to show you any of them. This is a big shortcoming of AppleScript itself, and it needs
to be fixed on the level of AppleScript itself. Until it is, you can get assistance from Late
Night Software's free List & Record Tools scripting addition.

_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 23.03.2010 - 20:36    Titel: Antworten mit Zitat

Hallo Pat,

so geht es:

Code:
set meinrecord to {Hans:true, Heinz:true, Laura:false, Clara:true, Janine:false, Vanessa:true}
set meinrecordtrue to my recordwertaendern(meinrecord, true)
set meinrecordfalse to my recordwertaendern(meinrecord, false)
return {meinrecordtrue, meinrecordfalse}

on recordwertaendern(derrecord, aufwas)
   set {temport, temport2, tempname} to {"~/Library/Preferences/hier.istnurmuelldrin.plist", "~/Library/Preferences/hier.istnurmuelldrin2.plist", "Temporaerer_Test"}
   tell application "System Events"
      set parent_dictionary to make new property list item with properties {kind:record}
      set this_plistfile to make new property list file with properties {contents:parent_dictionary, name:temport}
      make new property list item at end of property list items of contents of this_plistfile with properties {kind:record, name:tempname, value:derrecord}
      if aufwas is true then
         do shell script "sed 's+<false/>+<true/>+g' " & temport & " > " & temport2
      else
         do shell script "sed 's+<true/>+<false/>+g' " & temport & " > " & temport2
      end if
      return (get value of property list item tempname of contents of property list file temport2)
   end tell
end recordwertaendern


Das ist natürlich ein wenig um die Ecke gedacht, aber effektiv. Schon einmal hier im Forum habe ich so AS ein wenig überlistet, in diese Gedankenecke wollte ja auch Hubion diesmal vorstoßen. Damals die Methode findet sich hier, wenn Du mal nach reference suchst, läuft aber unter AS 2.0.1 (10.6) nicht mehr; daher ist das hier ein guter Weg.

Viel Spaß ;-)
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 23.03.2010 - 22:12    Titel: Antworten mit Zitat

Okay. Ich habe auch noch eine fiese Methode gefunden.

Der Trick hier ist, daß ich aus dem Record einen String mache. Das geht nicht? Oh doch!

Code:
set x to {Hans:true, |Heinz Georg|:true, Laura:false, Clara:true, Janine:false, Vanessa:"xxx", Kevin:":false", Cindy:":false:false:false"}

set x_as_string to to_String(x)
set x_replaced to replace(x_as_string, ":false", ":true")
set x to run script x_replaced

on to_String(the_record)
   try
      {a:0} as string
   on error cutoff
      set l to offset of "{" in cutoff
      set r to 3 - ((length of cutoff) - l)
   end try
   try
      the_record as string
   on error the_record
      set the_record to text l thru r of the_record
   end try
   return the_record -- as string
end to_String

to replace(a_string, old_c, new_c)
   set old_a to AppleScript's text item delimiters
   set AppleScript's text item delimiters to old_c
   set tempvar to text items of a_string
   set AppleScript's text item delimiters to new_c
   set tempvar to tempvar as string
   set AppleScript's text item delimiters to old_a
   return tempvar
end replace


Das ist natürlich absolut nicht zuverlässig, wie man am Beispiel "Kevin" und "Cindy" sieht.

Korrektur: Damit es auch mit anderen Sprachen klappt, mußte ich den Handler etwas ändern.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")


Zuletzt bearbeitet von Skeeve am 25.03.2010 - 23:49, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pat_morita
•->
•->


Anmeldedatum: 17.03.2010
Beiträge: 10

BeitragVerfasst am: 24.03.2010 - 11:32    Titel: Antworten mit Zitat

cool, so könnts gehen! gleich mal ausprobieren heut Abend!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 25.03.2010 - 23:49    Titel: Antworten mit Zitat

Damit es auch mit anderen Sprachen klappt, mußte ich den Handler etwas ändern.
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter