![]() |
8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Hallo Allerseits,
ich stehe gerade bei einem logischen Problem etwas auf dem Schlauch. Folgendes: Ich lese einen µC aus und bekomme ein Byte zurück.(Also 8 Bit ;-) Jedes Bit stellt einen Kontakt dar. (Also 8 Kontakte) Für jeden Kontakt habe ich eine CheckBox, die anzeigen soll, welcher Kontakt gerade geschlossen ist. Wie könnten am elegantesten die CheckBoxen gesetzt werden. Also die blödeste Lösung wären 256 If-Abfragen. (undenkbar) Kann mich mal jemand "anstoßen" ?? :gruebel: Danke - Andrej! |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Vielleicht hilft Dir
![]() |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Ja Danke erstmal,
das ich die einzelnen Bits auswerten muss ist schon klar. Ich sags mal einfach: Also soll ich die jeweiligen 8 Stellen des Bytes seperieren und dann hätte ich nur noch 8 Abfragen...? (Also 8 mal testen ob 1 oder 0 und dann die jeweilige CheckBox setzen) |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Mit etwas Geschick könnte man das ja auch in eine Schleife packen.
|
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Ich weiß auch nicht, wo es grad hängt, aber ich werfe mal "and" und "shl" als Suchbegriffe für F1 dazu. Eine etwas genauere Frage wäre hilfreich.
|
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Eine nicht mathematische Lösung: Wandele das Byte in seine binäre Schreibweise als Zeichenkette um. Dann bekommst du zum Beispiel: "10110101". Dann gehst du die Zeichenkette in einer Schleife durch und prüfst wo eine eins steht:
Delphi-Quellcode:
if s[1] = '1' then CheckBox1.Checked := True;
|
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Hallo,
evtl. hilft diese Funktion weiter. "iValue" entspricht z.B. der Byte-Variable. Und "iBit" legt das zu prüfende Bit fest (beginnend von rechts, wobei 0 dem ersten Bit enspricht). "FloatToStr" bzw. "StrToInt" werden benutzt, weil "IntPower" Extended zurückgibt. Dies schien mir der einfachste weg zu sein, um wieder auf Integer zu kommen. Deshalb auch zur Sicherheit try/except. Gibt sicherlich elegantere Wege, aber läuft. Viele Grüße Tom
Delphi-Quellcode:
function CheckBit
( iValue : Integer ; iBit : Integer ) : Boolean ; var iString : String ; iBitValue : Integer ; begin { Variablen } iString := FloatToStr(IntPower(2,iBit)) ; try iBitValue := StrToInt(iString) ; except iBitValue := 0 ; end ; // try { Prüfen und Rückgabe } result := (iBitValue and iValue = iBitValue) ; end ; |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Vielen Dank Euch allen,
was ich mir nun gebaut habe:
Delphi-Quellcode:
Also so geht es erst mal.
var
Kontakte,z,z1 : byte; DasEmpfangeneByte : string; Begin Kontakte:=ord(DasEmpfangeneByte); //Das empfangene Byte ist aus der Schnittstelle als String eingelesen // und wird erst mal umgewandelt...spielt hier aber erst mal keine Rolle... z1:=1; for z:=1 to 8 do begin bit[z]:=Kontakte and z1; z1:=z1*2; end; if bit[1] <> 0 then Hauptform.SeSkinCheckBox1.checked:=true; if bit[2] <> 0 then Hauptform.SeSkinCheckBox2.checked:=true; if bit[3] <> 0 then Hauptform.SeSkinCheckBox3.checked:=true; if bit[4] <> 0 then Hauptform.SeSkinCheckBox4.checked:=true; if bit[5] <> 0 then Hauptform.SeSkinCheckBox5.checked:=true; if bit[6] <> 0 then Hauptform.SeSkinCheckBox6.checked:=true; if bit[7] <> 0 then Hauptform.SeSkinCheckBox7.checked:=true; if bit[8] <> 0 then Hauptform.SeSkinCheckBox8.checked:=true; end Ist ebend blöd, dass man die 8 CheckBoxen nicht mit einem Befehl gleichzeitig, sozusagen in dem man die BitMaske drüberlegt, aktivieren kann. Aber Ihr habt mir erst mal erfolgreich weitergeholfen. - Danke! |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Wie wärs damit?
Delphi-Quellcode:
for z := 0 to 7 do
TCheckBox(Hauptform.FindComponent('SeSkinCheckBox' + IntToStr(z+1))).Checked := ((bit shr z) and 1) <> 0; |
Re: 8 Bits zu CheckBoxen zuweisen - Ansatz gesucht
Hey Dax,
das sieht ja sehr vielversprechend aus :thumb: Werde ich morgen mal austesten - was es so alles für Dinge in Delphi gibt ! (Komme leider viel zu wenig zum Delphicodern - aber was solls - viele Wege führen nach Rom - einige sind nur etwas steiniger :mrgreen: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz