Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

загрузка значения в TCheckBox [D7, XP, 2003]


Дмитрий   (03.07.17 19:45

Имею в таблице текстовое поле "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;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо