Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

Переключение на другую страницу в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.037 c
9-1083958157
ArchangelM
2004-05-07 23:29
2004.08.29
Engine


14-1092117931
Jenek
2004-08-10 10:05
2004.08.29
Температура Процессора


4-1089994372
Dir
2004-07-16 20:12
2004.08.29
OpenDir


14-1092145018
Cosinus
2004-08-10 17:36
2004.08.29
Алгоритм нахождения "магического квадрата" N-ой размерности


3-1091516462
Alex_Bredin
2004-08-03 11:01
2004.08.29
Description





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский