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