Конференция "Начинающим" » загрузка значения в TCheckBox [D7, XP, 2003]
 
  • Дмитрий (03.07.17 19:45) [0]
    Имею в таблице текстовое поле "Param" для произвольных параметров.
    Для внутренних целей начал сохранять в это поле признаки в виде тегов '#изготовление#', '#маркировка#'
    Через некоторое время попросили сделать отображение и включение/выключение некоторых признаков посредством галочки.
    Добавил чекбоксы TCheckBox, повесил на OnClick вызов процедуры установки/удаления тэга, в AfterOpen датасета начальное присвоение:

    procedure TfrmOrder.cbMakeClick(Sender: TObject);
    begin
     SetMark(MarkMake);  // const MarkMake = '#изготовление#';
    end;

    procedure TfrmOrder.SetMark(const Mark : string);
    var
     s : string;
    begin
     if pos( Mark, adqrOrdersParam.AsString)=0 then
       s :=Mark + adqrOrdersParam.AsString
     else
       if Application.MessageBox(PChar('Пометка ' + Mark + ' уже установлена.'#13#10
               + 'Хотите снять пометку?'),'Внимание!',
             MB_YESNO + MB_DEFBUTTON2) = IDNO then
         exit
       else
         s := StringReplace(adqrOrdersParam.AsString, Mark, '', [rfReplaceAll, rfIgnoreCase]);
     adqrOrders.Edit;
     adqrOrdersParam.AsString := s;
    end;

    procedure TfrmOrder.adqrOrdersAfterOpen(DataSet: TDataSet);
    begin
     cbMake.Checked := (pos(MarkMake, adqrOrders.FieldValues ['Param'])>0);
    end;



    В результате, сразу после открытия формы при наличии тэга, выдается предупреждение "Хотите снять пометку".
    Т.е. OnClick вызывается в результате   присвоения cbMake.Checked := ...
    Как присвоить начальное значение чекбоксу, не вызывая лишнего?
    Как разделить реакцию на клик мышкоклавой и загрузку значения из поля?
  • rrrrrr © (03.07.17 19:47) [1]
    убрать онклик
    сделать все
    вернуть онклик
  • Германн © (04.07.17 01:45) [2]

    > Как присвоить начальное значение чекбоксу, не вызывая лишнего?
    >
    > Как разделить реакцию на клик мышкоклавой и загрузку значения
    > из поля?

    В первом приближении и то и другое не возможно.
  • rrrrr © (04.07.17 08:37) [3]
    невозможно пишется слитно
  • ВладОшин © (04.07.17 09:00) [4]
    Почему же нет? Click будет после мышка-даун )
    Если мышка - молодец, не даун, и клавиатурная доска со справкой, то Click - не реальный клик

    --
    убрать онклик
    сделать все
    вернуть онклик

    это примерно так
    (Помню, давно, когда мне так показали, было.. открытие )) )

    procedure TfrmMain.ck1Click(Sender: TObject);
    begin
     ShowMessage(BoolToStr(ck1.Checked, true));
    end;

    procedure TfrmMain.btn2Click(Sender: TObject);
    var
     M: TNotifyEvent;
    begin
     M := ck1.OnClick;
     ck1.OnClick := nil;
     ck1.Checked := not(ck1.Checked);
     ck1.OnClick := M;
    end;
  • Leonid Troyanovsky © (04.07.17 10:27) [5]

    > ВладОшин ©   (04.07.17 09:00) [4]

    > (Помню, давно, когда мне так показали, было.. открытие ))

    А тебе не ClicksDisabled показывали, не?

    --
    Regards, LVT.
  • ВладОшин © (04.07.17 11:32) [6]
    не, именно так )

    скорее всего ClicksDisabled  правильнее, конечно,
    но показывали именно так, откуда пошел интерес к T..Event, и как можно ловко менять  реакцию, например, временно назначить перетаскивание, а потом вернуть как было, т.. что бы юзер мог элементы расположить как он видит их ,нажимая и таща, а потом вернуть всем нажатие
  • Дмитрий (04.07.17 15:48) [7]
    спасибо, помогло
    жаль, что для каждого чекбокса нужно прописывать вкл/выкл ОнКлик
  • ВладОшин © (04.07.17 19:37) [8]
    Леонид подсказывает

     TBC = class( TButtonControl );

     TBC(ck1).ClicksDisabled := True;
     ck1.Checked := not(ck1.Checked);

    procedure TfrmMain.btn2Click(Sender: TObject);
    var
     M: TNotifyEvent;
     i: Integer;
     C: TCheckBox;
    begin
    // всех вырубим
     for i :=0 to ComponentCount - 1 do
      if Components[i] is TCheckBox then
      begin
        C := TCheckBox ( Components[i]);
        TBC(C).ClicksDisabled := True;
      end;

     ck1.Checked := not(ck1.Checked);

     //on
     for i :=0 to ComponentCount - 1 do
    .. ClicksDisabled := false;
  • Leonid Troyanovsky © (05.07.17 18:11) [9]

    > ВладОшин ©   (04.07.17 19:37) [8]

    Пять копеек добавлю.

    Если их много, то, видимо, лучше сделать настоящего потомка,
    которому вывести ClicksDisabled в published.
    Можно и не устанавливать компонент в  палитру, а создавать их динамически,
    ClicksDisabled включить в конструкторе, а Click; override.

    Кста, если действовать динамически, то и обычному чекбоксу OnClick можно назначить после установки Checked.

    А возвращать же //on не обязательно, бо установленное не мешает,
    IMHO, обычному клику.

    --
    Regards, LVT.
  • Дмитрий (07.07.17 17:49) [10]
    Вынес все в одну процедуру
    Теперь все в одном месте отключается, перечекивается и восстанавливается

    procedure SetCheckBox(CheckBox : TCheckBox; Checked : Boolean);
    var
     OnClick: TNotifyEvent;
    begin
     OnClick:= CheckBox.OnClick;
     CheckBox.OnClick := nil;
     CheckBox.Checked := Checked;
     CheckBox.OnClick := OnClick;
    end;

 
Конференция "Начинающим" » загрузка значения в TCheckBox [D7, XP, 2003]
Есть новые Нет новых   [118609   +52][b:0][p:0.002]