Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI и TabOrder, Как заставить это работать? 
:(
    Опции темы
Serggggg
  Дата 18.6.2004, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



И ещё раз привет всем.
Помогите PLZZZ - на MDi-форме есть куча окошек (TEdit), у каждого из которых есть свой TAB ORDER. Однако перейти по нажатию TAB с одного окна на другое не получается - просто не работает.
Пишу обработчик нажатия клавиши TAB - типа
Код

if Key=VK_TAB then Edit2.SetFocus;


Тот же результат.
Как заставить сработать метод SetFocus?
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_vova_
Дата 18.6.2004, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 18.6.2004
Где: Харьков

Репутация: нет
Всего: нет



А зачем SetFocus?

ActiveControl := Edit2 ;

По-моему проще и работает
PM MAIL   Вверх
Serggggg
Дата 18.6.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Попробовал - не работает.
Не хочет переходить по TAB'у - хоть руками прописывай, хоть по умолчанию оставляй. sad.gif
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_vova_
Дата 18.6.2004, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 18.6.2004
Где: Харьков

Репутация: нет
Всего: нет



А у этого Edit2 случайно TabStop<>False?
PM MAIL   Вверх
Serggggg
Дата 18.6.2004, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Пробовал и True и False - результат тот же. sad.gif
Это, наверное, какой-то глюк MDI-окон.
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
RA
Дата 18.6.2004, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



SendMessage(Edit2.Handle, WM_SETFOCUS, 0,0);
PM   Вверх
_vova_
Дата 18.6.2004, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 18.6.2004
Где: Харьков

Репутация: нет
Всего: нет



Не должно такого быть.
Наваял простенкий MDI Application, натыкал целую кучу контролов и ...
все по Tab'у прыгает и туда и обратно.
Попробуй пересоздать форму по новой. У меня, при похожих глюках
этот вариант как правило спасал.
PM MAIL   Вверх
_hunter
Дата 18.6.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



проверил SetFocus() -- рботает без проблем --> ошибка в другом месте

ты KeyPreview установил?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RA
Дата 18.6.2004, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Во вот так должно работать (МиниЛовушка)

Код


var
 Form1: TForm1;
 hook: HHook;
implementation

{$R *.dfm}

Function hooks(Code:Integer;wParam,lParam:longint):longint; StdCall;
var c:array[0..255] of char;
   nScan:integer;
   boo,Sh:boolean;
begin
  if                                              //
( (code>=0)and(teventmsg(pointer(lparam)^).message=wm_keydown) )
  or                                                
{; Не поверите Alt c неких пор сталsyske'eм}

( (code>=0) and (teventmsg(pointer(lparam)^).message=wm_syskeydown) )
  then
    begin
    nScan:=hibyte((teventmsg(pointer(lparam)^).paramL));
    nscan:=nscan shl 16;
    end;
     GetKeyNameText(nScan,c,256);
     if 'tab'=LowerCase(c) then SendMessage(Edit2.Handle,WM_SETFOCUS,0,0);

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
hook:=SetWindowsHookEx(WH_JOURNALRECORD,@hooks,hInstance,0);

end;



PM   Вверх
_vova_
Дата 19.6.2004, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 18.6.2004
Где: Харьков

Репутация: нет
Всего: нет



Зачем так сложно smile.gif, RAdmin.
Вопрос в том, чтобы по Tab'у поменять Control (насколько я понял).
В принцыпе все варианты рабочие и зачем городить огород?
Serggggg, сделай новую форму и все пройдёт.
Вспомни старый анекдот: "Может выйдем, зайдем она и поедет?".

PM MAIL   Вверх
<Spawn>
Дата 19.6.2004, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Для кого ты пишешь обработчик нажатия? Для формы или контрола? Если для формы, то как тут уже сказали, ставь KeyPreview в True


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Serggggg
Дата 19.6.2004, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Новую форму создавал. Форма создается (просходит Create(Application)) в своем unit'е. Форма создаётся в DLL - может быть проблемы из-за этого. Тот же результат.
Пробовал KeyPreview менять - тот же результат. Только мышкой щелкать надо.
Пробовал и SendMessage(Edit2.Handle, WM_SETFOCUS, 0,0); - результат=0;
Проклятие какое-то. butbut.gif
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Serggggg
Дата 19.6.2004, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Да. Проблема в DLL - я создаю простенькое окошко MDI в библиотеке - TAB не пашет. Точно такое же окно MDI в EXE-модуле - все работает, как часы - TAB работает, как и должен - по умолчанию.
Как быть?
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



еще раз спрашиваю smile.gif ты KeyPreview для формы установил?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RA
Дата 19.6.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(_vova_ @ 18.6.2004, 23:20)
Зачем так сложно smile.gif, RAdmin.
Вопрос в том, чтобы по Tab'у поменять Control (насколько я понял).
В принцыпе все варианты рабочие и зачем городить огород?
Serggggg, сделай новую форму и все пройдёт.
Вспомни старый анекдот: "Может выйдем, зайдем она и поедет?".

Зато 100% smile.gif , и можно работать с формой каторыя скрыта или не в фокусе.
PM   Вверх
Serggggg
Дата 19.6.2004, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



_hunter, установил конечно. Form1.KeyPreview установлен в True - не пашет. Form1.KeyPreview установлен в False - не пашет.
RAdmin, а если на форме порядка 15 контролов, как в моём случае? И каждому по TAB'у надо передать управление.
Здесь что-то принципиальное, не могу въехать - что именно. MDI-форма, созданная внутри динамически подгружаемой DLL, рубит на корню все переходы по TAB'у. А та же форма (MDIChild) с теми же параметрами и свойствами, созданная в exe-шнике, работает вполне нормально - TAB отлично работает и без обработчиков нажатия кнопок. Может при Create формы ей надо какие-то ещё параметры указать?

--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Serggggg
Дата 19.6.2004, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Наткнулся на ещё более интересную деталь - допустим, в главной программе создаётся MDI-окно с 4-мя Edit'ами. Переход по Tab'у возможен только в порядке TabOrder.
Метод SetFocus или SendMessage() не работают. Почему?
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



проверь, ты нажатие Tab ловиш?
поставь OnKeyDown и фильтр


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
RA
Дата 19.6.2004, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(Serggggg @ 19.6.2004, 10:39)
Наткнулся на ещё более интересную деталь - допустим, в главной программе создаётся MDI-окно с 4-мя Edit'ами. Переход по Tab'у возможен только в порядке TabOrder.
Метод SetFocus или SendMessage() не работают. Почему?

А ты попробуй эти Методы фызывать не из обработчика OnKeyPress а из контрола типа Бутон (Для теста, просто мне кажется что у тебя обработчик ослеп)


Цитата

RAdmin, а если на форме порядка 15 контролов, как в моём случае? И каждому по TAB'у надо передать управление.


Ну если ты используешь мой пример (и он у тебя работает) и у тебя 15 контролов то
подработай код малость:

Код
   
   if 'tab'=LowerCase(c) then
   begin
      if Edit1.Selected then SendMessage(Edit2.Handle,WM_SETFOCUS,0,0);
      if Edit2.Selected then SendMessage(Edit3.Handle,WM_SETFOCUS,0,0);
     
     и тд.........

  end;

PM   Вверх
Serggggg
Дата 19.6.2004, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



_hunter, так и есть - не хочет обрабатывать нажатие TAB. Нажимаю TAB в нужном окошке - ShowMessage не показывается. Меняю на ENTER, INSERT - все работает.
И в программе, и в DLL. Т.е. программа тупо не замечает нажатия TAB.
Как быть?

P.S. Использовался обработчик OnKeyDown

--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



для начала попробуй отключить TabStop у Edit' ов
если не поможет -- запускай WinSight и смотри куда идут клавиатурные сообщения, особенно TAB


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Serggggg
Дата 19.6.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Отключал - не помогло.
Запускал WinSight - Log прислать не могу - не сохраняется. Скажу так - и у клавиши INSERT (для примера), и у TAB в обработчике есть ShowMessage - при нажатии INSERT WinSight прописывает 11 строчек, при TAB'е - 3.
При нажатии TAB:

WM_KEYDOWN Dispatched 09h 9d VK_TAB Scan 0Fh Down
WM_KEYUP Dispatched 09h 9d VK_TAB Scan 0Fh Up
WM_KILLFOCUS Sent Focus to hwnd 00000000

--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



а теперь расшифровка: smile.gif
окно 09h 9d забрало себе ( Dispatched ) сообщение о нажтии TAB и соответственно фокус стал на 00000000
так что ищи что за оно забирает сообщения


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Serggggg
Дата 19.6.2004, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



Глупый вопрос, но не могу понять, как именно использовать WinSight. Перестали появляться сообщения внизу. Делаю Start/Stop, а результата не вижу. withstupid.gif
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



странно, все перепробывал -- воспроизвести такое не смог

у тебя винда какая?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Serggggg
Дата 19.6.2004, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



2000 Server Service Pack 4
--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



попробуй в Messages поставить All Windows
а в Messages->Processes...->All processes
если не поможет -- переставляй винды smile.gif



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Serggggg
Дата 19.6.2004, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



_hunter, я уже не вижу выхода. Отказаться от DLL, наверное, надо. Слишком большие проблемы. Всем спасибо за участие.

--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
_hunter
Дата 19.6.2004, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



выход есть: поставить хук и в нем пересылать сообщеня дальше

а если можно отказаться от DLL -- отказывайся ибо всегда нужно делать проще ( KISS ) smile.gif


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Serggggg
Дата 19.6.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.12.2003
Где: Донецк, Украина

Репутация: нет
Всего: нет



_hunter, я уже пробовал поставить хук, который прислал RAdmin - прога вообще намертво систему завесила.
Так что пойдём по пути наименьшего сопротивления.

--------------------
C уважением, Serggggg.
PM MAIL ICQ   Вверх
Medved
Дата 21.6.2004, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Вот универсальный код "пробега" по реквизитам:

Код

 if Key = VK_UP then
   SelectNext(Sender as TWinControl,false,true);
 if (Key = VK_DOWN) or (Key = VK_TAB) or (Key = VK_RETURN)  then
   SelectNext(Sender as TWinControl,true,true);



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.