Hallo!
Lässt sich ein binäres und in Formelsprache (z.B. in Hide when Formeln ) abbilden?
Wert := 10;
Flag := 4;
Wert & Flag = Flag
Binär würde daraus:
Wert := 01010
Flag := 00100
& ---------
00000 == 00100 (False)
Ein Beispiel für True wäre:
Wert := 01110 (14)
Flag := 00100 (4)
& ---------
00100 == 00100 (True)
Über die Sinnhaftigkeit über Flags habe ich schon erfolglos gestritten ...
Hallo Andreas,
auf die Idee in Script die Flags Binär anzugeben bin ich gar nicht gekommen. Macht (zusammen mit Anmerkingen) den Code lesbarer
Bisher hatte ich in etwa so kodiert:
Dim intWert As Integer
Dim intFlag As Integer
intWert = 12
intFlag = 2
Print ((intWert And intFlag) = intFlag) ' False
intWert = 22
intFlag = 2
Print ((intWert And intFlag) = intFlag) ' True
Die Flags sind im Designentwurf drinnen - über die Umsetzung in hideWhen Formeln habe ich noch keine Idee.
Stichworte sind Wilkommen.
Roger
So, habe mir mal eine Kopiervorlage für hideWhen-Formeln gebaut. Eventuell kann es jemand gebrauchen bzw. findet grobe Schnitzer ;)
Die Einschränkungen sind: Nur 32 Bit; Es wird nur ein Bit abgefragt.
Roger
_Wert := Wert ; REM {Die Flags als Dezimalwert (hier aus dem Dokument gelesen)};
_WhichBit := Flag; REM {Welches Bit für die Anzeige gesetzt sein muss (hier aus dem Dokument gelesen)};
REM { --==[ DO NOT EDIT BELOW THIS LINE]==-- };
_BitValues := 1 : 2 : 4 : 8 : 16 : 32 : 64 : 128 : 256 : 512 : 1024 : 2048 : 4096
: 8192 : 16384 : 32768: 65536 : 131072 : 262144 : 524288 : 1048576
: 2097152 : 4194304 : 8388608 : 16777216 : 33554432 : 67108864
: 134217728 : 268435456 : 536870912 : 1073741824 : 2147483648 ;
_BitIndex := @Elements(_BitValues);
@While( _BitIndex > 0;
_BitValue := @Subset(@Subset(_BitValues; _BitIndex); -1);
_Flag := @If( (_Wert - _BitValue) >= 0; @True; @False);
_Bits := _Bits + ";" + @Text(_Flag ) ;
@If(_Flag; _Wert := _Wert - _BitValue; 0);
_BitIndex := _BitIndex -1
);
_Bits := @Right(_Bits;@Length(_Bits)-1); REM {Führendes ';' abschneiden};
REM {Falls noch woanders damit Weitergerechnet werden sollte};
_BitList := @Explode( _Bits ; ";"); REM {Liste mit den Bitwerten (hoch nach niedrig)};
_BitString := @ReplaceSubstring( _Bits; ";";"") ; REM {String mit den Bitwerten (hoch nach niedrig)};
_Result := @If( @TextToNumber(@Subset(@Subset(_BitList; - _WhichBit);1)) = 1; @True ; @False);
!( _Result )
Ich hab da auch noch was um eine Zahl in einen Bitstring umzuwandeln.
z := Eingabe;
t := "";
@for(i := 2147483648; i >= 1; i := i / 2; t:= t + @If(!@IsNumber(z);"-";z >= i;@Do(z := z-i; "1");"0"));
t
In die Variable "z" kommt die umzuwandelnde Zahl, in "t" steht nach Durchlauf der @For-Schleife ein 32-Bit String.
Am Besten als berechnetes Feld in die Maske rein machen, Vergleiche in den Hide-Formeln kann man dann bequem mit
@Like(t;"_____________________________1__")
machen, ob ein bestimmtes Bit gesetzt (bzw mit 0 nicht gesetzt) ist.
Gruß
Roland
/edit: Erklärung
z:= Zahl
i := 2^31
Solange i (i durchläuft alle 2er-Potenzen)
prüfe ob z eine Zahl ist, wenn nein gib "-" aus (Fehlerbehandlung)
prüfe ob z >= i ist (dann ist das entsprechende Bit gesetzt)
und ziehe z ab und gib "1" aus
ansonsten gib "0" aus
i := i / 2 (nächste 2er Potenz)
next
Obige Schleife wird nun 32 mal ausgeführt und gibt für jedes Bit eine 1 oder 0 (bzw. "-" für ungültig) aus.