![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 - то надо гуглить примеры нормального перевода. Последний раз редактировалось 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"
|
|
#5
|
|||
|
|||
|
Цитата:
|
|
#6
|
||||
|
||||
|
В TMaskEdit вполне удобно.
|
|
#7
|
||||
|
||||
|
Цитата:
Код:
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)
| ||