Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1257165542
Andrewtitoff
2009-11-02 15:39
2009.12.27
DBComboBox


15-1256434719
Antoxa
2009-10-25 04:38
2009.12.27
Почему сайт "умер"..?


2-1257871099
vtur
2009-11-10 19:38
2009.12.27
Создание приложений с использованием DLL


1-1231370009
Danco
2009-01-08 02:13
2009.12.27
Как использовать таймер без формы?


15-1256553697
Урсулапов_
2009-10-26 13:41
2009.12.27
Свисток арбитра в руках болельщика





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский