Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2013, 12:08   #1
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию Вопрос по PageControl

Как в событие OnChanging можно получить индекс на странницу на которую хочешь переключиться.
Alexandr17-10 вне форума Ответить с цитированием
Старый 31.08.2013, 10:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Какая необходимость его определять? С помощью TabVisible можено управлять доступностью вкладок. По другому куча вариантов - переход мышью, стрелками влево-вправо, по горячей клавише, мб еще, не помню. Мышинный переход просто отловить, например, так:
Код:
procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
var xPos: TPoint;
begin
  xPos:=PageControl1.ScreenToClient(Mouse.CursorPos);
  ShowMessage(Format('Индекс перехода %d',[PageControl1.IndexOfTabAt(xPos.X,xPos.Y)]));
end;
Другие способы - наверно переопределять WndProc паджеконтрола и там заморачиваться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.08.2013, 10:42   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мышинный переход просто отловить
Это событие должно не только для мышки сработать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2013, 10:47   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Оно и сработает, но индекс при переходе другими способами приведенный код не определит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.09.2013, 09:33   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Добавил обработку других возможностей перехода (если не упустил еще чего нибудь). В OnChanging индекс страницы, на которую переход - в NewIndexTab
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TPageControl = class(ComCtrls.TPageControl)
  private
    lNewIndexTab: Integer;
    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
    procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
    procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
  public
    property NewIndexTab: Integer read lNewIndexTab;
  end;
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    Memo: TMemo;
    procedure PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
    procedure PageControl1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{TPageControl}

procedure TPageControl.CMDialogChar(var Message: TCMDialogChar);
{Переход по горячей клавише}
var i: Integer;
begin
  for i:=0 to PageCount-1 do
    if IsAccel(Message.CharCode,Tabs[i]) and CanShowTab(I) and CanFocus then begin
      lNewIndexTab:=i;
      Break;
    end;
  inherited;
end;

procedure TPageControl.CMDialogKey(var Message: TCMDialogKey);
{Переход по Ctrl-Tab}
var Page: TTabSheet;
begin
  if (Focused or Windows.IsChild(Handle,Windows.GetFocus)) and
     (Message.CharCode=VK_TAB) and
     (GetKeyState(VK_CONTROL)<0) then begin
    Page:=FindNextPage(ActivePage,GetKeyState(VK_SHIFT)>=0,True);
    if (Page<>nil) and (Page<>ActivePage) then lNewIndexTab:=Page.TabIndex;
  end;
  inherited;
end;

procedure TPageControl.CNKeyDown(var Message: TWMKeyDown);
{Переход клавишами Влево, Вправо}
var Page: TTabSheet;
begin
  if (Message.CharCode=VK_LEFT) or (Message.CharCode=VK_RIGHT) then begin
    Page:=FindNextPage(ActivePage,Message.CharCode=VK_RIGHT,True);
    if (Page<>nil) and (Page<>ActivePage) then lNewIndexTab:=Page.TabIndex;
  end;
  inherited;
end;

procedure TPageControl.WMMouseActivate(var Message: TWMMouseActivate);
{Переход мышью}
var xPos: TPoint;
begin
  inherited;
  xPos:=ScreenToClient(Mouse.CursorPos);
  lNewIndexTab:=IndexOfTabAt(xPos.X,xPos.Y)
end;

{TForm1}

procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
begin
  if (PageControl1.NewIndexTab>=0) and
     (PageControl1.NewIndexTab<PageControl1.PageCount)
    then Memo.Lines.Add(Format('Переход на - %s [%d]',[PageControl1.Pages[PageControl1.NewIndexTab].Caption,PageControl1.NewIndexTab]))
    else Memo.Lines.Add('???');
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  Memo.Lines.Add(Format('Текущее состояние - %s [%d]',[PageControl1.ActivePage.Caption,PageControl1.ActivePage.TabIndex]));
  Memo.Lines.Add('');
end;

end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.09.2013, 09:41   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а просто сравнивать activepage c tabsheet не?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.09.2013, 09:47   #7
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

а так не покатит?

Код:
procedure TForm3.PageControl1Change(Sender: TObject);
begin
  caption := inttostr(PageControl1.ActivePageIndex);
end;
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 10.09.2013, 09:51   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так в том и проблема - в OnChanging известна текущая страница, она же с которой переход и не известна страница, на которую переход будет осуществляться. Хотя все это пустышка - TabVisible и без этого все решает. Тоха, речь не о OnChange, а о OnChanging. Разница очевидна
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.09.2013, 12:09   #9
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

Цитата:
Тоха, речь не о OnChange, а о OnChanging
извиняюсь, проглядел

а какова собственно задача, почему надо использовать именно это событие? может тут подскажут другое решение
Пишу на Delphi за еду

Последний раз редактировалось Toxa; 10.09.2013 в 12:11. Причина: опечатался
Toxa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pagecontrol subbota Компоненты Delphi 1 24.12.2012 20:05
PageControl Wrack C++ Builder 1 21.05.2012 06:03
PageControl Китти Компоненты Delphi 7 25.05.2011 08:22
Вопрос по PageControl Ziv4ik Помощь студентам 2 25.06.2009 18:06