Цитата:
Сообщение от митрий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 формы, а вместо этого заполнить прямо в дизайнере.