Как проверить предыдущую вкладку при переходе со страницы на страницу в элементе управления страницами?

Я использую TPageControl со скрытыми вкладками TTabsheets, чтобы кадры, которые они содержат, выглядели сложенными, и создаю своего рода мастер, отображая другой кадр на разных этапах процесса.

Проблема в том, что после вызова "PageControl1.ActivePageIndex:= x;" для отображения следующего кадра, попав в новый кадр мне нужно знать как я сюда попал, т.е. какой кадр отображался ранее.

Если кто-то еще использовал фреймы в элементе управления страницей для создания мастера, как вы отслеживаете предыдущие/следующие фреймы?

Спасибо.


person Gulbahar    schedule 22.08.2009    source источник
comment
Вы не можете сохранить значение индекса предыдущей страницы в поле?   -  person idursun    schedule 23.08.2009
comment
Этот вопрос действительно не имеет ничего общего с кадрами. Это всего лишь компоненты, которые случайно оказались на вкладках. То, о чем вы спрашиваете, - это управление страницами и запись того, какая вкладка была ранее активной после смены страницы. Меняющееся событие - это то, что вы хотите.   -  person Argalatyr    schedule 23.08.2009
comment
заголовок и текст отредактированы, чтобы отразить мой предыдущий комментарий   -  person Argalatyr    schedule 23.08.2009
comment
Спасибо всем за большую помощь.   -  person Gulbahar    schedule 26.08.2009


Ответы (6)


В TPageControl есть событие OnChanging, которое вызывается перед изменением и позволяет отменить изменение, установив для параметра значение false.

Вы также можете использовать это событие, чтобы записать, какая страница была активной до изменения.

Однако я бы посоветовал вам сделать что-то, не так сильно связанное с компонентом графического интерфейса. Попробуйте создать какой-то класс, отвечающий за хранение кадров и проверку того, разрешено ли переходить от одного к другому и так далее. Это упростит переключение типа графического интерфейса, который вы будете использовать для визуализации мастера. И это, безусловно, облегчило бы проверку, чтобы увидеть, дает ли ваш мастер пошаговое продвижение, которое вы хотите, применяются ли правила проверки и так далее.

person Vegar    schedule 22.08.2009
comment
На самом деле, если для свойства TabVisible установлено значение false, событие OnChanging не вызывается (поскольку оно относится к вкладкам, а не к страницам). - person Nat; 25.08.2009
comment
@Nat, ваш комментарий относится только к определенным методам изменения активной страницы. Onchangeing срабатывает даже при tabvisible=false, как показано в моем ответе на этот вопрос. - person Argalatyr; 25.08.2009

На delphi.about.com есть статья о том, как создать мастер -подобный пользовательский интерфейс. Вы можете использовать метод TPageControl.SelectNextPage для перемещения вперед и назад по набору страниц.

person Erwin    schedule 22.08.2009

Вопреки ответу Ната, событие tpagecontrol.onchanging будет работать нормально, если вы используете правильные методы для смены страниц:

Создайте приложение форм VCL и перетащите его на TPageControl, установите для свойства Align значение alTop и оставьте немного места внизу. Щелкните правой кнопкой мыши PageControl и добавьте несколько страниц, установив TabVisible:=false для каждой. Теперь добавьте пару кнопок внизу. Прикрепите событие onchanging PageControl и события onclick кнопок к соответствующему коду ниже:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if PageControl1.ActivePageIndex < PageControl1.PageCount - 1 then
    PageControl1.SelectNextPage(true, false);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if PageControl1.ActivePageIndex > 0 then
    PageControl1.SelectNextPage(false, false);
end;

procedure TForm1.PageControl1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
  showmessage(format('now leaving page number %d', [PageControl1.ActivePageIndex]));
end;

Это работает, как и ожидалось (BDS2006, RAD2009).

person Argalatyr    schedule 25.08.2009
comment
Очевидно, вы можете перехватывать и использовать событие OnChange таким же образом. - person Argalatyr; 26.08.2009

Вы также можете взглянуть на компонент Wizard, который является частью библиотеки JEDI VCL.

person TheArtTrooper    schedule 24.08.2009

Я написал структуру мастера, которая делает почти то, что вы пытаетесь сделать. Большинство из них задокументировано в моем блоге. Решение, которое я использовал, заключалось в том, чтобы передать запрос на следующую/предыдущую страницу самому фрейму (используя интерфейсы) и позволить фрейму решить, каким должен быть следующий фрейм.

Если вы хотите объединить две идеи (сохранив tPageControl как есть), вы можете просто направить запрос в tPageControl.ActivePage, а для реализации NavigateToPage можно выполнить поиск страниц, которые вы назвали, а не пытаться найти конкретный сорт.

Дизайн моей структуры мастеров заключался в том, чтобы обрабатывать несколько сложных мастеров, которые содержали несколько путей, основанных на решениях, принятых на этом пути. Я сохранил предыдущие кадры в списке, и «состояние» каждого кадра было сохранено в глобально доступном классе, который очищался после завершения/отмены мастера.

person skamradt    schedule 24.08.2009

Вы должны отслеживать свой предыдущий индекс страницы вручную. Например, в обработчиках событий OnClick кнопок «Следующая» и «Предыдущая» вы можете сделать что-то вроде этого:

procedure TWizardForm.NextClick(ASender: TObject);
begin
  SwitchPage(True);
end;

procedure TWizardForm.PreviousClick(ASender: TObject);
begin
  SwitchPage(False);
end;

SwitchPage() будет выглядеть примерно так:

procedure TWizardForm.SwitchPage(AForward: boolean);
var
  LGotoPage: integer;
begin
  LGotoPage := PageControl.ActivePageIndex;

  if AForward and (PageControl.ActivePageIndex < PageControl.PageCount) then
    inc(LGotoPage)
  else if PageControl.PageIndex > 0 then
    dec(LGotoPage);

  if (LGotoPage <> PageControl.ActivePageIndex) 
    and AllowSwitchFrom(ActivePageIndex) then
  begin
    FPreviousPage := PageControl.ActivePageIndex;
    PageControl.ActivePageIndex :=  LGotoPage;
  end;

end;

Или что-то в этом роде. :)

Редактировать: Аргалатир прав, а я не прав в случае, когда вы хотите пройти через мастер в последовательном порядке, что, как я предполагаю, имеет место здесь.

Обработчик OnChanging действительно срабатывает, и страница, с которой вы переходите, является (все еще) активной страницей.

Событие OnChanging не срабатывает, когда вы устанавливаете индекс страницы напрямую, как в моем примере, поэтому вам нужно отслеживать старый индекс страницы. Это происходит из-за кодирования мастеров с необязательными страницами (не последовательными).

Я должен был проверить немного лучше, прежде чем я отправил. Извеняюсь за неправильный ответ.

N@

person Nat    schedule 25.08.2009
comment
Это не обязательно, см. мой ответ - person Argalatyr; 25.08.2009