-
Имею в таблице текстовое поле "Param" для произвольных параметров. Для внутренних целей начал сохранять в это поле признаки в виде тегов '#изготовление#', '#маркировка#' Через некоторое время попросили сделать отображение и включение/выключение некоторых признаков посредством галочки. Добавил чекбоксы TCheckBox, повесил на OnClick вызов процедуры установки/удаления тэга, в AfterOpen датасета начальное присвоение: procedure TfrmOrder.cbMakeClick(Sender: TObject);
begin
SetMark(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 := ... Как присвоить начальное значение чекбоксу, не вызывая лишнего? Как разделить реакцию на клик мышкоклавой и загрузку значения из поля?
-
убрать онклик сделать все вернуть онклик
-
> Как присвоить начальное значение чекбоксу, не вызывая лишнего? > > Как разделить реакцию на клик мышкоклавой и загрузку значения > из поля?
В первом приближении и то и другое не возможно.
-
невозможно пишется слитно
-
Почему же нет? 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;
-
> ВладОшин © (04.07.17 09:00) [4]
> (Помню, давно, когда мне так показали, было.. открытие ))
А тебе не ClicksDisabled показывали, не?
-- Regards, LVT.
-
не, именно так )
скорее всего ClicksDisabled правильнее, конечно, но показывали именно так, откуда пошел интерес к T..Event, и как можно ловко менять реакцию, например, временно назначить перетаскивание, а потом вернуть как было, т.. что бы юзер мог элементы расположить как он видит их ,нажимая и таща, а потом вернуть всем нажатие
-
спасибо, помогло жаль, что для каждого чекбокса нужно прописывать вкл/выкл ОнКлик
-
Леонид подсказывает
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;
-
> ВладОшин © (04.07.17 19:37) [8]
Пять копеек добавлю.
Если их много, то, видимо, лучше сделать настоящего потомка, которому вывести ClicksDisabled в published. Можно и не устанавливать компонент в палитру, а создавать их динамически, ClicksDisabled включить в конструкторе, а Click; override.
Кста, если действовать динамически, то и обычному чекбоксу OnClick можно назначить после установки Checked. А возвращать же //on не обязательно, бо установленное не мешает, IMHO, обычному клику.
-- Regards, LVT.
-
Вынес все в одну процедуру Теперь все в одном месте отключается, перечекивается и восстанавливается procedure SetCheckBox(CheckBox : TCheckBox; Checked : Boolean);
var
OnClick: TNotifyEvent;
begin
OnClick:= CheckBox.OnClick;
CheckBox.OnClick := nil;
CheckBox.Checked := Checked;
CheckBox.OnClick := OnClick;
end;
|