![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переключение на другую страницу в TPageControle [D7]
3APA3A © (2004-08-10 19:14:00)То есть - как только юзер хочет переключится на какую-то страницу, то я должен сначала проверить - можно ли ему "туда", и если нет - никуда не переключать, выдать ругательное сообщение и оставить на той же странице. Вариант с переключением, проверкой и если что - выкидыванием его на предыдущую страницу - не подходит...
MacroDenS (2004-08-11 17:13:00) [1]
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.
KSergey (2004-08-11 17:11:00) [2]Эх, сюда бы кусочек клюючевой... (ну проще так)
MacroDenS (2004-08-11 17:07:00) [3]да не вопрос...
вот исходники (сырец):
http://d-mds.narod.ru/PCEx-source.rar
KSergey (2004-08-11 17:05:00) [4]> [27] MacroDenS © (11.08.04 17:03)
А че ломаться-то как девочка? Может еще кому пригодиться?
MacroDenS (2004-08-11 17:03:00) [5]По крайней мере по этому сабжу, я нашел решение...
см. [20]
KSergey (2004-08-11 17:01:00) [6]> [25] MacroDenS © (11.08.04 16:59)
> Иногда бывает так, что формулировка задачи звучит четко
> и однозначно.
Однако в рамках ее формулировки не всегда существует решение ;)
MacroDenS (2004-08-11 16:59:00) [7]Иногда бывает так, что формулировка задачи звучит четко и однозначно.
Автор откликнулся, правда пока насчет исходника ничего не ответил... будем ждать...
46_55_41_44 (2004-08-11 16:42:00) [8]Лучше сделать так (я например так делал!):
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:00:00) [9]to RDen (11.08.04 15:00) [21]
уже теплее, но только, я пол ночи пытался найти способ что все уместилось в одном обработчике...
Решение нашел, только автор ветки пока не откликается...
Как откликнется, исходник выложу...
RDen (2004-08-11 15:06:00) [10]извините не обратил внимания на
>3APA3A © (10.08.04 22:29) [16]
RDen (2004-08-11 15:00:00) [11]Sun bittern © (10.08.04 21:57) [15] уже ведь ответил
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
if условие не выполнено Then AllowChange := false
end;
MacroDenS (2004-08-11 14:22:00) [12]посмотри вот это:
http://d-mds.narod.ru/PCEx.rar(165136 Б)
3APA3A (2004-08-11 00:17:00) [13]to Алхимик
Щас попробую...
to SergP
Это решение проблемы в общем, примерно так же как и [3], но меня интересует решение именно той конкретной задачи, что я описал...
SergP (2004-08-10 23:05:00) [14]А не проще ли все-таки не показывать те вкладки куда юзеру не нужно соваться?
Алхимик (2004-08-10 22:57:00) [15]Попробуй
function GetHitTestInfoAt(X, Y: Integer): THitTests;
3APA3A (2004-08-10 22:29:00) [16]Ситуация - на OnShow у страницы висит довольно долгая процедура инициализации и переключатся на эту страницу а потом делать проверку и выкидывать на пред. - некорректно. Поэтому событие OnChange не подходит.
OnChanging подходит по все статьям, но (повторяю в 3 раз) как мне в обработчике OnChanging узнать, куда PageControl собирается переключится?
Sun bittern (2004-08-10 21:57:00) [17]3APA3A © (10.08.04 20:39) [13]
А чем собственно так не нравится откат на предыдущую пагу???
OnChanging
Проверяй условия и выставляй соответсвенно AllowChange
MacroDenS (2004-08-10 20:53:00) [18]ладно, я уже домой пошел...
попробую ночью эту темку поковырять...
Может что и придумаю....
3APA3A (2004-08-10 20:39:00) [19]Да, это событие происходит тогда, когда надо, единственная проблема - узнать, куда именно он собрался переключится...
MacroDenS (2004-08-10 20:22:00) [20]
Неужели нет средств узнать, на какую страницу "собрался" переключатся PageControl?
По любому, прежде чем это отловить, пользователь должен кликнуть на нужном табшите...
Событие OnChanging ( не OnChange!пробовал обрабатывать?