Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Настройки видимости компонентов, Машина состояний формы 
:(
    Опции темы
v00d00
Дата 30.5.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



Здравствуйте.
Я столкнулся с типичной или даже типовой задачей, которые часто возникают перед программистами.
Мне потребовалось настраивать контроль видимости и активности некторых компонент на форме в зависимости от значения поля записи в БД, и/или в зависимости от состояния в котором находится форма в данный момент. 
Первое что пришло на ум - реализовать машину состояний. И сделал я это так:

Код

procedure TOperatorForm.SwitchBlankOrdersFormState(
  State: TBlankOrdersManagerFormState);
begin
   //Здесь наиболее типичные для всех состояний значения видимости компонентов
    FPrevFormState := FCurFormState;
    FCurFormState := State;
    FinAccButton.Enabled:=false;
    LogoutButton.Enabled:=true;
    CancelBitBtn.Enabled:=false;
    AddAdToBlankButton.Enabled:=true;
    DeleteBlankAdButton.Enabled:=true;
    EditBlankAdButton.Enabled:=true;
    ExportButton.Visible:=false;
    LastClientButton.Visible:=false;
    CreateFreeAdsButton.Visible:=false;
    AcceptBitBtn.Enabled:=false;
    FBlankOrdersFormState:=State;
    StringCalcBitBtn.Enabled:=false;
    CancelPrintButton.Visible:=false;
    AddAdToBlankButton.Enabled:=true;
    EditBlankAdButton.Enabled:=true;
    DeleteBlankAdButton.Enabled:=true;

   case State of
     bofsBadSum:
       begin
         FBlankOrdersState:=bosErrorBadSum;
         AddAdToBlankButton.Enabled:=false;
         DeleteBlankAdButton.Enabled:=false;
         FormBlankOrdersLabel.Caption:='ЕСТЬ ОШИБКИ';
         FormBlankOrdersLabel.font.Color:=clRed;
       end;
     bofsClosing:
       begin
         FinAccButton.Visible:=false;
         LogoutButton.Visible:=false;
         CreateFreeAdsButton.Visible:=true;
         //LastClientButton.Visible:=true;

         ManagersDataSource.DataSet.First;
         //Зачистить поля ввода
         AllowCodeEdit.Text:='';
         BlankCodeEdit.Text:='';
         StringCalcBitBtn.Enabled:=false;
         LoadImageBitBtn.Enabled:=false;

       end;
     bofsEmpty:
      begin

        FormBlankOrdersLabel.Caption:='БЛАНК ОБЪЯВЛЕНИЙ ПУСТ';
        FormBlankOrdersLabel.font.Color:=clGray;

      end;
    bofsInitialized:
      begin

        FormBlankOrdersLabel.Caption:='БЛАНК НЕ ПОМЕЧЕН НА ПЕЧАТЬ';
        FormBlankOrdersLabel.font.Color:=clBlack;
        FinAccButton.Enabled:=true;
      end;
    bofsReadyToPublicate:
      begin

        FormBlankOrdersLabel.Caption:='БЛАНК ПОМЕЧЕН НА ПЕЧАТЬ';
        FormBlankOrdersLabel.font.Color:=clGreen;
        CancelPrintButton.Visible:=true;

      end;
   bofsInProcessCreate, bofsInProcessEdit,bofsCalculated:
      begin
        FormBlankOrdersLabel.Caption:='БЛАНК РЕДАКТИРУЕТСЯ';
        FormBlankOrdersLabel.font.Color:=clOlive;

        FinAccButton.Enabled:=false;
        LogoutButton.Enabled:=false;

        AddAdToBlankButton.Enabled:=false;
        DeleteBlankAdButton.Enabled:=false;
        EditBlankAdButton.Enabled:=false;
        CancelBitBtn.Enabled:=true;
        LogoutButton.Enabled:=false;
       // AcceptBitBtn.Enabled:=true;
        StringCalcBitBtn.Enabled:=true;
        LoadImageBitBtn.Enabled:=true;
        if State = bofsCalculated then
         begin
           AcceptBitBtn.Enabled:=true;
           //StringCalcBitBtn.Enabled:=false;
         end;

      end;
  end;
end;


По моему это не самый лучший и красивый вариант. Мне хотелось бы увидеть как Вы справляетесь с такого рода задачами.
PM MAIL   Вверх
Beltar
Дата 6.6.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Где-то на форуме я видел изящную реализацию, которую потом применил у себя.

Код

procedure TfmReports.SetCtrlsEnabled;
var Mask:Integer;
begin
Mask:=1 shl BG.ItemIndex;
seYear.Enabled:=(seYear.Tag and Mask)>0;
cbCheck.Enabled:=(cbCheck.Tag and Mask)>0;
{и т. д. всего штук 15 контролов и 5 отчетов, нумерую отчеты с 1 BG это TButtonGroup, с помощью которой выбираю отчет.
}
end;


Если контрол нужен для i-того отчета (состояния), то i-тый бит его тега равен 1. Все. Для задания видимости или энебельности можно тратится всего одна строка на контрол. Состояниям лучше назначить значения вида степеней двойки.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.