Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2012, 01:54
митрийG митрийG вне форума
Прохожий
 
Регистрация: 27.10.2012
Сообщения: 12
Репутация: 10
По умолчанию преобразование двоичной в шестнадцатеричную (из чекбокс в едит)

Есть 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  
Старый 02.11.2012, 02:11
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

О майн гад. Скажи, З А Ч Е М нужны 16 чекбоксов?! Это требование программы или решение от безвыходности? Если 1 - то оптимизировать можно только убрав "else"-ы и использовав поиск компонентов через Tag например (причем вполне возможно оптимизация получится только по кол-ву строк, а не по скорости). Можно использовать состояние Checked в вычислениях, чтобы избавиться от IF-ов, но не факт, что это даст прирост скорости.
Если 2 - то надо гуглить примеры нормального перевода.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.11.2012 в 02:17.
Ответить с цитированием
  #3  
Старый 02.11.2012, 02:26
митрийG митрийG вне форума
Прохожий
 
Регистрация: 27.10.2012
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
О майн гад. Скажи, З А Ч Е М нужны 16 чекбоксов?! Это требование программы или решение от безвыходности? Если 1 - то оптимизировать можно только убрав "else"-ы и использовав поиск компонентов через Tag например (причем вполне возможно оптимизация получится только по кол-ву строк, а не по скорости). Можно использовать состояние Checked в вычислениях, чтобы избавиться от IF-ов, но не факт, что это даст прирост скорости.
Если 2 - то надо гуглить примеры нормального перевода.

Наверное больше от безвыходности
Есть железка (контроллер шаговых двигателей) инструкцие к ней на корейском, с помощью переводчика можно приблизительно понять о чем речь.
у железяки 8 регистров на вход и столько же на выход
Оптимизация для того чтобы не делать еще 15 таких процедур.
А вся эта бодяга для того, чтобы после запроса состояния железки были видны состояния управляющих битов.
И чтобы в рабочей программе не заниматься побитной сборкой числа, а сразу подставлять нужное значение (чертить битовые таблички и переводить самому из 2х в16х (или 10) просто лень)
Ответить с цитированием
  #4  
Старый 02.11.2012, 03:55
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А как насчёт edit, в котором будут только 1 или 0? И никаких костылей с CheckBox-ами, вызов одной процедуры преобразует строку вида '01101001' в Integer = 0x69 = 105. Функция гуглится по фразе "bin to dec delphi"
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 02.11.2012, 04:44
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от митрийG
у железяки 8 регистров на вход и столько же на выход
Оптимизация для того чтобы не делать еще 15 таких процедур.
Можно создать фрейм (TFrame), в который поместить все 16 TCheckBox и один TEdit. А на событие OnClick всех TCheckBox-ов привязать один единственный обработчик события:
Код:
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;
Ну и на OnCreate формы не забыть добавить заполнение всех TCheckListBox'ов примерно так:
Код:
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  
Старый 02.11.2012, 14:29
митрийG митрийG вне форума
Прохожий
 
Регистрация: 27.10.2012
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от PhoeniX
А как насчёт edit, в котором будут только 1 или 0? И никаких костылей с CheckBox-ами, вызов одной процедуры преобразует строку вида '01101001' в Integer = 0x69 = 105. Функция гуглится по фразе "bin to dec delphi"
Это первое что прихлдило в голову, но изменять конкретные биты не удобно.
Ответить с цитированием
  #7  
Старый 02.11.2012, 14:57
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

В TMaskEdit вполне удобно.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:33.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025