![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть 16 чекбоксов по OnClic на любом из чекбоксов нужно преобразовать их состояние в шестнадцатеричную систему и поместить в Edit.text
я сделал это в лоб: Код:
var d:integer; s:string; begin d:=0; if SDIAppForm.CheckBox1.Checked then d:=d+(1 shl 0) else d:=d+(0 shl 0); if SDIAppForm.CheckBox2.Checked then d:=d+(1 shl 1) else d:=d+(0 shl 1); if SDIAppForm.CheckBox3.Checked then d:=d+(1 shl 2) else d:=d+(0 shl 2); if SDIAppForm.CheckBox4.Checked then d:=d+(1 shl 3 ) else d:=d+(0 shl 3); if SDIAppForm.CheckBox5.Checked then d:=d+(1 shl 4 ) else d:=d+(0 shl 4); if SDIAppForm.CheckBox6.Checked then d:=d+(1 shl 5 ) else d:=d+(0 shl 5); if SDIAppForm.CheckBox7.Checked then d:=d+(1 shl 6 ) else d:=d+(0 shl 6); if SDIAppForm.CheckBox8.Checked then d:=d+(1 shl 7 ) else d:=d+(0 shl 7); if SDIAppForm.CheckBox9.Checked then d:=d+(1 shl 8 ) else d:=d+(0 shl 8); if SDIAppForm.CheckBox10.Checked then d:=d+(1 shl 9 ) else d:=d+(0 shl 9); if SDIAppForm.CheckBox11.Checked then d:=d+(1 shl 10 ) else d:=d+(0 shl 10); if SDIAppForm.CheckBox12.Checked then d:=d+(1 shl 11 ) else d:=d+(0 shl 11); if SDIAppForm.CheckBox13.Checked then d:=d+(1 shl 12 ) else d:=d+(0 shl 12); if SDIAppForm.CheckBox14.Checked then d:=d+(1 shl 13 ) else d:=d+(0 shl 13); if SDIAppForm.CheckBox15.Checked then d:=d+(1 shl 14 ) else d:=d+(0 shl 14); if SDIAppForm.CheckBox16.Checked then d:=d+(1 shl 15 ) else d:=d+(0 shl 15); s := Format('%0x',[d]); SDIAppForm.edit4.Text:=s; Нужно будет делать и обратное преобразование (по OnExit преобразовывать из Edit.text и заполнять чекбоксы, но над этим я пока не думал) |
#2
|
||||
|
||||
![]() О майн гад. Скажи, З А Ч Е М нужны 16 чекбоксов?! Это требование программы или решение от безвыходности? Если 1 - то оптимизировать можно только убрав "else"-ы и использовав поиск компонентов через Tag например (причем вполне возможно оптимизация получится только по кол-ву строк, а не по скорости). Можно использовать состояние Checked в вычислениях, чтобы избавиться от IF-ов, но не факт, что это даст прирост скорости.
Если 2 - то надо гуглить примеры нормального перевода. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 02.11.2012 в 02:17. |
#3
|
|||
|
|||
![]() Цитата:
Наверное больше от безвыходности Есть железка (контроллер шаговых двигателей) инструкцие к ней на корейском, с помощью переводчика можно приблизительно понять о чем речь. у железяки 8 регистров на вход и столько же на выход Оптимизация для того чтобы не делать еще 15 таких процедур. А вся эта бодяга для того, чтобы после запроса состояния железки были видны состояния управляющих битов. И чтобы в рабочей программе не заниматься побитной сборкой числа, а сразу подставлять нужное значение (чертить битовые таблички и переводить самому из 2х в16х (или 10) просто лень) |
#4
|
||||
|
||||
![]() А как насчёт edit, в котором будут только 1 или 0? И никаких костылей с CheckBox-ами, вызов одной процедуры преобразует строку вида '01101001' в Integer = 0x69 = 105. Функция гуглится по фразе "bin to dec delphi"
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
||||
|
||||
![]() Цитата:
Код:
procedure TFrame2.CheckBoxClick(Sender: TObject); var n, i: Integer; begin n := 0; for i := 16 downto 1 do begin n := n * 2; if (FindComponent('CheckBox' + IntToStr(i)) as TCheckBox).Checked then Inc(n); end; Edit1.Text := IntToHex(n, 4); end; После этого можно просто положить на главную форму 16 таких фреймов (для 8 регистров на вход и 8 на выход). Ещё вместо фреймов и чекбоксов можно воспользоваться компонентом TCheckListBox - ложим их 16 штук на форму и ещё 16 TEdit'ов. На событие OnClickCheck всех TCheckListBox'ов делаем один единственный обработчик: Код:
procedure TForm1.CheckListBoxClickCheck(Sender: TObject); var n, i: Integer; s: string; begin n := 0; for i := 15 downto 0 do begin n := n * 2; if (Sender as TCheckListBox).Checked[i] then Inc(n); end; // Теперь ищем TEdit с тем же порядковым номером примерно так: s := (Sender as TCheckListBox).Name; for i := Length(s) downto 1 do begin if not (s[i] in ['0'..'9']) then begin (FindComponent('Edit' + Copy(s, i + 1, MaxInt)) as TEdit).Text := IntToHex(n, 4); Break; end; end; end; Код:
procedure TForm1.FormCreate(Sender: TObject); var i, j: Integer; clb: TCheckListBox; begin for j := 1 to 16 do begin clb := FindComponent('CheckListBox' + IntToStr(j)) as TCheckListBox; for i := 0 to 15 do clb.Items.Add(IntToStr(i)); end; end; Также CheckBox'ы есть у компонента TListView. Принцип похож на предыдущий, с той лишь разницей, что у него ещё можно несколько колонок добавить и можно не заполнять его в OnCreate формы, а вместо этого заполнить прямо в дизайнере. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
митрийG (02.11.2012)
|
#6
|
|||
|
|||
![]() Цитата:
|
#7
|
||||
|
||||
![]() В TMaskEdit вполне удобно.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |