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

Bibliotheken (Libraries) oder Segmentierung von Scripten

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


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 03.11.2005 - 17:05    Titel: Bibliotheken (Libraries) oder Segmentierung von Scripten Antworten mit Zitat

Hallo,

nun will ich auch mal wieder ein Thema eröffnen und hoffe, dass sich vielleicht ein langer Gesprächsfaden mit einer Fülle an kleinen Bibliotheken entwickelt Wink

Segmentierung von Scripten - die AppleScripter, welche länger dabei sind, werden sich noch gut an die Grenze 32 kB erinnern - so "schwer" durfte eine Scriptdatei mit Apple's ScriptEditor werden - Smile gab's noch nicht und ob sich LateNights ScriptDebugger in Vers. 1.x darauf verstand, weiß ich nicht mehr (ja, den hatte ich vor vielen Jahren mal teuer gekauft (Vers 1.5?)). Für viele Projekte waren die 32 kB ausreichend, aber bei sehr komplexen Scripten mit vielen beteiligten Programmen stieß man doch an die Grenze. Eine Lösung war es, Teile des Scriptes in Bibliotheken auszulagern und diese dann zur Laufzeit in eine Variable (bzw. Property) zu laden. Diese Technik ist heute nicht mehr unbedingt notwendig, aber nach wie vor, vor allem in komplexen Projekten, höchst interessant! Zum Einen kann das "Hauptscript" kürzer und damit meist übersichtlicher ausfallen zum Anderen kann, genügend Abstraktion vorausgesetzt, ein Code-Reycycling in weiteren Projekten stattfinden.

Ich will jetzt aber nicht weiter theoretisieren, mittels praktischen Beispielen soll der Ansatz verdeutlicht werden.

Zuallererst brauchen wir einen Ordner, welcher die Bibliotheken aufnehmen kann. Ich habe dazu einen passenden Speicherort gewählt: '~/Library/Meine_AS_Libraries/'
In diesen Ordner kopiere ich meine 2 Beispiel-Libraries, "Log_Lib.scpt" und "FormatNumber_Lib.scpt" (Code siehe weiter unten) mit denen das Vorgehen demonstriert wird.

Dann wird das Hauptscript (bzw. Projektscript) benötigt. Das ist allerdings schon ein Grundgerüst für Projekte und kann anhand der Kommentare durchaus nachvollzogen werden.

-- ============================Signatur: Dieses Projekt===============================
-- Kann in eine Log-Datei übernommen werden
property thePSignatur : "Konzept.scpt 1.0.0De" -- (©2005 Folker Brandt)

-- =============================Standard alle Projekte===============================
-- Mindest-Anforderung an die verwendete AppleScript-Version, zutreffendes auskommentieren
-- für OS X 10.3.x
(* property thePascv : 17826195
property thePASVersTxt : "1.9.3"
*)

-- für OS X 10.4.x
property thePascv : 17826208
property thePASVersTxt : "1.10"

-- Script_Lib Dateinamen: Folgende Script-Dateien (Bibliotheken) werden in globale Variablen geladen!
property thePObjNames : {"Log_Lib.scpt", "FormatNumber_Lib.scpt"}

-- Zu finden im Unterordner "Name" von '~/Library/'
property thePLibFolder : "Meine_AS_Libraries"
-- =========================================================================

on run -- Doppelklick
   try
      init_me()
      do_Job({})
   on error errmsg number errnum
      fatal_StdError(errmsg, errnum)
   end try
end run

(*
on open thePathList -- Drag und Drop, nur Droplets
   try
      init_me()
      do_Job(theDropList)
   on error errmsg number errnum
      fatal_StdError(errmsg, errnum)
   end try
end open
*)

-- Logfile starten, Error-Handling 2. Ebene
on do_Job(theList)
   global theGInitDT
   global theG_LogL, theG_FormatL
   try
      -- Einen Projektordner festlegen, hier der Desktop Folder des Users
      set theProjFold to (path to desktop folder from user domain)
      -- Logfile anlegen
      theG_LogL's start_log((theProjFold as string) & "Log_Testdatei" & ".txt", thePSignatur, time string of theGInitDT)
      
      -- Einen Testeintrag schreiben: theG_LogL's write_log(Text), wobei der Text wie folgt aufgebeaut ist:
      -- Eine Nummer, z.B. Fehlernummer & tab & Meldung
      theG_LogL's write_log(0 & tab & "Dies ist ein Test - die 0 vor dem Tabulator (tab) zeigt an: Fehlernummer 0!")
      
      -- Nun wollen wir Zahlen formatieren und zwar folgende:
      set theL to {1.234567891234E+8, "1234567891234,5049901", 43.5, "44,90", 0.005234567893, 1.2E+8}
      
      -- Welche Library benützen wir fürs Zahlen formatieren?
      theG_LogL's write_log(0 & tab & "Benutzte Library: " & theG_FormatL's thePSignatur)
      
      -- Folgende Einstellungen wären möglich, aber erstmal nutzen wir die Default-Einstellungen
      --==========MÖGLICHE EINSTELLUNGEN DER LIBRARY "FormatNumber_Lib.scpt"=============
      --set theG_FormatL's thePDecSep to "." -- Dezimal-Separator, Default = ","
      --set theG_FormatL's thePTsdSep to ", " -- Tausender-Separator Default = "."
      --set theG_FormatL's thePX to 5 -- Erzwungende MINDEST-Stellen vor dem Komma, Default = 1
      --set theG_FormatL's thePY to 5 -- MAXIMAL-Stellen nach dem Komma, Default = 2
      --set theG_FormatL's thePCurrPlace to 1 -- Währung: -1, 0, 1 -> vor Zahl, ohne Symbol, nach Zahl, Default = -1
      --set theG_FormatL's theCurrSym to "$" -- Währungssymbol, Default = "€"
      --set theG_FormatL's thePSpace to " " -- Abstand zwischen Zahl und Währung, Default = " " (Space)
      
      -- oder alles auf einmal einstellen
      (*set {theG_FormatL's thePDecSep, theG_FormatL's thePTsdSep, theG_FormatL's thePX, ¬
   theG_FormatL's thePY, theG_FormatL's thePCurrency, theG_FormatL's theCurrSym, theG_FormatL's thePSpace} to ¬
   {",", ".", 1, 2, 1, "DM", " "}
*)
      
      -- aber nun wird tatsächlich formatiert, Ergebnisse finden sich in der Log-Datei auf dem Desktop
      repeat with i in theL
         set temp to theG_FormatL's get_formatNumber(i)
         theG_LogL's write_log(0 & tab & temp)
      end repeat
      
      
      -- Ein Fehlertest, nicht erschrecken, dient nur zu Demonstrationszwecken
      error "Dies ist ein provozierter Unsinnsfehler" number -31960
      
      -- Logfile schließen
      theG_LogL's stop_log(theGInitDT)
   on error errmsg number errnum
      try
         --Fehler wenn möglich in Log-Datei schreiben
         theG_LogL's write_log((errnum as string) & tab & errmsg)
      end try
      try
         -- Log-Datei versuchen zu schließen
         theG_LogL's stop_log(theGInitDT)
      end try
      -- Fehler an Error-Handling 1. Ebene weiterleiten
      error errmsg number errnum
   end try
end do_Job

-- =============================Projekt Initialisieren===============================
-- Standard-Prozedur am Beginn von 'run' und 'open' Handler
on init_me()
   global theGInitDT -- Globale Startzeit des Scriptes
   copy (current date) to theGInitDT -- belegen
   
   -- Text Delimiter auf Normalwert zwingen
   set AppleScript's text item delimiters to {""}
   
   -- AppleScript-Versionscheck, Script gegebenenfalls abbrechen!
   if not ((system attribute "ascv") >= thePascv) ¬
      then error (("Dieses Programm benötigt AppleScript Version " & thePASVersTxt & " oder höher!")) number -1728
   
   -- Globale Script-Libraries initialisieren (also laden!)
   init_GlobalLibs()
end init_me

-- Script-Libraries in Globale Variablen laden (theG_xxxL)
on init_GlobalLibs()
   global theG_LogL, theG_FormatL
   set thePath to (((path to library folder from user domain) as string) & thePLibFolder & ":")
   -- Logdatei-Routinen
   copy (load script (thePath & (item 1 of thePObjNames)) as alias) to theG_LogL
   -- Zahlen formatieren
   copy (load script (thePath & (item 2 of thePObjNames)) as alias) to theG_FormatL
   
   -- Andere
   --copy (load script (thePath & (item x of thePObjNames)) as alias) to theG_uswL
   
end init_GlobalLibs

-- Fataler (Standard) Fehler 1. Ebene von 'run' und 'open' Handler
on fatal_StdError(errmsg, errnum)
   -- Sicherheitshalber AppleScript's text item delimiters auf Default-Wert setzen
   set AppleScript's text item delimiters to {""}
   if not (errnum = -128) then -- -128, User cancelled
      tell me to activate
      beep
      --display dialog (errmsg & " Nr. " & (errnum as string)) buttons {"Aargh..."} default button 1 with icon 0 -- für AS 1.9.3
      display alert ("Fehler-Nr.: " & (errnum as string)) message errmsg as critical buttons {"Aargh …"} default button 1 -- ab AS 1.10
   end if
end fatal_StdError
-- ===============================Ende Hauptscript==================================





Jetzt folgen die 2 Libraries. Bitte jeweils in eine Scriptdatei kopieren und als kompilierte Scripte in den Ordner '~/Library/Meine_AS_Libraries/' kopieren. Der Ordner "Meine_AS_Libraries" muss natürlich selbst erstellt werden!

Library 1, Name: Log_Lib.scpt



property thePSignatur : "Log_Lib.scpt 1.0.0De" -- (©2005 Folker Brandt)

--File Reference Nummer der jeweiligen Log-Datei
property thePFileRef : {}
-- Zeilenzähler
property thePCount : 0
-- Line-Break der Log-Datei
property thePLinebreak : (ASCII character 10)

-- Logfile anlegen
on start_log(theNewFile, theName, theTime)
   set thePFileRef to (open for access file theNewFile with write permission)
   set eof of thePFileRef to 0
   write_log("0   Start (" & thePSignatur & ")")
   write_log("0   Script-/Programm „" & theName & "“ startet @ " & theTime)
end start_log

-- Log-Eintrag schreiben (jeweils 1 Zeile)
on write_log(theText)
   write ((thePCount as string) & tab & time string of (current date) & tab & theText & thePLinebreak) to thePFileRef
   set thePCount to (thePCount + 1)
end write_log

-- Logfile schliessen
on stop_log(temp)
   write_log("0   Script-Laufzeit: " & (((current date) - temp) as string) & " sec")
   write_log("0   Ende (" & thePSignatur & ")")
   close access thePFileRef
   set thePFileRef to {}
end stop_log



Library 2, Name: FormatNumber_Lib.scpt


property thePSignatur : "FormatNumber_Lib.scpt 1.0.0De" -- (©2005 Folker Brandt)

(*
Genauigkeit umfasst 12 Stellen, unabhängig vom Komma! D.h., dass die 13. Ziffer gerundet wird!

set {thePDecSep, thePTsdSep, thePX, thePY, thePCurrPlace, theCurrSym, thePSpace} to {",", ".", 1, 2, -1, "€", " "}
property thePX -> 1 -- Erzwungende MINDEST-Stellen vor dem Komma, 1 = Default
property thePY -> 2 -- MAXIMAL-Stellen nach dem Komma, 2 = Default
property thePCurrPlace -> -1, 0, (+)1 -> vor Zahl, ohne Symbol, nach Zahl, (+)1 = Default
property thePSpace -> -- Abstand zwischen Zahl und Symbol, Space = Default

get_formatNumber(n) -- n = number (real, integer) oder Zahl als String. Result: String
*)

--Decimal - Separator
property thePDecSep : ","
--Tausender - Separator
property thePTsdSep : "."

-- Erzwungende MINDEST-Stellen vor dem Komma
property thePX : 1
-- MAXIMAL-Stellen nach dem Komma
property thePY : 2

(* Währung für Geldbeträge *)
-- -1= vor der Zahl, 0= ohne, kein Symbol, 1= nach der Zahl
property thePCurrPlace : -1
property theCurrSym : "€"
property thePSpace : " " -- Abstand zwischen Zahl und Symbol

-- Handler zum Formatieren von Zahlen, auch Zahlen als String! Result: String
on get_formatNumber(n)
   set {oldDelims, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {""}}
   set n to ((round ((n as real) * (10 ^ (my thePY))) rounding to nearest) / (10 ^ (my thePY)))
   --set n to ((round ((n as real) * (10 ^ (my thePY))) rounding as taught in school) / (10 ^ (my thePY)))
   set {a, b} to (get_ListFromText("" & n, (text item 2 of (pi as string))))
   set b to (get_ListFromText(b, "E"))
   if ((length of b) = 1) then set end of b to "0"
   set {a, b, c} to ({a} & b)
   if ((my thePY) ? 0) then set b to (b & get_null((my thePY) - 1, {}))
   set c to (c as integer)
   if (c < 0) then
      set a to get_null(c * (-1), {}) & a
      set {a, b} to {text 1 thru (c - 1) of a, text from c to -1 of a & b}
   else if c > 0 then
      set b to b & get_null(c, {})
      set {a, b} to {a & text 1 thru c of b, text from (c + 1) to (c + (my thePY)) of b}
   end if
   set l to (length of a)
   if ((my thePX) > 1) then
      if (l < (my thePX)) then set a to (get_null(((my thePX) - l), {}) & a)
   end if
   if ((my thePY) > 0) then
      set {b, d} to {(text 1 thru (my thePY) of b), my thePDecSep}
   else
      set {b, d} to {"", ""}
   end if
   if (l > 3) then
      set a to (set_tsdSep(a, l, {}))
   end if
   if (my thePCurrPlace = 1) then set b to (b & (my thePSpace) & (my theCurrSym))
   if (my thePCurrPlace = (-1)) then set a to ((my theCurrSym) & (my thePSpace) & a)
   set AppleScript's text item delimiters to oldDelims
   return a & d & b
end get_formatNumber

-- Nullen erzeugen für führende bzw. nachgestellte Nullen
on get_null(c, theL)
   repeat c times
      set end of theL to 0
   end repeat
   return (theL as string)
end get_null

-- Tausender-Stellen
on set_tsdSep(a, l, theL)
   repeat with i from l to 1 by -3
      if ((i - 3) <= 0) then exit repeat
      set beginning of theL to (my thePTsdSep & (text from i to (i - 2) of a))
   end repeat
   return ((text 1 thru i of a) & (theL as string))
end set_tsdSep

-- Dieser Handler existiert in meiner Essential_Lib.scpt und sollte normalerweise dort benutzt werden!
-- Da ich die Essential_Lib.scpt aber nicht poste, habe ich den handler hier mal behelfsmäßig eingesetzt
-- Generiert aus Text Listen
on get_ListFromText(temp, theDelim)
   set {oldDelims, AppleScript's text item delimiters} ¬
      to {AppleScript's text item delimiters, {theDelim}}
   set temp to (text items of temp)
   set AppleScript's text item delimiters to oldDelims
   return temp
end get_ListFromText

_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 03.11.2005 - 17:13    Titel: Antworten mit Zitat

Puh, so viel - alle, denen das zu viel zum Kopieren ist oder falls durch irendwelche Ungleich-Zeichen o.ä. sich in der Internetdarstellung Fehler eingeschlichen haben sollten - hier ein DL Link für die Konzept-Datei und die 2 Libraries.

http://www.alle-brandts.de/dl/AS_Bibliotheken.zip

Das System sollte soweit klar sein, vielleicht hat ja der Ein oder Andere eine gute Idee für weitere häufig benötigte Routinen, welche in einer Bibliothek gur aufgehoben wären - nur zu, der Anfang ist ja gemacht Very Happy
_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 07.11.2005 - 12:23    Titel: Antworten mit Zitat

So, einen kleinen Nachtrag habe ich ja noch Smile
Was für das Laden der Bibliotheken in 'globale Variablen' spricht ist die Möglichkeit, einen Handler der Bibliothek a in der Bibliothek b nutzen zu können. Simples Beispiel: Man modifiziere den Handler 'stop-log(temp)' folgendermaßen:


-- Logfile schliessen
on stop_log(temp)
   global theG_FormatL -- MODIFIKATION
   write_log("0   MODIFIKATION: " & theG_FormatL's thePSignatur) -- MODIFIKATION
   write_log("0   Script-Laufzeit: " & (((current date) - temp) as string) & " sec")
   write_log("0   Ende (" & thePSignatur & ")")
   close access thePFileRef
   set thePFileRef to {}
end stop_log


Es wurden 2 Zeilen (--MODIFIKATION) zugefügt - das kann natürlich nur funktionieren, wenn die entsprechende Bibliothek galaden wurde!

Verwenden kann man das sehr gut für essenzielle Routinen. Diese können so auch von spez. Bibliotheken (z.B. Indesign_lib.scpt) genutzt werden, ohne den Umweg über ein Hauptscript nehmen zu müssen.
_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
spirigwi
•----->
•----->


Anmeldedatum: 10.07.2003
Beiträge: 1529
Wohnort: Olten-CH

BeitragVerfasst am: 23.02.2006 - 18:55    Titel: Re: Bibliotheken (Libraries) oder Segmentierung von Scripten Antworten mit Zitat

Folker hat Folgendes geschrieben:
mal wieder ein Thema eröffnen und hoffe, dass sich vielleicht ein langer Gesprächsfaden mit einer Fülle an kleinen Bibliotheken entwickelt Wink -- ============================Signatur: Dieses Projekt===============================
-- Kann in eine Log-Datei übernommen werden

Das wäre ein human-CodeFormatter - Test anlässlich eines Themas, das man unbedingt endlich weiter mit
Folker hat Folgendes geschrieben:
mit einer Fülle
füllen sollte. Ich selbst habe mir aber leider noch nicht genügend AS-Raffinessen für ein solch komplexes Thema erlernt, deren gibts aber in Hülle und Fülle im Snows Forum, wo sie wohl warten?
_________________
 Skript-Fan => ein � -Fan =>Scr¿¿-KongFuSius_Kurpfusius
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> Pool 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