Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
ВнизУправление доступностью кнопок, как организовать? Найти похожие ветки
← →
Kolan © (2007-05-14 21:22) [0]Здравствуйте,
Ситуация есть, допустим, семь кнопок на ToolBar"е. Внутри разных операций надо изменять их доступность.
Вопрос, как это сделать красиво?
Отвратительное решение — сделать метод:
EnableToolButtons(False, True, False, False, False, False, False);
При изменении кол-ва кнопок метод надо переписывать.
ЗЫ
Сижу смотрю на медиатор — вроде он не подходит… :(
← →
Плохиш © (2007-05-14 21:36) [1]
> EnableToolButtons([False, True, False, False, False, False, False]);
Но я бы сделал на TAction...
← →
Loginov Dmitry © (2007-05-14 21:38) [2]Вообще желательно использовать TActionList, и изменять Enableb не кнопкам, а Экшенам. Кнопочки при этом (в общем случае) становятся более послушными :)
> Отвратительное решение — сделать метод:
> EnableToolButtons(False, True, False, False, False, False,
> False);
> При изменении кол-ва кнопок метод надо переписывать.
Другой способ: EnableToolButtons(ButArray: array of TButton; Enabled: Boolean);
← →
Leonid Troyanovsky © (2007-05-14 21:39) [3]
> Kolan © (14.05.07 21:22)
> Ситуация есть, допустим, семь кнопок на ToolBar"е. Внутри
> разных операций надо изменять их доступность.
TAction Class, RTFM.
Если не устраивает, то надо менятьчто-то на уровне Toolbar.
Or TFormX.
--
Regards, LVT.
← →
Kolan © (2007-05-14 21:42) [4]> Вообще желательно использовать 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);
← →
Kolan © (2007-05-14 21:46) [5]Да я хочу подправить проект один небольшой. Там несколько однотипных функций:
Кноки работают в вкл/выкл режиме. Те если нажата, то что-то делает программа.
Комментарии написал сейчас…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;
Непорядок так делать имхо. Как поправить?
← →
Leonid Troyanovsky © (2007-05-14 21:53) [6]
> Kolan © (14.05.07 21:46) [5]
> Непорядок так делать имхо. Как поправить?
ХЗ.
Возможно, что путем установления
TFormX.EnableGroupOfButtons..property
--
Regards, LVT.
← →
Kolan © (2007-05-14 22:01) [7]> ХЗ.
Там их ужо 5 штук. И мне надо еще добавить. Вот и решил про рефакторить.
А так получится надо будет скопипастить и расширить список переменных — :(
← →
Leonid Troyanovsky © (2007-05-14 22:05) [8]
> Kolan © (14.05.07 22:01) [7]
> Там их ужо 5 штук. И мне надо еще добавить.
Дык, проанализируй, куда, и на каком уровне.
Т.е., чьего поля сущность.
--
Regards, LVT.
← →
Kolan © (2007-05-14 22:16) [9]> Т.е., чьего поля сущность.
Ниче не понял как какие поля?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:33) [10]
> Kolan © (14.05.07 22:16) [9]
> > Т.е., чьего поля сущность.
> Ниче не понял как какие поля?
Чьего поля ягода - так понятней?
--
Regards, LVT.
← →
Kolan © (2007-05-14 23:43) [11]> Чьего поля ягода — так понятней?
Аааа, вот оно что… — нет все равно не понял.
На грибы что ли намекаете? :)
← →
Kolan © (2007-05-15 09:26) [12]Начал с того, что подменяю Action. Те избавился от
if not HeadManager.IsOperating then //Если не работаем
begin
А как сделать чтобы при задании Action"а не менялась Caption кнопки?
← →
Gadenysh (2007-05-15 09:44) [13]поставить нужный Caption Action - у
← →
StriderMan © (2007-05-15 12:10) [14]я бы сделал перечисление под кнопки типа
TMyButtonType = (bt1, bt2...)
и TSetMyButtonType = set of TMyButtonType
соответственно процедурка принимает сет из, например, жоступных в данный момент кнопок.
← →
Kolan © (2007-05-15 13:32) [15]> я бы сделал перечисление под кнопки типа
Ок. Это наверно лучьше всего.
← →
Kolan © (2007-05-15 19:07) [16]Давайте проделжем тему.
Как же все таки управлять интерфейсом?
Допустим есть у программы два состояния(2 — для простоты, на самом деле больше).
1. Ниче не делаю
2. Работаю.
В режиме работы у программы должны быть Enabled = Fasle некоторые кнопки.
Как это сделать?
1. Вариант как в этом собже. То естьDisable-работа-Enable
пишется там где это надо.
2. Вариант сделать у объекта который собственно и выполняет работу событие, типа: «Я перешел в состояние работа» и по возниконовении этого события делать Disable.
А как еще можно? Какие есть стандартные методы, приемы, паттерны…?
← →
Leonid Troyanovsky © (2007-05-15 21:01) [17]
> Kolan © (15.05.07 19:07) [16]
> А как еще можно? Какие есть стандартные методы, приемы,
Не знаю насчет паттернов, но, по-старинке, это делалось так:
предположим, что у формы есть конечное число состояний,
каждое из которых определяет некую комбинацию допустимых
состояний ее контролов.
Тогда, делаем форме property и сеттер, который согласованно
меняет состояние ее контролов в зависимости от устанавливаемого
состояния формы. Т.к. свойство принадлежит форме, то оно
доступно в любых ее обработчиках - несогласованных состояний
больше нет.
А к чему относить эти свойства: к форме, к тулбару или к ХЗЧ
и был мой вопрос. Т.е., вовсе не про грибы (отсель :).
--
Regards, LVT.
← →
Kolan © (2007-05-15 22:18) [18]> но, по-старинке, это делалось так:
Ок, это то что я подразумевал под пунктом два.
НачертитьStateChart
(чтобы понять состояния) и СделатьTEnumeration = (eState1, eState2 …)
А потом устанавливать. А в сеттере бОльшойcase
.
Правильно ли я понял?
Хоть теперь буду знать что так делают. Интересно как в том же BDS переключаются состояния(Degug, Normal{писал названия по памяти}).
← →
Leonid Troyanovsky © (2007-05-15 23:28) [19]
> Kolan © (15.05.07 22:18) [18]
> Правильно ли я понял?
Мы не знаем, что было понято по поводу ягод.
--
Regards, LVT.
← →
Kolan © (2007-05-16 09:25) [20]> А к чему относить эти свойства: к форме, к тулбару или к
> ХЗЧ
> и был мой вопрос
Ну вы выше написали про форму. Имхо — нормальный вариант. Те к форме.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.059 c