Форум: "Основная";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизPageControl переключение по условию Найти похожие ветки
← →
Dmitry_177 (2007-07-31 12:32) [0]Можно ли какнибудь сделать так, что если переключать закладку в PageControl-е то прежде чем переключиться выполнялось условие, и если ксловие не выполняется то чтобы PageControl не переключился на другую закладку?
событие OnChange срабатывает уже после того когда произойдет переключение, а мне нужно до..
← →
Плохиш © (2007-07-31 12:35) [1]onchanging
← →
Dmitry_177 (2007-07-31 12:38) [2]ок, а как мне тогда в onchanging узнать на какую закладку будет переключение?
← →
savyhinst © (2007-07-31 12:43) [3]Хм... есть тут один вариант... НИКАК!?
Можно обрабатывать OnMouseDown. Это сработает до OnChange. Но придётся придумать, какие координаты должны быть у мыши, если она счёлкает по закладке, а не ещё куда-нибудь.
Или ещё проще: помнишь предыдущчую закладку и OnChange проверяешь своё условие; если не_судьба, возвращаешь запомненый номер закладки, а если _судьба, то запоминаешь новый номер PageControl.ActivePageIndex.
По-моему, второй вариант прощче. Ну, как?
← →
Rouse_ © (2007-07-31 12:50) [4]
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
var
HitTestInfo: TTCHitTestInfo;
P: TPoint;
begin
GetCursorPos(P);
HitTestInfo.pt := TWinControl(Sender).ScreenToClient(P);
HitTestInfo.flags := TCHT_ONITEM;
// Разрешаем переключаться только на закладки с
// PageIndex равным нулю или двойке
AllowChange :=
SendMessage(TWinControl(Sender).Handle,
TCM_HITTEST, 0, Integer(@HitTestInfo)) in [0, 2];
end;
← →
Rouse_ © (2007-07-31 12:51) [5]забыл :)
uses CommCtrl;
← →
savyhinst © (2007-07-31 12:55) [6]Куда проще можно!
var
i:integer;
OnChange:
begin
if
(условие)
then
i:=p.ActivePageIndex
else
p.ActivePageIndex:=i;
end;
← →
Rouse_ © (2007-07-31 13:02) [7]
> savyhinst © (31.07.07 12:55) [6]
> Куда проще можно!
Проверял?
← →
Dmitry_177 (2007-07-31 13:28) [8]Rouse_, спасибо :)
← →
clickmaker © (2007-07-31 17:39) [9]а как насчет Ctlr+Tab ? :)
← →
Dmitry_177 (2007-07-31 18:06) [10]
> а как насчет Ctlr+Tab ? :)
да кстати.. мне тоже интересно..
← →
Rouse_ © (2007-07-31 19:41) [11]
> а как насчет Ctlr+Tab ? :)
Таким же образом, просто перекрытьprocedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
← →
Rouse_ © (2007-07-31 19:43) [12]Я в свое время перекрывал примерно таким образом (тут уже не помню что за тестовые куски кода - короче все в куче):
unit GSPageControl;
interface
uses
Windows, Messages, Types, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
type
TGSPageControl = class(TPageControl)
private
FNewPageIndex, FNotifyIndex: Integer;
procedure WMPaint(var Message: TWMNCPaint); message WM_PAINT;
protected
function GetTabFromCursor: Integer;
function CanChange: Boolean; override;
procedure WMKeyDown(var Message: TWMKey); message WM_KEYDOWN;
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
procedure WMDblClick(var Message: TMessage); message WM_LBUTTONDBLCLK;
public
property NewPageIndex: Integer read FNewPageIndex;
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("GrandSoft", [TGSPageControl]);
end;
{ TGSPageControl }
function TGSPageControl.CanChange: Boolean;
begin
FNewPageIndex := GetTabFromCursor;
if FNewPageIndex = -1 then
FNewPageIndex := FNotifyIndex;
Result := inherited CanChange;
FNewPageIndex := -1;
end;
procedure TGSPageControl.CMDialogKey(var Message: TCMDialogKey);
begin
if (Focused or Windows.IsChild(Handle, Windows.GetFocus)) and
(Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
inherited;
end;
constructor TGSPageControl.Create(AOwner: TComponent);
begin
inherited;
FNotifyIndex := 0;
FNewPageIndex := 0;
end;
function TGSPageControl.GetTabFromCursor: Integer;
var
HitTestInfo: TTCHitTestInfo;
P: TPoint;
begin
GetCursorPos(P);
HitTestInfo.pt := Self.ScreenToClient(P);
HitTestInfo.flags := TCHT_ONITEM;
Result := SendMessage(Self.Handle, TCM_HITTEST, 0, Integer(@HitTestInfo));
end;
procedure TGSPageControl.WMDblClick(var Message: TMessage);
begin
end;
procedure TGSPageControl.WMKeyDown(var Message: TWMKey);
begin
with Message do
case Message.CharCode of
37: FNotifyIndex := FindNextPage(ActivePage, False, False).TabIndex;
39: FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
end;
inherited;
end;
procedure TGSPageControl.WMPaint(var Message: TWMNCPaint);
var
I: Integer;
begin
Color := $FFFFFF;
for I := 0 to PageCount - 1 do
Pages[I].Repaint;
end;
end.
← →
begin...end © (2007-07-31 20:54) [13]> Rouse_ © (31.07.07 12:50) [4]
IndexOfTabAt
← →
Rouse_ © (2007-07-31 23:55) [14]
> begin...end © (31.07.07 20:54) [13]
> IndexOfTabAt
Те-же яйца, только сбоку :)
На 1 строчку меньше код будет :)
← →
Dmitry_177 (2007-08-03 17:18) [15]что-то у меня не выходит..:( вот мы разрешили переключать на такие-то закладки, в данном случае 0 и 2, а потом как разрешить? вот у меня: на второй закладке находится StringGrid и в зависимости от того есть ли в нем заполненные строки разрешаю или запрещаю переключаться на 1 и 2 закладку(если ечесть что 0 - это первая по счету закладка). Так вот я делаю так:
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
var
HitTestInfo: TTCHitTestInfo;
P: TPoint;
begin
GetCursorPos(P);
HitTestInfo.pt := TWinControl(Sender).ClientToScreen(P);
HitTestInfo.flags := TCHT_ONITEM;
if StringGrid1.Cells[1, 1] = "" then
AllowChange := SendMessage(TWinControl(Sender).Handle, TCM_HITTEST, 0, Integer(@HitTestInfo)) in [0]
else
AllowChange := SendMessage(TWinControl(Sender).Handle, TCM_HITTEST, 0, Integer(@HitTestInfo)) in [0, 1, 2];
end;
и получается так что в любом случае нельзя переключиться на "1" и "2" закладки.. в отладчике смотрел, это:AllowChange := SendMessage(TWinControl(Sender).Handle, TCM_HITTEST, 0, Integer(@HitTestInfo)) in [0, 1, 2];
выполняется при заполненном StringGride но всеравно переключиться недает.. подскажите пожалуйста..
← →
MetalFan © (2007-08-03 21:05) [16]предлагаю немного более простое решение)
...
FPageIndex: integer;
...
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
FPageIndex := PageControl1.ActivePageIndex;
end;
procedure TForm1.PageControl1Change(Sender: TObject);
begin
if PageControl1.ActivePageIndex = <...> then
PageControl1.ActivePageIndex := FPageIndex;
end;
← →
Суслик © (2007-08-03 23:01) [17]еще проще решение - плохой дизайн gui, и не ИМХО
← →
Dmitry_177 (2007-08-03 23:22) [18]ну оччччеееенннннььь странно, скопировал еще раз код Rous-а, поставил такое же условие: if StringGrid1.Cells[1, 1] = "" then и все заработало.. странно, чем мой код не понравился Delphi из Dmitry_177 (03.08.07 17:18) [15].. Вроде точь-в-точь, но почему-то путем копи-паст заработало....:)
P.S. я все удивляюсь.. че у меня с Delphi творится :) то тогда сервис не хотел запускаться на работе, когда дома он же все отлично запускалось.. то теперь эта какая-то непонятная фигня :)
P.S.S. У меня Delphi 7 build 8.1 (Update 1) не нравится мне никакая другая..:) но и эта чето глючит :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c