Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.16;
Скачать: CL | DM;

Вниз

Создание алгоритма для CheckBox   Найти похожие ветки 

 
Jaxtor ©   (2003-06-03 11:32) [0]

Всем День добрый!!! В программе моей должна быть визуализация значений CheckBox"ов используя двоичную систему исчисления. Привожу кусок программы для визуализации 3-х CheckBox"ов, для значения 2:

var CheckBoxVariable:TCheckBox;
...
CheckBoxVariable:=TCheckBox.Create(MainForm);
...

begin
n:=1;
PropertiesArray[2]:=2;
DescriptionCount:=3;
If (PropertiesArray[n+1]>2*(DescriptionCount-1)) or (PropertiesArr
ay[n+1]=2*(DescriptionCount-1)) then
CheckBoxVariable.Checked:=true else
CheckBoxVariable.Checked:=false;
dec(DescriptionCount);
end;


У меня стоит значение 2.
Если 2>=2^2; CheckBox1=Unchecked
Если 2>=2^1; CheckBox2=Checked
Если 2-2^1>=2^0; CheckBox3=UnChecked

Все бы хорошо, но как реализовать строчку 2-2^1?
Т.е. пока у меня считается последняя строчка как 2>=2^0, а надо
как 2-2^1>=2^0.


 
Sandman25 ©   (2003-06-03 11:39) [1]

>надо как 2-2^1>=2^0.

Почему? Надо именно value >= 2^N, где N от 0 до 2
В чем смысл визуализации? Битовое представление?


 
Jaxtor ©   (2003-06-03 11:44) [2]

Вот, допустим, визуализация числа 3:

3>=2^2 Unchecked
3>=2^1 Checked
3-2^1>=2^0 Checked.

Двоичная арифметика!


 
Jaxtor ©   (2003-06-03 11:50) [3]

Тупо можно сделать:
Занести в массив значения(3,3,3)
и для последнего значения массива сделать как
3-2^1>=2^0. А для других значений: просто 3>=2^1 , 3>=2^2...

А по другому можно?


 
Sandman25 ©   (2003-06-03 12:01) [4]

CB0.Checked := Value and (1 shl 0) > 0;
CB1.Checked := Value and (1 shl 1) > 0;
CB2.Checked := Value and (1 shl 2) > 0;

CB2 CB1 CB0


 
Jaxtor ©   (2003-06-03 12:19) [5]

>Sandman25 Вроде правильно. Спасибо!

Еще маленький вопрос, а как заносить эти значения для твоего варианта?

Я сделал так:

MaxColumnCount:=50;

For i:=1 to 20 do begin
Ch[1]:=0;
Ch[2]:=0;
Ch[3]:=0;
Ch[4]:=0;
Cycle:=False;
For j:=1 to MaxColumnCount do
If not (ParametersForm.FindComponent("CheckBox"+ IntToStr(i)+LettersArray[j])=nil) then begin
If (ParametersForm.FindComponent("CheckBox"+ IntToStr(i)+LettersArray[j]) as TCheckBox).checked then Ch[j]:=1
else Ch[j]:=0;
Cycle:=True;
end;

If Cycle then CharacteristicsArray[i]:=1*Ch[1]+2*Ch[2]+4*Ch[3];

end;

Как избавиться от ошибки?


 
Jaxtor ©   (2003-06-03 12:26) [6]

If Cycle then CharacteristicsArray[i]:=4*Ch[3]+2*Ch[2]+1*Ch[1];

При таком коде все работает для 3-х CheckBox"ов...

Проще нельзя?


 
Sandman25 ©   (2003-06-03 12:26) [7]

for i:= 1 to 20 do
begin
CharacteristicsArray[i] := 0;
for j := 0 to MaxColumnCount-1 do
If ParametersForm.FindComponent("CheckBox"+ IntToStr(i)+LettersArray[j])<>nil then begin
If (ParametersForm.FindComponent("CheckBox"+ IntToStr(i)+LettersArray[j]) as TCheckBox).checked then
CharacteristicsArray[i]:= CharacteristicsArray[i] + 1 shl j;
end;

end;


 
Sandman25 ©   (2003-06-03 12:28) [8]

Там немного подправить надо, но общую идею Вы можете понять.


 
Jaxtor ©   (2003-06-03 12:35) [9]

>Sandman25
Спасибо. Операция shl почему-то напроч вылетела из моей головы...


 
Sandman25 ©   (2003-06-03 12:37) [10]

Можно и без shl.
Перед внутренним циклом factor := 1;
внутри цикла factor := factor * 2; Хотя быстрее factor := factor shl 1;



Страницы: 1 вся ветка

Текущий архив: 2003.06.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
7-50550
SalCroW
2003-04-10 17:00
2003.06.16
Корзина и файлы!


3-50207
гончий
2003-05-26 11:12
2003.06.16
Как правильно удалить поле в таблице MSSQL?


8-50404
greenrul
2003-03-03 20:10
2003.06.16
Как понизить системную громкость?


6-50428
Snuk
2003-04-11 16:51
2003.06.16
измерить скорость локальной сети


7-50544
Seb_Kost
2003-04-07 09:28
2003.06.16
Проблемка с TurboAsync