Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Переключение на другую страницу в TPageControle   Найти похожие ветки 

 
3APA3A ©   (2004-08-10 19:14) [0]

То есть - как только юзер хочет переключится на какую-то страницу, то я должен сначала проверить - можно ли ему "туда", и если нет - никуда не переключать, выдать ругательное сообщение и оставить на той же странице.  Вариант с переключением, проверкой и если что - выкидыванием его на предыдущую страницу - не подходит...


 
Sun bittern ©   (2004-08-10 19:18) [1]

>> Вариант с переключением, проверкой и если что

Без проверки это как? Программа телепат?

OnChange


 
3APA3A ©   (2004-08-10 19:27) [2]

Не понял - без какой проверки?
 OnChange - Не подходит, т.к. сначала переключает а потом вызывает обработчик...


 
GanibalLector ©   (2004-08-10 19:30) [3]

А может проще использовать фреймы и TreeView очень эффектно получается.И проблемка твоя исчезает навсегда...


 
3APA3A ©   (2004-08-10 19:31) [4]

В принипе - подходит событие OnChanging, т.к. оно происходит перед переключением на другую страницу, но как мне в обработчике узнать, на какую страницу будет произведено подключение?


 
3APA3A ©   (2004-08-10 19:33) [5]

to GannibalLector - да, если это реализовать через Frames и TreeView - все получится так как надо и без особенных проблем.
 Но надо с помощью PageControl


 
Sun bittern ©   (2004-08-10 19:37) [6]

if TPageControl(Sender).TabIndex = 1 then TPageControl(Sender).TabIndex := 0;
???


 
QuasiLamo ©   (2004-08-10 19:40) [7]

попробуй сделать недозволенные табшиты невидимыми, свойство tabvisible у табшита


 
3APA3A ©   (2004-08-10 19:59) [8]

to Sun bittern
  Это ты предлагаешь в OnChange использовать?  Если да - то перечитай мой первый пост еще раз, а в особенности это Вариант с переключением, проверкой и если что - выкидыванием его на предыдущую страницу - не подходит

to QuasiLamo
  Нет... Так тоже нельзя...

to All
  Неужели нет средств узнать, на какую страницу "собрался" переключатся PageControl?


 
MacroDenS ©   (2004-08-10 20:03) [9]

щас просто нет делфы проверить,не помню, у табшита есть свойство визибл.


 
MacroDenS ©   (2004-08-10 20:03) [10]

если есть, может просто когда пользователь без прав лазит хайдить все что не для него???


 
3APA3A ©   (2004-08-10 20:12) [11]

to MacroDenS  
  1) Да есть, есть у него это свойство... Я в курсе... =)  Но это не подходит...
  2) см. выше


 
MacroDenS ©   (2004-08-10 20:22) [12]


Неужели нет средств узнать, на какую страницу "собрался" переключатся PageControl?

По любому, прежде чем это отловить, пользователь должен кликнуть на нужном табшите...

Событие OnChanging (не OnChange! пробовал обрабатывать?


 
3APA3A ©   (2004-08-10 20:39) [13]

Да, это событие происходит тогда, когда надо, единственная проблема - узнать, куда именно он собрался переключится...


 
MacroDenS ©   (2004-08-10 20:53) [14]

ладно, я уже домой пошел...
попробую ночью эту темку поковырять...
Может что и придумаю....


 
Sun bittern ©   (2004-08-10 21:57) [15]

3APA3A ©   (10.08.04 20:39) [13]

А чем собственно так не нравится откат на предыдущую пагу???
OnChanging
Проверяй условия и выставляй соответсвенно AllowChange


 
3APA3A ©   (2004-08-10 22:29) [16]

Ситуация - на OnShow у страницы висит довольно долгая процедура инициализации и переключатся на эту страницу а потом делать проверку и выкидывать на пред. - некорректно. Поэтому событие OnChange не подходит.
 OnChanging подходит по все статьям, но (повторяю в 3 раз) как мне в обработчике OnChanging узнать, куда PageControl собирается переключится?


 
Алхимик ©   (2004-08-10 22:57) [17]

Попробуй
function GetHitTestInfoAt(X, Y: Integer): THitTests;


 
SergP ©   (2004-08-10 23:05) [18]

А не проще ли все-таки не показывать те вкладки куда юзеру не нужно соваться?


 
3APA3A ©   (2004-08-11 00:17) [19]

to Алхимик
   Щас попробую...
 to SergP
   Это решение проблемы в общем, примерно так же как и [3], но меня интересует решение именно той конкретной задачи, что я описал...


 
MacroDenS ©   (2004-08-11 14:22) [20]

посмотри вот это:
http://d-mds.narod.ru/PCEx.rar (165136 Б)


 
RDen   (2004-08-11 15:00) [21]

Sun bittern ©   (10.08.04 21:57) [15] уже ведь ответил

procedure TForm1.PageControl1Changing(Sender: TObject;
 var AllowChange: Boolean);
begin
if условие не выполнено Then  AllowChange := false
end;


 
RDen   (2004-08-11 15:06) [22]

извините не обратил внимания на
>3APA3A ©   (10.08.04 22:29) [16]


 
MacroDenS ©   (2004-08-11 16:00) [23]

to RDen   (11.08.04 15:00) [21]
уже теплее, но только, я пол ночи пытался найти способ что все уместилось в одном обработчике...
Решение нашел, только автор ветки пока не откликается...
Как откликнется, исходник выложу...


 
46_55_41_44 ©   (2004-08-11 16:42) [24]

Лучше сделать так (я например так делал!):
procedure TForm1.FormCreate(Sender: TObject);
var
 i : Integer;
begin
...
 for i := 0 to PageControl1.PageCount - 1 do
   PageControl1.Pages[i].TabVisible := False;
...
end;

Потом... на каждый таб снизу поставить кнопку и в ее OnClick проверять, все что угодно... А после того как проверили переключать Tab:

procedure  TForm1.Button1Click(Sender: TObject);
begin
 //проверьте здесь условия
 ...
 PageControl1.ActivePageIndex := 0..PageControl1.PageCount - 1;
end;

вот... есессно можно написать универсальную функцию, но это уже твое дело!


 
MacroDenS ©   (2004-08-11 16:59) [25]

Иногда бывает так, что формулировка задачи звучит четко и однозначно.

Автор откликнулся, правда пока насчет исходника ничего не ответил... будем ждать...


 
KSergey ©   (2004-08-11 17:01) [26]

> [25] MacroDenS ©   (11.08.04 16:59)
> Иногда бывает так, что формулировка задачи звучит четко
> и однозначно.

Однако в рамках ее формулировки не всегда существует решение ;)


 
MacroDenS ©   (2004-08-11 17:03) [27]

По крайней мере по этому сабжу, я нашел решение...
см. [20]


 
KSergey ©   (2004-08-11 17:05) [28]

> [27] MacroDenS ©   (11.08.04 17:03)

А че ломаться-то как девочка? Может еще кому пригодиться?


 
MacroDenS ©   (2004-08-11 17:07) [29]

да не вопрос...
вот исходники (сырец):
http://d-mds.narod.ru/PCEx-source.rar


 
KSergey ©   (2004-08-11 17:11) [30]

Эх, сюда бы кусочек клюючевой... (ну проще так)


 
MacroDenS ©   (2004-08-11 17:13) [31]


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

type
 TMain = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   TabSheet3: TTabSheet;
   TabSheet4: TTabSheet;
   TabSheet5: TTabSheet;
   TabSheet6: TTabSheet;
   TabSheet7: TTabSheet;
   TabSheet8: TTabSheet;
   TabSheet9: TTabSheet;
   TabSheet10: TTabSheet;
   TabSheet11: TTabSheet;
   TabSheet12: TTabSheet;
   GroupBox1: TGroupBox;
   chbLock0: TCheckBox;
   chbLock1: TCheckBox;
   chbLock3: TCheckBox;
   chbLock2: TCheckBox;
   chbLock5: TCheckBox;
   chbLock4: TCheckBox;
   chbLock11: TCheckBox;
   chbLock10: TCheckBox;
   chbLock9: TCheckBox;
   chbLock8: TCheckBox;
   chbLock7: TCheckBox;
   chbLock6: TCheckBox;
   procedure PageControl1Changing(Sender: TObject;
     var AllowChange: Boolean);
   procedure PageControl1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure PageControl1Change(Sender: TObject);
   procedure chbLock0Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Main: TMain;
 _lock:Boolean;// Флаг блокировки перехода на вкладку
 Locks:array[0..11] of Boolean;// Флаги заблокированных вкладок

implementation

{$R *.dfm}

procedure TMain.FormCreate(Sender: TObject);
var
  i:integer;// счетчик
begin
  PageControl1.ActivePageIndex:=0;// выставляем активную вкладку
  chblock0.Enabled:=false;// активную вкладку лучше не блокировать
  for i:=0 to 11 do
     Locks[i]:=false;// обнуляем блокировку для всех вкладок
end;

// Что бы не расписывать n-е количество одинаковых процеду,
// воспользуемся одной универсальной
procedure TMain.chbLock0Click(Sender: TObject);
var
  s:String;
begin
// Узнаем имя чекбокса, с которого была вызвана процедура
  s:=(Sender as TCheckBox).Name;
// вытаскиваем номер
  s:=Copy(s, 8, length(s)-7);
// проверяем состояние чекбокса с номером S
  if (FindComponent("chblock"+s) as TCheckBox).Checked then
// если флаг установлен, блокируем соответствующую вкладку
     LockS[StrToInt(s)]:=true
  else
// если флага нет или снят, вкладку нужно разблокировать
     LockS[StrToInt(s)]:=False;
end;

procedure TMain.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
var
  m, n:Integer;// вспомогательные переменные левой и правой
               // границ вкладок
  i:Integer;// счетчик
begin
  for i:= 0 to 11 do
  begin
     m:=PageControl1.TabRect(i).left;//левая граница вкладки
     n:=PageControl1.TabRect(i).Right;//правая граница вкладки
// проверяем, блокирована ли страница и попадает ли Х-вая
// координата мыши в интервал от m до n
     if (Locks[i]=true) and ((x>=m) and (x<=n)) then
     begin
// если да, блокируем переключение вкладок
// и выходим из цикла
        _lock:=true;
        break;
     end
     else
// если нет, вкладка должна переключиться
        _lock:=false;
  end;
end;

procedure TMain.PageControl1Changing(Sender: TObject;
 var AllowChange: Boolean);
begin
  allowChange:= not _Lock; //Блокируем или разрешаем переход на вкладку
end;

procedure TMain.PageControl1Change(Sender: TObject);
var
  i:integer;
begin
  for i:=0 to 11 do
     (FindComponent("chbLock"+IntToStr(i)) as TCheckBox).Enabled:=True;
  (FindComponent("chbLock"+IntToStr(PageControl1.ActivePageIndex)) as TCheckBox).Enabled:=false;
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.025 c
3-1091693072
Виктор
2004-08-05 12:04
2004.08.29
ХП


8-1086276830
Borealis
2004-06-03 19:33
2004.08.29
RIFF CDXA


14-1092234377
vecna
2004-08-11 18:26
2004.08.29
А вот зачем...


14-1091848578
Думкин
2004-08-07 07:16
2004.08.29
С днем рождения! 7 августа


8-1086870848
Damage
2004-06-10 16:34
2004.08.29
Максимальные размеры TBitMap