FUNKTION:
varargs mixed Set(string name, mixed wert, int typ);
ARGUMENTE:
name: Der Name der Property, die manipuliert werden soll.
wert: Der Wert, mit dem manipuliert wird.
typ: Die Eigenschaft der Property, die manipuliert werden soll.
BESCHREIBUNG:
Eine der inneren Eigenschaften der Property name wird geaendert.
'typ' ist dabei eines aus:
F_VALUE - Der intern gespeicherte Wert der Property
F_MODE - Der Zustand der Propertie (s.u.)
F_QUERY_METHOD - Die Abfrage-Closure
F_SET_METHOD - Die Setz-Closure
F_MODS - Die aktuellen Modifikatoren (nicht setzbar)
Der Wert kann verschiedenes sein. Als F_VALUE haengt er von der
Property selbst ab, der F_MODE ist immer ein Integer, die
Methoden sind (gebundene!) Closures oder Null. Mods ein Array mit
dem Aufbau ({ mod-obj1, wert1, mod-obj2, wert2, ... }).
Fuer F_MODE kommen folgende Flags in Betracht:
SAVE - Prop wird mit gespeichert
PROTECTED - Nur this_object() kann F_MODE noch aendern
SECURED - Wie PROTECTED aber nicht ruecksetzbar
NOSETMETHOD - Keine Set-Methode => Nicht modifizierbar
MODIFIABLE - ModifyProp() erlaubt
Ein Setzen von Flags (Bits) mit F_MODE dreht die Bits jeweils einmal
um (toggelt). Das heisst, wenn die Propertie schon SAVE ist, macht
ein Set(prop, SAVE, F_MODE) sie wieder un-save. Besser und eindeutiger
geht es, indem man Bitoperationen (s.u.) benutzt.
Bitoperationen (F_MODE_AS, F_MODE_AD, F_VALUE_AS, F_VALUE_AD):
Manchmal moechte man gezielt Bits eines F_MODE oder F_VALUE setzen
oder loeschen. Normalerweise muesste man dazu den (alten) Wert
zunaechst Abfragen und dann moifiziert setzen, damit man die anderen
Bits nicht beeinflusst.
Es gibt jedoch spezielle 'Subtypen', die einem diese Arbeit abnehmen.
Das Anhaengsel _AS steht fuer 'Setzen' und _AD fuer 'Loeschen'.
Set(prop, SAVE, F_MODE_AS) setzt also auf jeden Fall das SAVE Flag,
egal, ob es schon gesetzt war. Set(prop, 32, F_VALUE_AD) loescht
Bit 5 aus dem Wert der Prop. Letzteres kann zu Laufzeitfehlern
fuehren, wenn die Propertie gar keine Integerzahl gespeichert hat.
RÜCKGABEWERT:
Das Ergebnis der Manipulation (abhaengig von typ).
War der Typ F_VALUE, so werden weder Abfragemethoden noch
Modifikatoren beruecksichtigt.
BEISPIELE:
Setzen einer Abfragemethode fuer ein Property:
Set(P_XYZ, #'meine_abfragefunktion, F_QUERY_METHOD);
QueryProp(P_XYZ) liefert dann immer den Rueckgabewert der Funktion
meine_abfragefunktion(). Zum Entfernen der Abfragemethode setzt
man sie einfach auf 0:
Set(P_XYZ, 0, F_QUERY_METHOD);
Ob eine Abfragemethode gesetzt wurde. Sieht man mittels:
Query(P_XYZ, F_QUERY_METHOD).
Setzen einer Property unter Umgehung der Setzmethode (beide Aufrufe
fuehren zum gleichen Ergebnis!):
Set(P_XYZ, "bla", F_VALUE);
Um eine Property speicherbar zu machen, geht man wie folgt vor:
Set(P_XYZ, SAVE, F_MODE);
Set(P_XYZ, SAVE, F_MODE_AS);
Der erste Aufruf schaltet das SAVE-Flag nur um; wenn es schon gesetzt
war, ist es nun geloescht! Der zweite Aufruf setzt das Flag auf jeden
Fall, egal ob es schon gesetzt war oder nicht.
Um zu erreichen, dass die Property sich mit SetProp() nicht setzen
laesst, kann man einen der folgenden Aufrufe verwenden:
Set(P_XYZ, NOSETMETHOD, F_MODE_AS);
SIEHE AUCH:
SetProp(), QueryProp(), Query(), SetProperties(), QueryProperties(),
ModifyProp(L), properties(C)
|