Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TabControl - переименование закладки


Автор: aktuba 6.1.2007, 06:30
Ситуация такая: мне необходимо в программе реализовать следующий момент. Пользователь дважды щелкает на закладке в TabControl (DblClick), после этого, на месте закладки появляется TEdit, в котором находится текст закладки. Пользователь редактирует текст, нажимает Enter или просто покидает TEdit (например, щелкает на другой компонент) и текст в закладке меняется на новый, из TEdit.

Теперь вопросы:

1. Как отловить DblClick на закладке?
2. Как определить границы (TRect) закладки?

Я использую стандартный TabControl, но, если кто-то знает другой компонент с такими свойствами - буду рад.
Заранее благодарен.


M
Girder
Одна тема - один вопрос!

Автор: Sunvas 6.1.2007, 12:35
хз. Я для начала я бы использовал PageControl. А вообще кажися в JVCL уже был компонент для реализации такиф "финтов"

Автор: aktuba 6.1.2007, 12:55
Page Control не подходит. Программа уже есть и мне необходимо просто улучшать ее. А замена TabControl на PageControl - больщой объем работы... smile 

Автор: MetalFan 6.1.2007, 13:51
зачем лишние понты? сделай попап меню с пунктом "переименовать")

Автор: aktuba 6.1.2007, 13:54
Не "понты", а требования заказчика =((( Вот хочется ему, чтобы прямо на вкладке переименовывать можно было...

Добавлено @ 14:03 
Хорошо, границы табов можно запоминать во время отрисовки. Это не проблема.
Но, неужели никто не может подсказать, как отловить DblClick? smile 

Автор: Sunvas 6.1.2007, 14:06
Цитата(aktuba @  6.1.2007,  13:54 Найти цитируемый пост)
Не "понты", а требования заказчика =((( Вот хочется ему, чтобы прямо на вкладке переименовывать можно было...

На стандартной TabControl не думаю что это получиться... Поэтому
Цитата(aktuba @  6.1.2007,  12:55 Найти цитируемый пост)
 А замена TabControl на PageControl - больщой объем работы...

Видимо будет.. smile 

Автор: ivan219 6.1.2007, 14:16
Цитата(aktuba @  6.1.2007,  13:54 Найти цитируемый пост)
Но, неужели никто не может подсказать, как отловить DblClick?

Новерное тут надо решать с помощью сообщений Windows и смотреть геде в это время находится курсор.

Автор: MetalFan 6.1.2007, 14:20
Цитата(aktuba @  6.1.2007,  13:54 Найти цитируемый пост)
как отловить DblClick?


да запросто!!
можно через лок.хуки
а можно и тупо WndProc переопределив
вот простейший вариант:
Код

TForm1 = class (TForm )
...
  FOldTCWndProc: TWndMethod;
  Procedure NewTabCtrlWndProc( var AMessage: TMessage );
  procedure FormCreate( Sender: TObject );
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldTCWndProc := tbc1.WindowProc;
  tbc1.WindowProc := NewTabCtrlWndProc;
end;

procedure TForm1.NewTabCtrlWndProc(var AMessage: TMessage);
begin
  if AMessage.Msg = WM_LBUTTONDBLCLK then
  begin
    ShowMessage('DblClick!');
  end;
  FOldWP( AMessage );
end;

Автор: aktuba 6.1.2007, 14:31
Metalfan: В обоих случаях надо определить, что DblClick был именно по закладке и определить по какой закладке. Это как решить?

Автор: MetalFan 6.1.2007, 14:34
  if AMessage.Msg = WM_LBUTTONDBLCLK then
  begin
    ShowMessage(tbc1.Tabs[tbc1.TabIndex]);
  end;

ты попробуй! эт возникнет только при даблклике на закладке


Автор: December 6.1.2007, 14:37
Как-то всё мегасложно получается. Давайте проще.
1) Ловим клик, запоминаем GetTickCount
2) Ловим ещё клик, проверяем GetTickCount-OldTickCount<Treshold
3) если да, то считаем DoubleClick пойманным
Disclaimer: у меня это работало на PageControl, с TabControl не тестировал.

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