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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
9-1161610372
Xdebugger
2006-10-23 17:32
2007.10.21
Глюк при установке GLOXODE


15-1190345728
Riply
2007-09-21 07:35
2007.10.21
Коварный TStrings :)


4-1176956104
roughneck
2007-04-19 08:15
2007.10.21
Подсказки


15-1190192760
nikolaygor
2007-09-19 13:06
2007.10.21
Delphi: Сдвиг строчек в редакторе кода


8-1167830271
joseph
2007-01-03 16:17
2007.10.21
NullRenderer