Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

Управление доступностью кнопок, как организовать?   Найти похожие ветки 

 
Kolan ©   (2007-05-14 21:22) [0]

Здравствуйте,
 Ситуация есть, допустим, семь кнопок на ToolBar"е. Внутри разных операций надо изменять их доступность.
 Вопрос, как это сделать красиво?

Отвратительное решение — сделать метод:
 EnableToolButtons(False, True, False, False, False, False, False);
 При изменении кол-ва кнопок метод надо переписывать.

ЗЫ
 Сижу смотрю на медиатор — вроде он не подходит&#133 :(


 
Плохиш ©   (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.

Не понял&#133 Мне ненравится не 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]

Да я хочу подправить проект один небольшой. Там несколько однотипных функций:
Кноки работают в вкл/выкл режиме. Те если нажата, то что-то делает программа.

Комментарии написал сейчас&#133

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;
&#133


Что анализировать?
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]

> Чьего поля ягода — так понятней?

Аааа, вот оно что&#133 — нет все равно не понял.
На грибы что ли намекаете? :)


 
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.

А как еще можно? Какие есть стандартные методы, приемы, паттерны&#133?


 
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 &#133)
А потом устанавливать. А в сеттере бОльшой 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
2-1182477171
wesel
2007-06-22 05:52
2007.07.22
MDI приложения, переход по открытым окнам как по TASKBAR


1-1179298884
Влад
2007-05-16 11:01
2007.07.22
Проблема печати


15-1182391972
Slider007
2007-06-21 06:12
2007.07.22
С днем рождения ! 21 июня 2007 четверг


3-1175257148
DmitrichJ
2007-03-30 16:19
2007.07.22
Копирую из InterBase в MS SQL с фотографиями!


2-1183121226
TruePunk
2007-06-29 16:47
2007.07.22
как установить