Как проверить предыдущую вкладку при переходе от страницы к странице в элементе управления страницы? - PullRequest
2 голосов
/ 23 августа 2009

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

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

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

Спасибо.

Ответы [ 6 ]

5 голосов
/ 23 августа 2009

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

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

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

1 голос
/ 25 августа 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).

1 голос
/ 23 августа 2009

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

0 голосов
/ 25 августа 2009

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

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 @

0 голосов
/ 24 августа 2009

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

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

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

0 голосов
/ 24 августа 2009

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

...