Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
2-1190381870
mike_zav
2007-09-21 17:37
2007.10.21
FreeAndNil


15-1190296896
Andy BitOff
2007-09-20 18:01
2007.10.21
Вот что можно ответить человеку задавшему такой вопрос.


5-1157961202
--= Eagle =--
2006-09-11 11:53
2007.10.21
Глюк с Align у панели


15-1190155991
Константинов
2007-09-19 02:53
2007.10.21
Настройка фрейвола


1-1186483022
OlegM
2007-08-07 14:37
2007.10.21
Незакрываються динамически созданные Panel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский