| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Диалог в стиле wizard'a
В этой статье на простом примере я покажу, каким образом можно организовать в своей программе диалоговое окно с пошаговым выполнением (уточнением) какой-либо задачи (такое окно обычно называют мастером или визардом (от англ. wizard - волшебник, маг)). Наибольшее распространение мастера получили в программах-инсталляторах, а также в других программах, требующих для выполнения своей задачи строго определенной последовательности действий, которая (последовательность) может оказаться сложной для новичка. Существует немало способов решить нашу задачу, например, использовать для каждого шага собственную отдельную форму, фрейм, или панель, компонент TNotebook с закладки Win31 или более современный TPageControl. Есть даже готовые инструменты для создания такого рода диалогов. Выбор, в итоге, остается за вами, я же покажу некоторые принципы их построения на примере компонента TPageControl. Итак, кладем на форму компонент TPageControl и добавляем требуемое количество закладок. Я для примера создал пять закладок:
Первым делом нам предстоит избавиться от закладок: они позволяют произвольно переключаться между страницами, а это противоречит условию нашей задачи. Вот как это можно сделать: procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
// Прячем закладки. В принципе эту операцию можно выполнить
// и в Инспекторе объектов, но так будет более универсально
for i := 0 to PageControl1.PageCount-1 do
PageControl1.Pages[i].TabVisible := false;
// Делаем активной (видимой) первую страницу
PageControl1.ActivePageIndex := 0;
// Обновляем элементы управления
CheckChange(0);
end;
Процедура CheckChange(NewIdx: integer) является ключевой в программе: она изменяет состояние элементов управления текущей страницы мастера и вызывается всякий раз, когда пользователь переходит от предыдущей страницы к странице с индексом NewIdx. Вот как она реализована: procedure TForm1.CheckChange(NewIdx: integer);
begin
// Контролируем "крайние" закладки:
btBack.Enabled := NewIdx > 0;
btFrwrd.Enabled := NewIdx < PageControl1.PageCount-1;
// Кнопка "Готово" видна только на последней странице
btEnd.Visible := not btFrwrd.Enabled;
// Метка с сообщением, что предыдущая страница была пропущена
Label6.Visible := RadioGroup2.ItemIndex > 0;
// дополнительные проверки в зависимости от номера текущей страницы (закладки)
case NewIdx of
1: btFrwrd.Enabled := btFrwrd.Enabled and (RadioGroup1.ItemIndex > 0);
2: btFrwrd.Enabled := RadioGroup2.ItemIndex > -1;
3: if RadioGroup2.ItemIndex > 0 then
if GoBack then
PageControl1.SelectNextPage(false, false) else
PageControl1.SelectNextPage(true, false);
end;
end;
Логическая переменная GoBack позволяет определить направление переключения закладок: вперед или назад. Ее значение формируется в обработчиках соответствующих кнопок "Вперед" и "Назад": procedure TForm1.btFrwrdClick(Sender: TObject);
begin
GoBack := false;
PageControl1.SelectNextPage(true, false);
end;
procedure TForm1.btBackClick(Sender: TObject);
begin
GoBack := true;
PageControl1.SelectNextPage(false, false);
end;
Теперь посмотрим - когда же необходимо вызвать процедуру CheckChange() для обновления состояния элементов управления. В-первых, после смены любым способом активной страницы (TPageControl генерирует при этом событие OnChange): procedure TForm1.PageControl1Change(Sender: TObject);
begin
CheckChange(PageControl1.ActivePageIndex);
end;
Во-вторых, при изменении состояния групп радиокнопок (в вашей программе это, конечно, могут быть любые другие элеметы управления): procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
CheckChange(PageControl1.ActivePageIndex);
end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin
CheckChange(PageControl1.ActivePageIndex);
end;
Вот, в принципе, и все. Профессиональные мастера, конечно, используют намного более сложные алгоритмы изменения состояния элементов управления с более сложными переходами между страницами (если даже используют указанные нами страничные компоненты), но нам для получения минимального знания по созданию мастеров этого будет достаточно. Рубрика: Разные статьи
Подгрузка через AJAX HTML-кода, содержащег....
При разработке CMS S.Builder наша команда активно использовала AJAX. Теперь вот решили поделиться накопленным опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в S.Builder написана библиотека sbAJAX. Можете качать и пользоваться :). В этом файле есть функция sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет или полезут баги. Эта функция как раз решает поставленную задачу.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Обзор нового релиза самой мощной Ajax библ....
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все внимание на флагманский продукт — Dojo 1.2.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Firebug 1.3 и 1.4 alpha — что нового и инт....
Если вы профессиональный веб-разработчик и постоянно имеете дело с разработкой и отладкой сложных AJAX приложений, то наверняка знаете и используете Firebug — плагин для браузера Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем, которые могут возникнуть при разработке. Но и этот инструмент не лишён если не недостатков, то некоторых фич, которые могли бы облегчить работу. И даже идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.
Подробнее... |
Рубрика: Вебмастеру
| Добавлено: 19.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|