Форум: "Основная";
Текущий архив: 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.033 c