Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   integer bit werte in checkbox anzeigen (https://www.delphipraxis.net/161015-integer-bit-werte-checkbox-anzeigen.html)

michdan 12. Jun 2011 18:58

integer bit werte in checkbox anzeigen
 
hallo

Ich habe eine form mit 16 checkboxen und ein TEdit felt.

Die 16 checkboxen repräsentieren die einzellenen bits im wert.

Wie kann ich am besten die einzellen bits (Checkbox.checked) setzen wenn ich einen wert in das TEdit schreibe ?


Jetzt mache ich das so, aber kann man nicht den namem der checkbox rausfinden und in einer schleife einbauen?


Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
value : word;
begin

value := strtoint(edit2.Text);

if (Value and 32768 ) = 0 then
   checkbox16.Checked := false
else
   checkbox16.Checked := true;

if (Value and 16384 ) = 0 then
   checkbox15.Checked := false
else
   checkbox15.Checked := true;

if (Value and 8192 ) = 0 then
   checkbox14.Checked := false
else
   checkbox14.Checked := true;

if (Value and 4096 ) = 0 then
   checkbox13.Checked := false
else
   checkbox13.Checked := true;

if (Value and 2048 ) = 0 then
   checkbox12.Checked := false
else
   checkbox12.Checked := true;

if (Value and 1024 ) = 0 then
   checkbox11.Checked := false
else
   checkbox11.Checked := true;

if (Value and 512 ) = 0 then
   checkbox10.Checked := false
else
   checkbox10.Checked := true;

if (Value and 256 ) = 0 then
   checkbox9.Checked := false
else
   checkbox9.Checked := true;

if (Value and 128 ) = 0 then
   checkbox8.Checked := false
else
   checkbox8.Checked := true;

if (Value and 64 ) = 0 then
   checkbox7.Checked := false
else
   checkbox7.Checked := true;

if (Value and 32 ) = 0 then
   checkbox6.Checked := false
else
   checkbox6.Checked := true;

if (Value and 16 ) = 0 then
   checkbox5.Checked := false
else
   checkbox5.Checked := true;

if (Value and 8 ) = 0 then
   checkbox4.Checked := false
else
   checkbox4.Checked := true;

if (Value and 4 ) = 0 then
   checkbox3.Checked := false
else
   checkbox3.Checked := true;

if (Value and 2 ) = 0 then
   checkbox2.Checked := false
else
   checkbox2.Checked := true;

if (Value and 1 ) = 0 then
   checkbox1.Checked := false
else
   checkbox1.Checked := true;

edit2.SelStart := length(edit2.Text);



end;
gruss
michael

fkerber 12. Jun 2011 19:01

AW: integer bit werte in checkbox anzeigen
 
Hi,

schau mal nach Delphi-Referenz durchsuchenfindComponent.


LG, Frederic

DeddyH 12. Jun 2011 19:24

AW: integer bit werte in checkbox anzeigen
 
Aus dem Kopf, daher ohne Gewähr:
Delphi-Quellcode:
for i := 15 downto 0 do
  TCheckBox(FindComponent('CheckBox' + IntToStr(i + 1))).Checked := (Value and (1 shl i)) <> 0;

sx2008 12. Jun 2011 19:55

AW: integer bit werte in checkbox anzeigen
 
Mach dich mal mit der Komponente TCheckListBox bekannt...
Das gilt dann auch für alle Mitleser, die dieses Steuerelement wohl noch nicht kennen.

michdan 12. Jun 2011 20:01

AW: integer bit werte in checkbox anzeigen
 
Vielen dank für inputs....

DeddyH dein vorslag war genau richtig und funktioniert....

nochmals danke..

/michael

himitsu 12. Jun 2011 22:45

AW: integer bit werte in checkbox anzeigen
 
Ansonsten hättest du selbst bei den IFs 80% der Zeilen einsparen können.

Delphi-Quellcode:
CheckBox16.Checked := (Value and 32768) <> 0;
CheckBox15.Checked := (Value and 16384) <> 0;
CheckBox14.Checked := (Value and 8192) <> 0;
...
CheckBox1.Checked := (Value and 1) <> 0;
Und Hexadezimal läßt sich Binär auch viel schöner rechnen, als mit Dezimal.
Delphi-Quellcode:
CheckBox16.Checked := (Value and $8000) <> 0;
CheckBox15.Checked := (Value and $4000) <> 0;
CheckBox14.Checked := (Value and $2000) <> 0;
...
CheckBox1.Checked := (Value and $0001) <> 0;

Stevie 13. Jun 2011 02:08

AW: integer bit werte in checkbox anzeigen
 
Zitat:

Zitat von himitsu (Beitrag 1106000)
Und Hexadezimal läßt sich Binär auch viel schöner rechnen, als mit Dezimal.

Völlig korrekt, aber ich musste irgendwie schmunzeln und an "Nachts ist es kälter als draußen" denken :lol:

hboy 13. Jun 2011 11:20

AW: integer bit werte in checkbox anzeigen
 
Delphi-Quellcode:
// folgendes kann man zur design time festlegen:
//
Checkbox1.Tag := 1 shl 1;
Checkbox2.Tag := 1 shl 2;
//...
Checkbox15.Tag := 1 shl 15;
Checkbox16.Tag := 1 shl 16;

// Checkbox-Objekte sind etwa in einem Panel oder einer Groupbox

// ...

// und das hier funktioniert für eine beliebige Anzahl von Elementen mit leicht
// änderbaren Flags, dazu noch Kombinationen von Flags.
var
  idx: longint;
  tray : TWinControl;
  cb  : TCheckBox;
begin
  tray := (Checkbox1.Parent as TWinControl);
  for idx := 0 to tray.ControlCount - 1 do
  begin
     if (tray.Controls[idx] is TCheckbox) then
     begin
        cb := (tray.Controls[idx] as TCheckbox);
        cb.Checked := (cb.Tag AND Value) <> 0;
     end;
  end;
end;

ps. alternativ zur Initialisierung (automatisches tagging):
Delphi-Quellcode:
uses math;
//...
var
  cb : TCheckBox;
  i : longint;
//...
for i := 1 to 16 do
begin
  cb := TCheckBox(FindComponent('CheckBox' + IntToStr(i)));
  if assigned(cb) then cb.Tag := power(2,i-1);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz