![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение параметров программы одним числом [D7, WinXP]
kyn66 © (2009-11-05 12:16:00)Уважаемые мастера. Подскажите алгоритм сохранения параметров программы и последующее их извлечение. К примеру ситуация такая. Программа должна выполнять определенные действия в зависимости от дня недели. Т.е. в параметрах программы есть семь CheckBox
Понедельник
Вторник
Среда
... и т.д
каждый из которых соответственно может принимать значение True или False. Я могу назначить каждому дню(CheckBox) свои персональные условные номера 1 -:- 7. По какому алгоритму мне сохранить данные по этим параметрам одним числом(слыхал можно так) и потом считать его и решить, какой из CheckBox помечен, а соответственно и выполнить программу по тому или иному пути. Слыхал(но оооочень далеко) про такую науку комбинаторику. Это не из этой области?
Сергей М. (2009-11-05 14:39:00) [21]
> WeekDaysMask and (1 shl i) = 1;
Потому что это выражение истинно как раз только для Пн.
Для Вт. = 2
Для Ср. = 4
Для Чт. = 8
Выводы сделаешь сам или как ?)
Сергей М. (2009-11-05 14:32:00) [22]
> ваще ничего на помечается
А отладчик на что ?)
RWolf (2009-11-05 14:32:00) [23]потому что WeekDaysMask and (1 shl i) в общем случае не равно 1.
kyn66 (2009-11-05 14:26:00) [24]
> Оно как раз и соответствует набору, в составе которого
> есть Пн, Ср, Пт
Тогда почему CheckBox-ы не отмечаются? Получается код получения параметров или не правильно работает или.... даже не знаю
for i := 0 to 6 do
TCheckBox(FindComponent('CheckBox' + IntToSTr(i))).Checked := WeekDaysMask and (1 shl i) = 1;
При таком раскладе кода и значении 21 - помечается только Понедельник. Стоит отметить что либо среди недели(среда и пятница к примеру) - ваще ничего на помечается.
Сергей М. (2009-11-05 14:20:00) [25]
> одно и то же значение 21
Оно как раз и соответствует набору, в составе которого есть Пн, Ср, Пт
kyn66 (2009-11-05 14:11:00) [26]
> Сергей М. © (05.11.09 13:48) [13]
> Ну попробуй так:WeekDaysMask := WeekDaysMask or Byte(CheckBox.
> Checked) shl i
Сделал, ошибки нет, но результат не соответствует требуемому. Т.е. я к примеру отмечаю 0, 2, 4 (Пон., Сред, Пятн), Сохраняю. Повторно загружаю - помечен тока Понедельник (0). ПРи Сохранении и при получении данных WeekDaysMask имеет одно и то же значение 21 в данном случае.
Anatoly Podgoretsky (2009-11-05 13:56:00) [27]
> Пардон, просто она у меня по умолчанию в браузере стоит.
Сменить
Сергей М. (2009-11-05 13:48:00) [28]Ну попробуй так:
WeekDaysMask := WeekDaysMask or Byte(CheckBox.Checked) shl i
kyn66 (2009-11-05 13:43:00) [29]
> Сергей М. © (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:36:00) [30]
> Так было задумано
Конечно)
Считай что это было дом.задание)
kyn66 (2009-11-05 13:31:00) [31]
Сергей М. © (05.11.09 13:25) [9]
> Не думай что орешник вырос сам по себе)
:)... Кстати, а в приведенном коде ошибочка
CheckBox[i].Checked := WeekDaysMask and (1 shl i);
Булевому значению попытка присвоить Integer. Это конечно устранимо, но всетаки... Так было задумано или рука дрогнула?
Сергей М. (2009-11-05 13:25:00) [32]
> kyn66 © (05.11.09 13:15) [8]
> грамотно и доходчиво может донести их до других
Смотря до кого "нести".
Другие другим рознь.
Не думай что орешник вырос сам по себе)
kyn66 (2009-11-05 13:15:00) [33]
> 2Сергей М. © (05.11.09 13:10) [7]
Как обычно мастер на высоте! Не зря орден мастера присвоен! Спасибо, Сергей! Дальше уже сам!
PS
Мастер не тот, кто козыряет своими знаниями, а тот кто грамотно и доходчиво может донести их до других.
Тема закрыта.
Сергей М. (2009-11-05 13:10:00) [34]for i := 0 to 6 do
CheckBox[i].Checked := WeekDaysMask and (1 shl i);
kyn66 (2009-11-05 13:07:00) [35]
> Сергей М. © (05.11.09 13:00) [5]
Это мы схранили значения флагов CheckBox. Теперь нужно извлечь необходимые данные из WeekDaysMask и инициализировать CheckBox-ы полученными значениями.
> 2{RASkov} © (05.11.09 12:56) [4]
Классно, спасибо, изучаю...
Сергей М. (2009-11-05 13:00:00) [36]var
WeekDaysMask: Byte;
..
WeekDaysMask := 0;
for i := 0 to 6 do
WeekDaysMask := WeekDaysMask or (1 shl i and CheckBox[i].Checked);
{RASkov} (2009-11-05 12:56:00) [37]> [3] kyn66 © (05.11.09 12:48)
> Про это место можно подробнее?
http://www.podgoretsky.com/ddp/bits.aspx
kyn66 (2009-11-05 12:48:00) [38]
> И чего тебя так в "основную" тянет ? Как медом она для тебя
> намазана) .
Пардон, просто она у меня по умолчанию в браузере стоит.
> А далее в цикле бежишь по всем чекбоксам и взводишь/сбрасываешь
> в переменной соотв.биты
Про это место можно подробнее? С примером если можно, нагляднее воспринимается.
Сергей М. (2009-11-05 12:38:00) [39]И чего тебя так в "основную" тянет ? Как медом она для тебя намазана) ..
Вопросу-то самое место в "Начинающим" - самые азы затрагиваются ..
Сергей М. (2009-11-05 12:34:00) [40]
> могу назначить каждому дню(CheckBox) свои персональные условные
> номера 1 -:- 7
Лучше 0..6 - это будут индексы битовв переменной (например типа Byte), которая будет хранить состояние чекбоксов.
А далее в цикле бежишь по всем чекбоксам и взводишь/сбрасываешь в переменной соотв.биты в зависимости от зн-ний св-ва Checked каждого чекбокса.