Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 03.11.2005 - 17:05 Titel: Bibliotheken (Libraries) oder Segmentierung von Scripten |
|
|
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
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 |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 03.11.2005 - 17:13 Titel: |
|
|
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  _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 07.11.2005 - 12:23 Titel: |
|
|
So, einen kleinen Nachtrag habe ich ja noch
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 |
|
 |
spirigwi •----->


Anmeldedatum: 10.07.2003 Beiträge: 1517 Wohnort: Olten-CH
|
Verfasst am: 23.02.2006 - 18:55 Titel: Re: Bibliotheken (Libraries) oder Segmentierung von Scripten |
|
|
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 -- ============================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 |
|
 |
|
|
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
|
|
|