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

Anmeldedatum: 07.05.2001 Beiträge: 175
|
Verfasst am: 03.09.2001 - 11:56 Titel: property dynamisch erzeugen |
|
|
Hi Forum
Ist es möglich, eine property dynamisch zu erzeugen? Oder muss hier ein Textfile ran?
Konkret geht es um eine Liste (als property). Für jeden neuen Listeneintrag brauche ich eine neue property. Ebenso soll die neue property wieder entfernt werden, wenn das item aus der Original-Liste entfernt worden ist.
Grüße, Jens
(Geändert von Jens Hoffmann am 12:38 Uhr am 3 Sep. 2001) |
|
Nach oben |
|
 |
macgix •--->


Anmeldedatum: 13.12.2000 Beiträge: 206 Wohnort: K–ln
|
Verfasst am: 09.09.2001 - 20:05 Titel: property dynamisch erzeugen |
|
|
Lieber Jens, ich habe Deine Frage noch nicht ganz verstanden. Meinst Du wirklich "property", also Variablen, deren Werte permanent gespeichert und im Skript selbst in allen Handlern gültig sind, oder meinst du damit die einzelnen Elemente einer Liste, die selbst als property gespeichert ist?
Letztendlich könntest Du aber auch einen "record" meinen, wie z.B.:
property tList : {name des ersten elementes:wert,name des zweiten Elementes:wert,...}
In letztem Falle kann man einen Eintrag nur entfernen, indem man den record durchläuft und aus allen nicht leeren Elementen einen Neuen bildet, danach den Alten löscht.
Meinst Du es so? _________________ [macgix] |
|
Nach oben |
|
 |
Jens Hoffmann •--->

Anmeldedatum: 07.05.2001 Beiträge: 175
|
Verfasst am: 10.09.2001 - 10:06 Titel: property dynamisch erzeugen |
|
|
Ich meine eine property, deren Werte permanent gespeichert und im Skript selbst in allen Handlern gültig ist.
Ich habe eine property, z.B.
property dieProjekte: {Projekt1, Projekt2}
Für jeden Eintrag brauche ich nun eine weitere property, z.B.
property PfadProjekt1: {derPfad}
Die Einträge von dieProjekte können sich ständig ändern und es ist nicht klar, wieviele Einträge die property haben wird.
Es wird z.B. ein Eintrag Projekt3 hinzugefügt. Nun brauche ich die Eintsprechende property PfadProjekt3. Und wenn der Eintrag Projekt3 wieder gelöscht wird, soll auch PfadProjekt3 wieder gelöscht werden (wobei dies nicht unbedingt nötig wäre, da man die Werte von PfadProjekt3 ja auch überschreiben kann).
Vielleicht gibt es da auch andere Möglichkeiten. Eine, die mir bekannt ist, ist das Speichern in einer Textdatei, was aber mehr Aufwand ist.
Grüße, Jens |
|
Nach oben |
|
 |
macgix •--->


Anmeldedatum: 13.12.2000 Beiträge: 206 Wohnort: K–ln
|
Verfasst am: 10.09.2001 - 12:11 Titel: property dynamisch erzeugen |
|
|
So, nun habe ich es wohl kapiert. Der informatisch korrekte Ansatz für AppleScripter ist dieser (Eventlog zuvor öffnen!):
property Projekte : {¨
{name:"projekt1", contents:{ "data1", "data2", "data3" }}, ¨
{name:"projekt2", contents:{ "data4", "data5", "data6" }}, ¨
{name:"projekt3", contents:{ "data7", "data8", "data9" }} ¨
}
on run
log "----------------------------------------------------"
log name of item 1 of Projekte
log "----------------------------------------------------"
log contents of item 1 of Projekte
log "----------------------------------------------------"
-- Nun überschreiben der Einträge des Records
set name of item 2 of Projekte to ""
set contents of item 2 of Projekte to { "data7", "data8", "data9" }
log name of item 2 of Projekte
log "----------------------------------------------------"
log contents of item 2 of Projekte
log "----------------------------------------------------"
end run
Damit lassen sich die "Projekte" über Indizes ansprechen sowie alle Daten "Projektname" und "Projektcontents" verändern, überschreiben oder wie folgt löschen:
Setzte alle Inhaltsfelder auf "" und prüfe im Skript, ob Datenfeld leer ist.- Wenn ja, dann ignoriere diesen Eintrag und erhöhe den Index um eins.
Da leere Variablen kein RAM-Speicher beanspruchen ist es statthaft, diese in "Projekte" leer bestehen zu lassen.
Es bietet sich natürlich an, eine Routine zu schreiben, die aus "Projekte" immer einen neuen von leeren Einträgen befreiten record bildet und diesen dann in "Projekte" zurückspeichert:
-- Neuen Record bilden
set Projekte to my cleanUpRecord(Projekte)
end run
on cleanUpRecord(r_ecord)
set temp to {}
repeat with a_item in r_ecord
if name of a_item is not "" then
set temp to temp & a_item
end if
end repeat
set r_ecord to temp
set temp to {}
return r_ecord
end cleanUpRecord
Besser so? _________________ [macgix] |
|
Nach oben |
|
 |
macgix •--->


Anmeldedatum: 13.12.2000 Beiträge: 206 Wohnort: K–ln
|
Verfasst am: 10.09.2001 - 12:40 Titel: property dynamisch erzeugen |
|
|
Zwei Fehler musste ich noch korrigieren. Hier nochmal das komplette Skript, fehlerbereinigt und kommentiert:
property Projekte : {}
on run
-- Werden die Werte direkt in der property definiert, besteht die
-- Liste im zweiten Durchlauf nur aus zwei Elementen, im Dritten nur aus Einem!
-- Deswegen wird Projekte hier definiert. Dann sind es immer drei Elemente
-- Diese Eigenschaft kann natürlich ganz nach Wunsch ausgenutzt werden!
set Projekte to {¨
{name:"projekt1", contents:{ "data1", "data2", "data3" }}, ¨
{name:"projekt2", contents:{ "data4", "data5", "data6" }}, ¨
{name:"projekt3", contents:{ "data7", "data8", "data9" }} ¨
}
-- Verwendet die Any2Str OSAX von Digital Technologies FaceSpan 3.5
-- Hat man diese nicht, schreibt man "log Projekte", erhält aber den
-- Eintrag nicht so formatiert, wie er es eigentlich ist, die Klammern fehlen!
-- Die Werte stimmen aber und es genügt für's Verständnis auch ohne Any2Str
log (Any2Str (Projekte))
-- Nun überschreiben der Einträge des Records
set name of item 2 of Projekte to ""
set contents of item 2 of Projekte to { "data7", "data8", "data9" }
log (Any2Str (Projekte))
-- Neuen Record bilden
set Projekte to my cleanUpRecord(Projekte)
log (Any2Str (Projekte))
end run
on cleanUpRecord(r_ecord)
set temp to {}
repeat with a_item in r_ecord
if name of a_item is not "" then
-- "as record" ist GANZ wichtig!
set temp to temp & {a_item as record}
end if
end repeat
return temp
end cleanUpRecord
 _________________ [macgix] |
|
Nach oben |
|
 |
Jens Hoffmann •--->

Anmeldedatum: 07.05.2001 Beiträge: 175
|
Verfasst am: 10.09.2001 - 15:52 Titel: property dynamisch erzeugen |
|
|
Erst mal Danke, macgix. Das ist das, wonach ich gesucht habe.
Die eckigen Klammern bei "set Projekte to..." müssen noch durch 2 Geschweifte ersetzt werden (Übersetzungsfehler des Ikonboards, die beiden Klammern mit Leerzeichen trennen verhindert das), so dass der Part so aussieht :
set Projekte to {¨
{name:"projekt1", contents:{"data1", "data2", "data3"} }, ¨
{name:"projekt2", contents:{"data4", "data5", "data6"} }, ¨
{name:"projekt3", contents:{"data7", "data8", "data9"} } ¨
}
Eins krieg ich aber nicht hin: einen neuen Eintrag zu generieren. Kannst Du vielleicht mal kurz erläutern, wie ich einerseits ein "ganzes Projekt" anspreche, also z.B. den Eintrag:
{name:"projekt3", contents:{"data7", "data8", "data9"}}
und anderseits auf die Komponenten eines solchen zugreife, also auf den Namen oder den content?
Danke und Grüße
Jens |
|
Nach oben |
|
 |
macgix •--->


Anmeldedatum: 13.12.2000 Beiträge: 206 Wohnort: K–ln
|
Verfasst am: 10.09.2001 - 17:07 Titel: property dynamisch erzeugen |
|
|
So, nun mit zwei neuen Handlern:
addEntryToRecord(rec_list, new_record) und
sortRecords(r_ecord)
property Projekte : {}
on run
-- Werden die Werte direkt in der property definiert, besteht die
-- Liste im zweiten Durchlauf nur aus zwei Elementen, danach nur aus einem!
-- Deswegen wird Projekte hier definiert. Dann sind es immer drei Elemente
-- Diese Eigenschaft kann natürlich ganz nach Wunsch ausgenutzt werden!
set Projekte to {¨
{name:"projekt1", contents:{ "data1", "data2", "data3" } } , ¨
{name:"projekt2", contents:{ "data4", "data5", "data6" } } , ¨
{name:"projekt3", contents:{ "data7", "data8", "data9" } } ¨
}
-- Verwendet die Any2Str OSAX von Digital Technolies FaceSpan 3.5
-- Hat man diese nicht, scgheibt man "log Projekte", erhält aber den
-- Eintrag nicht so formatiert, wie er es in eigentlich ist, die Klammern fehlen!
-- Die Werte stimmen aber und es genügt für's Verständnis auch ohne Any2Str
log (Any2Str (Projekte))
-- Nun überschreiben der Einträge des Records
set name of item 1 of Projekte to ""
set contents of item 1 of Projekte to { "data1", "data2", "data3" }
log (Any2Str (Projekte))
-- Neuen Record bilden
set Projekte to my cleanUpRecord(Projekte)
log (Any2Str (Projekte))
set Projekte to my addEntryToRecord(Projekte, {name:"projekt1", contents:{ "data10", "data11", "data12" } } )
return (Any2Str (Projekte))
end run
on addEntryToRecord(rec_list, new_record)
-- Nun, das kennen wir ja bereits
set rec_list to rec_list & {new_record as record}
-- Aber das hier ist neu
set rec_list to my sortRecords(rec_list)
return rec_list
end addEntryToRecord
on sortRecords(r_ecord)
-- Zuerst die Namen als Liste aus dem Record extrahieren
set a_name_list to {}
repeat with a_item in r_ecord
set a_name to name of a_item
set a_name_list to a_name_list & a_name
end repeat
-- Dann diese Namensliste alphabetisch sortieren (Bubblesort)
set sorted_record to a_name_list
repeat with n from 1 to sorted_record's length
repeat with j from 1 to (sorted_record's length) - n
if sorted_record's item j > sorted_record's item (j + 1) then
set temp to sorted_record's item j
set sorted_record's item j to sorted_record's item (j + 1)
set sorted_record's item (j + 1) to temp
end if
end repeat
end repeat
-- Nun die Einträge im Record gemäß der sortierten Namensliste neu sortieren,
-- respektive neuen Record in geänderter Reihenfolge erzeugen
set new_rec to {}
repeat with l from 1 to count of sorted_record
repeat with n in r_ecord
set n_temp to n as record
if ((item l of sorted_record) as text) = (name of n_temp) then set new_rec to new_rec & {n as record}
end repeat
end repeat
return new_rec
end sortRecords
on cleanUpRecord(r_ecord)
set temp to {}
repeat with a_item in r_ecord
if name of a_item is not "" then
-- "as record" ist GANZ wichtig!
set temp to temp & {a_item as record}
end if
end repeat
return temp
end cleanUpRecord
Müsste ich eigentlich schon fast etwas für berechnen, ist keine simple Sache gewesen, aber sei's drum für dieses Mal; hoffentlich lesen es auch genug Leute damit sie möglichst viele etwas davon haben; dann macht's mein Können wenigstens ein wenig bekannterÖ
Gruß,
Thomas _________________ [macgix] |
|
Nach oben |
|
 |
Jens Hoffmann •--->

Anmeldedatum: 07.05.2001 Beiträge: 175
|
Verfasst am: 13.09.2001 - 10:58 Titel: property dynamisch erzeugen |
|
|
Hallo macgix
Danke für die Komplettlösung. Möge AS Dich reich und berühmt machen...
Kam aber noch nicht zum Ausprobieren. Ich hoffe, ich komme da zurecht.
Grüße, Jens |
|
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
|
|
|