Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TTabSet'a Delphi2006 и OnDoubleClick


Автор: Delphist 14.3.2007, 14:44
Как для TTabSet'a Delphi2006 сделать генератор события двойного клик по вкладке?

Автор: ama_kid 14.3.2007, 15:08
Не знаю, чем отличается Д2006 от 7-го, но у меня проканывает так:

Код

var
   Old_Proc:pointer;


function TabSetProc(Window: HWnd; Message: Cardinal; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case Message of
    WM_LBUTTONDBLCLK: begin
                        ShowMessage('Yo');
                      end;
  end;
  Result := CallWindowProc(old_proc, Window, Message, wParam, lParam);
end;
...
// Устанавливаем новую оконную процедуру
 Old_Proc:=pointer(GetWindowLong(TabSet1.Handle,GWL_WNDPROC));
 SetWindowLong(TabSet1.Handle,GWL_WNDPROC,integer(@TabSetProc));
...

Активную вкладку уж придется самому определять....

Автор: Delphist 14.3.2007, 15:18
Цитата(ama_kid @  14.3.2007,  16:08 Найти цитируемый пост)
integer(@TabSetProc));

Из-за этого параметра Delphi выдает ошибку: Variable required.

Автор: ama_kid 14.3.2007, 15:22
У меня в SDK написано:
Цитата
LONG SetWindowLong(
    HWND hWnd,    // handle of window
    int nIndex,    // offset of value to set
    LONG dwNewLong  // new value
   );

Посмотри, что написано у тебя и приведи к соответствующему типу... Если не прокатит - заведи переменную того типа, который указан для третьего параметра этой функции и присвой ей адрес оконной процедуры табсета и в SetWindowLong передавай эту переменную...

Автор: VICTAR 14.3.2007, 15:31
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Tabs;

type
  TForm1 = class(TForm)
    TabSet1: TTabSet;
    procedure FormCreate(Sender: TObject);
    Procedure NewTabCtrlWndProc( var AMessage: TMessage );
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  FOldTCWndProc: TWndMethod;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldTCWndProc := TabSet1.WindowProc;
  TabSet1.WindowProc := NewTabCtrlWndProc;
end;

procedure TForm1.NewTabCtrlWndProc(var AMessage: TMessage);
var i: integer;
begin
  if AMessage.Msg = WM_LBUTTONDBLCLK then
  begin
    i:=TabSet1.ItemAtPos(Point(AMessage.LParamLo,AMessage.LParamHi));
    if i<>-1 then ShowMessage(Format('DblClick на %s',[TabSet1.Tabs[i]]));
  end;
  FOldTCWndProc(AMessage);
end;


end.


За основу взят http://forum.vingrad.ru/topic-130578/hl/tabcontrol/index.html топик

Автор: Delphist 14.3.2007, 15:39
Цитата(ama_kid @  14.3.2007,  16:22 Найти цитируемый пост)
У меня в SDK написано:

Проблема была в том, что я TabSetProс всунул в public-раздел формы. Если же данную процедуру обявить вне класса TMainForm моей главной формы, то проблем не возникает, но возникает трудность в работе с объектами объявленные внутри формы TMainForm. Поэтому возникает вопрос как узнать адресс процедуры объявленной внутри класса формы?

Добавлено @ 15:44 
Цитата(VICTAR @  14.3.2007,  16:31 Найти цитируемый пост)
За основу взят этот топик 

Спасибо!

Автор: VICTAR 14.3.2007, 15:57
Цитата(Delphist @  14.3.2007,  15:39 Найти цитируемый пост)
Спасибо! 

  smile 

И еще, на всякий случай:

Код

Old_Proc:=pointer(GetWindowLong(TabSet1.Handle,GWL_WNDPROC));
SetWindowLong(TabSet1.Handle,GWL_WNDPROC,integer(@TabSetProc));


Можно заменить на
Код

Old_Proc:=pointer(SetWindowLong(TabSet1.Handle,GWL_WNDPROC,integer(@TabSetProc)));


The SetWindowLong function
Return Values
If the function succeeds, the return value is the previous value of the specified 32-bit integer.
If the function fails, the return value is zero. To get extended error information, call GetLastError. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)