![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление доступностью кнопок, как организовать?
Kolan © (2007-05-14 21:22:00)Здравствуйте,
Ситуация есть, допустим, семь кнопок на ToolBar'е. Внутри разных операций надо изменять их доступность.
Вопрос, как это сделать красиво?
Отвратительное решение сделать метод:
EnableToolButtons(False, True, False, False, False, False, False);
При изменении кол-ва кнопок метод надо переписывать.
ЗЫ
Сижу смотрю на медиатор вроде он не подходит :(
Kolan (2007-05-16 09:25:00) [1]> А к чему относить эти свойства: к форме, к тулбару или к
> ХЗЧ
> и был мой вопрос
Ну вы выше написали про форму. Имхо нормальный вариант. Те к форме.
Leonid Troyanovsky (2007-05-15 23:28:00) [2]
> Kolan © (15.05.07 22:18) [18]
> Правильно ли я понял?
Мы не знаем, что было понято по поводу ягод.
--
Regards, LVT.
Kolan (2007-05-15 22:18:00) [3]> но, по-старинке, это делалось так:
Ок, это то что я подразумевал под пунктом два.
НачертитьStateChart(чтобы понять состояния) и СделатьTEnumeration = (eState1, eState2 )
А потом устанавливать. А в сеттере бОльшойcase.
Правильно ли я понял?
Хоть теперь буду знать что так делают. Интересно как в том же BDS переключаются состояния(Degug, Normal{писал названия по памяти}).
Leonid Troyanovsky (2007-05-15 21:01:00) [4]
> Kolan © (15.05.07 19:07) [16]
> А как еще можно? Какие есть стандартные методы, приемы,
Не знаю насчет паттернов, но, по-старинке, это делалось так:
предположим, что у формы есть конечное число состояний,
каждое из которых определяет некую комбинацию допустимых
состояний ее контролов.
Тогда, делаем форме property и сеттер, который согласованно
меняет состояние ее контролов в зависимости от устанавливаемого
состояния формы. Т.к. свойство принадлежит форме, то оно
доступно в любых ее обработчиках - несогласованных состояний
больше нет.
А к чему относить эти свойства: к форме, к тулбару или к ХЗЧ
и был мой вопрос. Т.е., вовсе не про грибы (отсель :).
--
Regards, LVT.
Kolan (2007-05-15 19:07:00) [5]Давайте проделжем тему.
Как же все таки управлять интерфейсом?
Допустим есть у программы два состояния(2 для простоты, на самом деле больше).
1. Ниче не делаю
2. Работаю.
В режиме работы у программы должны быть Enabled = Fasle некоторые кнопки.
Как это сделать?
1. Вариант как в этом собже. То естьDisable-работа-Enableпишется там где это надо.
2. Вариант сделать у объекта который собственно и выполняет работу событие, типа: «Я перешел в состояние работа» и по возниконовении этого события делать Disable.
А как еще можно? Какие есть стандартные методы, приемы, паттерны ?
Kolan (2007-05-15 13:32:00) [6]> я бы сделал перечисление под кнопки типа
Ок. Это наверно лучьше всего.
StriderMan (2007-05-15 12:10:00) [7]я бы сделал перечисление под кнопки типа
TMyButtonType = (bt1, bt2...)
и TSetMyButtonType = set of TMyButtonType
соответственно процедурка принимает сетиз, например, жоступных в данный момент кнопок.
Gadenysh (2007-05-15 09:44:00) [8]поставить нужный Caption Action - у
Kolan (2007-05-15 09:26:00) [9]Начал с того, что подменяю Action. Те избавился от
if not HeadManager.IsOperating then //Если не работаем
begin
А как сделать чтобы при задании Action'а не менялась Caption кнопки?
Kolan (2007-05-14 23:43:00) [10]> Чьего поля ягода так понятней?
Аааа, вот оно что нет все равно не понял.
На грибы что ли намекаете? :)
Leonid Troyanovsky (2007-05-14 22:33:00) [11]
> Kolan © (14.05.07 22:16) [9]
> > Т.е., чьего поля сущность.
> Ниче не понял как какие поля?
Чьего поля ягода - так понятней?
--
Regards, LVT.
Kolan (2007-05-14 22:16:00) [12]> Т.е., чьего поля сущность.
Ниче не понял как какие поля?
procedure TMainForm.EnableToolButtons(Write, Read, Compare, Save, Delete, Menu,
OpenButton: Boolean);
begin
WriteImage.Enabled := Write;
ReadAction.Enabled := Read;
CompareImage.Enabled := Compare;
SaveImageToFile.Enabled := Save;
DeleteAction.Enabled := Delete;
Что анализировать?
if not HeadManager.IsOperating then //Если не работаем
begin
WriteToolButton.Down := True; //нажать кнопку
EnableToolButtons(True, False, False, False, False, False, False); //задизеблить все кроме той на которую нажали
try
HeadManager.WriteImage; // отработать
finally
EnableToolButtons(True, True, True, True, True, True, True); // в итоге все снова сделать доступным
WriteToolButton.Down := False; //Отжать кнопку
end;
end
else // если работаем,
begin
HeadManager.StopCurrentOperation; //то надо прекратить работу
WriteToolButton.Down := False; // отжать кнопку
EnableToolButtons(True, True, True, True, True, True, True); // все сделать доступными
end;
end;
Leonid Troyanovsky (2007-05-14 22:05:00) [13]
> Kolan © (14.05.07 22:01) [7]
> Там их ужо 5 штук. И мне надо еще добавить.
Дык, проанализируй, куда, и на каком уровне.
Т.е., чьего поля сущность.
--
Regards, LVT.
Kolan (2007-05-14 22:01:00) [14]> ХЗ.
Там их ужо 5 штук. И мне надо еще добавить. Вот и решил про рефакторить.
А так получится надо будет скопипастить и расширить список переменных :(
Leonid Troyanovsky (2007-05-14 21:53:00) [15]
> Kolan © (14.05.07 21:46) [5]
> Непорядок так делать имхо. Как поправить?
ХЗ.
Возможно, что путем установления
TFormX.EnableGroupOfButtons..property
--
Regards, LVT.
Kolan (2007-05-14 21:46:00) [16]Да я хочу подправить проект один небольшой. Там несколько однотипных функций:
Кноки работают в вкл/выкл режиме. Те если нажата, то что-то делает программа.
Комментарии написал сейчас
procedure TMainForm.DeleteActionExecute(Sender: TObject);
begin
if not HeadManager.IsOperating then
begin
DeleteToolButton.Down := True;
EnableToolButtons(False, False, False, False, True, False, False);
try
HeadManager.DeleteImage; //Собстевенно работа, в других местах тоже самое, только кнопка другая и эта операция.
finally
EnableToolButtons(True, True, True, True, True, True, True);
DeleteToolButton.Down := False;
end;
end
else
begin
HeadManager.StopCurrentOperation;
DeleteToolButton.Down := False;
EnableToolButtons(True, True, True, True, True, True, True);
end;
end;
Вот еще одна:
procedure TMainForm.WriteImageExecute(Sender: TObject);
begin
if not HeadManager.IsOperating then
begin
WriteToolButton.Down := True;
EnableToolButtons(True, False, False, False, False, False, False);
try
HeadManager.WriteImage;
finally
EnableToolButtons(True, True, True, True, True, True, True);
WriteToolButton.Down := False;
end;
end
else
begin
HeadManager.StopCurrentOperation;
WriteToolButton.Down := False;
EnableToolButtons(True, True, True, True, True, True, True);
end;
end;
Непорядок так делать имхо. Как поправить?
Kolan (2007-05-14 21:42:00) [17]> Вообще желательно использовать TActionList, и изменять Enableb
> не кнопкам, а Экшенам.
Это понятно :).
> TAction Class, RTFM.
> Если не устраивает, то надо менятьчто-то на уровне Toolbar.
> Or TFormX.
Не понял Мне ненравится не TAction а приведенный пример управления видимостью.
> EnableToolButtons([False, True, False, False, False, False,
> False]);
Действительно лучьше с одной стороны, а с другой непонятно какая где когда пишешь, а с параметрами понятно
EnableToolButtons(Write, Read, Compare, Save, Delete, Menu,
OpenButton: Boolean);
Leonid Troyanovsky (2007-05-14 21:39:00) [18]
> Kolan © (14.05.07 21:22)
> Ситуация есть, допустим, семь кнопок на ToolBar'е. Внутри
> разных операций надо изменять их доступность.
TAction Class, RTFM.
Если не устраивает, то надо менятьчто-то на уровне Toolbar.
Or TFormX.
--
Regards, LVT.
Loginov Dmitry (2007-05-14 21:38:00) [19]Вообще желательно использовать TActionList, и изменять Enableb не кнопкам, а Экшенам. Кнопочки при этом (в общем случае) становятся более послушными :)
> Отвратительное решение — сделать метод:
> EnableToolButtons(False, True, False, False, False, False,
> False);
> При изменении кол-ва кнопок метод надо переписывать.
Другой способ: EnableToolButtons(ButArray: array of TButton; Enabled: Boolean);
Плохиш (2007-05-14 21:36:00) [20]
> EnableToolButtons( [False, True, False, False, False, False, False ]);
Но я бы сделал на TAction...