Форум: "Начинающим";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
ВнизСохранение параметров программы одним числом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.009 c