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

Вниз

Сохранение параметров программы одним числом   Найти похожие ветки 

 
kyn66 ©   (2009-11-05 12:16) [0]

Уважаемые мастера. Подскажите алгоритм сохранения параметров программы и последующее их извлечение. К примеру ситуация такая. Программа должна выполнять определенные действия в зависимости от дня недели. Т.е. в параметрах программы есть семь CheckBox

Понедельник
Вторник
Среда
... и т.д

каждый из которых соответственно может принимать значение True или False. Я могу назначить каждому дню(CheckBox) свои персональные условные номера 1 -:- 7. По какому алгоритму мне сохранить данные по этим параметрам одним числом(слыхал можно так) и потом считать его и решить, какой из CheckBox помечен, а соответственно и выполнить программу по тому или иному пути. Слыхал(но оооочень далеко) про такую науку комбинаторику. Это не из этой области?


 
Сергей М. ©   (2009-11-05 12:34) [1]


> могу назначить каждому дню(CheckBox) свои персональные условные
> номера 1 -:- 7


Лучше 0..6 - это будут индексы битов в переменной (например типа Byte), которая будет хранить состояние чекбоксов.

А далее в цикле бежишь по всем чекбоксам и взводишь/сбрасываешь в переменной соотв.биты в зависимости от зн-ний св-ва Checked каждого чекбокса.


 
Сергей М. ©   (2009-11-05 12:38) [2]

И чего тебя так в "основную" тянет ? Как медом она для тебя намазана) ..
Вопросу-то самое место в "Начинающим" - самые азы затрагиваются ..


 
kyn66 ©   (2009-11-05 12:48) [3]


> И чего тебя так в "основную" тянет ? Как медом она для тебя
> намазана) .


Пардон, просто она у меня по умолчанию в браузере стоит.

> А далее в цикле бежишь по всем чекбоксам и взводишь/сбрасываешь
> в переменной соотв.биты


Про это место можно подробнее? С примером если можно, нагляднее воспринимается.


 
{RASkov} ©   (2009-11-05 12:56) [4]

> [3] kyn66 ©   (05.11.09 12:48)
> Про это место можно подробнее?

http://www.podgoretsky.com/ddp/bits.aspx


 
Сергей М. ©   (2009-11-05 13:00) [5]

var
 WeekDaysMask: Byte;
..
WeekDaysMask := 0;
for i := 0 to 6 do
 WeekDaysMask := WeekDaysMask or (1 shl i and CheckBox[i].Checked);


 
kyn66 ©   (2009-11-05 13:07) [6]


> Сергей М. ©   (05.11.09 13:00) [5]


Это мы схранили значения флагов CheckBox. Теперь нужно извлечь необходимые данные из WeekDaysMask и инициализировать CheckBox-ы полученными значениями.


> 2{RASkov} ©   (05.11.09 12:56) [4]

Классно, спасибо, изучаю...


 
Сергей М. ©   (2009-11-05 13:10) [7]

for i := 0 to 6 do
CheckBox[i].Checked := WeekDaysMask and (1 shl i);


 
kyn66 ©   (2009-11-05 13:15) [8]


> 2Сергей М. ©   (05.11.09 13:10) [7]


Как обычно мастер на высоте! Не зря орден мастера присвоен! Спасибо, Сергей! Дальше уже сам!

PS
Мастер не тот, кто козыряет своими знаниями, а тот кто грамотно и доходчиво может донести их до других.

Тема закрыта.


 
Сергей М. ©   (2009-11-05 13:25) [9]


> kyn66 ©   (05.11.09 13:15) [8]


> грамотно и доходчиво может донести их до других


Смотря до кого "нести".
Другие другим рознь.
Не думай что орешник вырос сам по себе)


 
kyn66 ©   (2009-11-05 13:31) [10]


Сергей М. ©   (05.11.09 13:25) [9]
> Не думай что орешник вырос сам по себе)


:)... Кстати, а в приведенном коде ошибочка

 CheckBox[i].Checked := WeekDaysMask and (1 shl i);


Булевому значению попытка присвоить Integer. Это конечно устранимо, но всетаки... Так было задумано или рука дрогнула?


 
Сергей М. ©   (2009-11-05 13:36) [11]


> Так было задумано


Конечно)
Считай что это было дом.задание)


 
kyn66 ©   (2009-11-05 13:43) [12]


> Сергей М. ©   (05.11.09 13:36) [11]
> > Так было задуманоКонечно)Считай что это было дом.задание)


Спасибо. Оно выполнено

 // при инициализации
 for i := 0 to 6 do
  TCheckBox(FindComponent("CheckBox" + IntToSTr(i))).Checked := WeekDaysMask and (1 shl i) = 1;


А вот с сохранением какой то трабл, тут не пойму что за ошибка

// сохраняем
 WeekDaysMask := 0;
 for i := 0 to 6 do
  WeekDaysMask := WeekDaysMask or (1 shl i and TCheckBox(FindComponent("CheckBox" + IntToStr(i))).Checked);


Ошибка - [Error] Param.pas(78): Operator not applicable to this operand type


 
Сергей М. ©   (2009-11-05 13:48) [13]

Ну попробуй так:

WeekDaysMask := WeekDaysMask or Byte(CheckBox.Checked) shl i


 
Anatoly Podgoretsky ©   (2009-11-05 13:56) [14]


> Пардон, просто она у меня по умолчанию в браузере стоит.

Сменить


 
kyn66 ©   (2009-11-05 14:11) [15]


> Сергей М. ©   (05.11.09 13:48) [13]
> Ну попробуй так:WeekDaysMask := WeekDaysMask or Byte(CheckBox.
> Checked) shl i


Сделал, ошибки нет, но результат не соответствует требуемому. Т.е. я к примеру отмечаю 0, 2, 4 (Пон., Сред, Пятн), Сохраняю. Повторно загружаю - помечен тока Понедельник (0). ПРи Сохранении и при получении данных WeekDaysMask имеет одно и то же значение 21 в данном случае.


 
Сергей М. ©   (2009-11-05 14:20) [16]


> одно и то же значение 21


Оно как раз и соответствует набору,  в составе которого есть Пн, Ср, Пт


 
kyn66 ©   (2009-11-05 14:26) [17]


> Оно как раз и соответствует набору,  в составе которого
> есть Пн, Ср, Пт


Тогда почему CheckBox-ы не отмечаются? Получается код получения параметров или не правильно работает или.... даже не знаю

 for i := 0 to 6 do
  TCheckBox(FindComponent("CheckBox" + IntToSTr(i))).Checked := WeekDaysMask and (1 shl i) = 1;


При таком раскладе кода и значении 21 - помечается только Понедельник. Стоит отметить что либо среди недели(среда и пятница к примеру) - ваще ничего на помечается.


 
RWolf ©   (2009-11-05 14:32) [18]

потому что WeekDaysMask and (1 shl i) в общем случае не равно 1.


 
Сергей М. ©   (2009-11-05 14:32) [19]


> ваще ничего на помечается


А отладчик на что ?)


 
Сергей М. ©   (2009-11-05 14:39) [20]


> WeekDaysMask and (1 shl i) = 1;


Потому что это выражение истинно как раз только для Пн.
Для Вт. = 2
Для Ср. = 4
Для Чт. = 8

Выводы сделаешь сам или как ?)


 
Германн ©   (2009-11-05 14:41) [21]


> kyn66 ©   (05.11.09 13:07) [6]


> > 2{RASkov} ©   (05.11.09 12:56) [4]
>
> Классно, спасибо, изучаю...
>

Ой врешь.


 
kyn66 ©   (2009-11-05 14:45) [22]


> А отладчик на что ?)


Отладчиком отлавливаю конечное значение WeekDaysMask. В обоих случаях(сохранение после установки и загрузка) одинаковое число. В своей статье статье Anatoly Podgoretsky описывает работу с битами. Вот мы рассчитываем позицию бита для установки (1 shl Bit) А вот процедура установки значения

function SetBit(Src: Integer; bit: Integer): Integer;
   begin
     Result := Src or (1 shl Bit);
   end;

отличается от той, что в моем варианте

WeekDaysMask := WeekDaysMask or Byte(TCheckBox(FindComponent("CheckBox" + IntToStr(i))).Checked) shl i


или в данном случае мы через Byte(TCheckBox(FindComponent("CheckBox" + IntToStr(i))).Checked) приводим значение к 0 или 1? Я так это вижу.


 
RWolf ©   (2009-11-05 14:47) [23]

не отличается.


 
Сергей М. ©   (2009-11-05 14:49) [24]


> Отладчиком отлавливаю конечное значение WeekDaysMask


Он у тебя что, инвалид ? Он не в состоянии показать в любой момент времени значение произвольного интересующего выражения ?)


 
kyn66 ©   (2009-11-05 14:52) [25]


> Сергей М. ©   (05.11.09 14:39) [20]
> > WeekDaysMask and (1 shl i) = 1;Потому что это выражение
> истинно как раз только для Пн.Для Вт. = 2Для Ср. = 4Для
> Чт. = 8Выводы сделаешь сам или как ?)


Ага, точно, значит я неверно выполнил "домашнее задание". Не так исправил ошибку. Кстати действительно в калькуляторе клянул число 21 в двоичном виде имеет значение 10101, т.е. то что мне и нужно (Понедельник, Среда, Пятница) 8(


 
kyn66 ©   (2009-11-05 14:55) [26]


> 2Сергей М. ©


Сергей, эврика, я исправил! Все работает как надо. Да...
for i := 0 to 6 do
  TCheckBox(FindComponent("CheckBox" + IntToSTr(i))).Checked := Boolean(WeekDaysMask and (1 shl i));


Да.. иногда стоит немного поднапряч серое вещество...


 
Сергей М. ©   (2009-11-05 14:56) [27]


> значит я неверно выполнил "домашнее задание"


Прямо-таки картина Решетникова - "Опять двойка")


 
kyn66 ©   (2009-11-05 14:59) [28]

2Anatoly Podgoretsky

Большое спасибо за статью http://www.podgoretsky.com/ddp/bits.aspx. Очень поучительная. Однако при описании SHR – логический сдвиг вправо,... в тексте допущены ошибки. Ничего что я на них указал? ;)


 
kyn66 ©   (2009-11-05 15:02) [29]

Все, решение найдено, тема закрыта.

Всем мастерам большое спасибо!!!

Как говорил дедушка Ленин : "..Учиться, учиться и еще раз учиться".


 
Anatoly Podgoretsky ©   (2009-11-05 15:32) [30]

> kyn66  (05.11.2009 14:26:17)  [17]

Правильно расставь операторные скобки или не глядя в справку скажи, что будет в твоем случае для WeekDaysMask and (1 shl i) = 1

(WeekDaysMask and (1 shl i)) = 1 или WeekDaysMask and ((1 shl i) = 1)


 
Anatoly Podgoretsky ©   (2009-11-05 15:36) [31]

> kyn66  (05.11.2009 14:59:28)  [28]

Ничего, а где указал то и на что?


 
RWolf ©   (2009-11-05 15:45) [32]


> Anatoly Podgoretsky

там в абзаце про SHR два раза встречается «влево» вместо «вправо».


 
Anatoly Podgoretsky ©   (2009-11-05 15:51) [33]

> RWolf  (05.11.2009 15:45:32)  [32]

А это мелкая ошибка, глаз исправляет не читая.


 
Anatoly Podgoretsky ©   (2009-11-05 15:51) [34]

> RWolf  (05.11.2009 15:45:32)  [32]

Я даже знаю кто виноват - китайцы


 
kyn66 ©   (2009-11-05 17:06) [35]


Anatoly Podgoretsky ©   (05.11.09 15:51) [33]
> А это мелкая ошибка, глаз исправляет не читая.


Но тем не менее, неопытный начнет азы постигать, а там такая очепятка... Вот и получит знания неверные. А статья класс, мне понравилась.


Anatoly Podgoretsky ©   (05.11.09 15:32) [30]
> Правильно расставь операторные скобки или не глядя в справку
> скажи, что будет в твоем случае для WeekDaysMask and (1
> shl i) = 1(WeekDaysMask and (1 shl i)) = 1 или WeekDaysMask
> and ((1 shl i) = 1)


Хек.. подуать нужно. А сперва статью переварить.


 
Anatoly Podgoretsky ©   (2009-11-05 19:38) [36]


> RWolf ©   (05.11.09 15:45) [32]
>
> > Anatoly Podgoretsky
>
> там в абзаце про SHR два раза встречается «влево» вместо
> «вправо».

Ну глазастый, действительно есть ошибка, но только в aspx. Я исправил.


 
Anatoly Podgoretsky ©   (2009-11-05 20:06) [37]

> kyn66  (05.11.2009 17:06:35)  [35]

Эта опечатка неважная, дальше по тексту правильно и понятно, кроме того есть bits.doc там вообще правильно. Трудно будет получить неверные знания, если сможет получить, то ему нечего делать в наукоемких технологиях.


 
kyn66 ©   (2009-11-05 20:35) [38]


> кроме того есть bits.doc там вообще правильно


И где он есть? Откуда качнуть можно?


 
{RASkov} ©   (2009-11-05 20:43) [39]

> [38] kyn66 ©   (05.11.09 20:35)

http://www.podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.doc


 
kyn66 ©   (2009-11-05 20:46) [40]


> {RASkov} ©   (05.11.09 20:43) [39]


Как всегда своевременная подсказка. Спасибо!



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

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

Наверх




Память: 0.57 MB
Время: 0.015 c
15-1256372721
POOP
2009-10-24 12:25
2009.12.27
Paint.Net залитый прямоугольник


11-1192910949
Dodfr
2007-10-21 00:09
2009.12.27
ExptIntf.dcu not found


2-1257928226
1987
2009-11-11 11:30
2009.12.27
Handle s


2-1257592439
Rydell
2009-11-07 14:13
2009.12.27
Как в DATASET изменить Тип поля, из ftBLOB в ftGraphic, ftMemo, .


15-1256329810
Юрий
2009-10-24 00:30
2009.12.27
С днем рождения ! 24 октября 2009 суббота