C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
горячие клавиши
sander
Отправлено: 08.09.2005, 11:27


Ученик-кочегар

Группа: Участник
Сообщений: 28



сделал PageControl с 5 закладками как им присвоить свои горячие клавиши?
olegenty
Отправлено: 08.09.2005, 12:09


Ветеран

Группа: Модератор
Сообщений: 2412



Form->KeyPreview = true;
и написать обработчик события OnKeyDown формы.
Gedeon
Отправлено: 08.09.2005, 12:29


Ветеран

Группа: Модератор
Сообщений: 1742



Ну или можно так:

На форму добавляем ActionList, в нем создаем 5 обьектов Action, присваиваем им свойство Tag от 0 до 4 соответственно по приросту, настраиваем какие надо горячие клавиши, не забываем создать для них обработчики OnExecute, в принципе м.б. 1 для всех, но не обязательно и если обработчик 1 в нем пишем
CODE

void __fastcall TForm1::Action1Execute(TObject *Sender)
{
   TAction *A = dynamic_cast<TAction*> (Sender);
   PageControl1->ActivePageIndex = A->Tag;
}
//---------------------------------------------------------------------------

или же у обработчика самого ActionList
CODE

void __fastcall TForm1::ActionList1Execute(TBasicAction *Action,
     bool &Handled)
{
PageControl1->ActivePageIndex = Action->Tag;
}
//---------------------------------------------------------------------------
olegenty
Отправлено: 08.09.2005, 12:47


Ветеран

Группа: Модератор
Сообщений: 2412



решение Gedeon'а козырнее
sander
Отправлено: 08.09.2005, 14:32


Ученик-кочегар

Группа: Участник
Сообщений: 28



можно поподробнее пжлст:)
для нужен TAG?
и....
вообще может есть где подробне описание этого. потому как я реальный чайник в этом плане. всегда програмил под микрокантроллеры, там все в разы проще было:)
кстати посоветуйте книгу по билдеру толковую. потому кау у меня толком не описано это. "програмирование в с++ builder 5" Архангельский.
Rius
Отправлено: 09.09.2005, 09:41


Мастер участка

Группа: Участник
Сообщений: 321



tag для хранения информации пользователя (программера т.е.), практически никогда не используется, но есть во всех производных от TComponent.
QUOTE
Tag has no predefined meaning. The Tag property is provided for the convenience of developers. It can be used for storing an additional integer value or it can be typecast to any 32-bit value such as a component reference or a pointer.


p.s. на микроконтролерах проще? да ну?
gvg
Отправлено: 09.09.2005, 10:57


Машинист паровоза

Группа: Участник
Сообщений: 222



Если один обработчик какого либо события назначен на группу компонентов, по значению Tag можно определить — событие какого компонента обрабатывается. Скажем, вместо того, чтобы для кучи кнопок писать кучу OnClick, можно обойтись одним...
Rius
Отправлено: 09.09.2005, 11:11


Мастер участка

Группа: Участник
Сообщений: 321



QUOTE (gvg @ 09/09/2005, 13:57)
Если один обработчик какого либо события назначен на группу компонентов, по значению Tag можно определить — событие какого компонента обрабатывается. Скажем, вместо того, чтобы для кучи кнопок писать кучу OnClick, можно обойтись одним...

для этого используют Sender, сравнивая с "подозреваемым" объектом.
тэги же нужно устанавливать, следить за их порядком, уникальностью..
gvg
Отправлено: 09.09.2005, 11:23


Машинист паровоза

Группа: Участник
Сообщений: 222



зато с Sender-ом не сделаешь switch(), с тэгом куда удобнее...
Rius
Отправлено: 09.09.2005, 11:43


Мастер участка

Группа: Участник
Сообщений: 321



также удобно как и искать на форме среди десятков кнопок ту самую, у которой Tag == 10 ? и также как назначать тэги вручную каждому объекту?

а Bcb-шный switch переменные в case не поддерживает, это да, жаль, но кто-то умудрился к строкам его приделать...
Gedeon
Отправлено: 09.09.2005, 12:03


Ветеран

Группа: Модератор
Сообщений: 1742



На самом деле удобно в каждом случае делать по разному, от задачи зависит, и абсолютного ответа нету smile.gif .
А вообще интересно откуда изначально пришел этот тэг, он есть в визуал бэйсике, вс да и еще где-то я видел, вот кто первый это придумал и сейчас тэг стал практически стандартом для визуальных компонент.
xim
Отправлено: 09.09.2005, 17:55


Станционный диспетчер

Группа: Участник
Сообщений: 143



Конечно Tag — удобная вещь, но его следует оставить на "черный день". Достаточно использовать:
CODE

void __fastcall TForm1::Action1Execute(TObject *Sender)
{
  PageControl1->ActivePageIndex = ((TContainedAction *)Sender)->Index;
}
// или
void __fastcall TForm1::ActionList1Execute(TBasicAction *Action,
    bool &Handled)
{
 PageControl1->ActivePageIndex = ((TContainedAction *)Action)->Index;
}


Использование Tag делает сопровождение софта более опасным smile.gif
Gedeon
Отправлено: 09.09.2005, 18:18


Ветеран

Группа: Модератор
Сообщений: 1742



А где гарантия что эти экшены будут идти мало того что первыми, так еще и будут единственными?
xim
Отправлено: 10.09.2005, 14:49


Станционный диспетчер

Группа: Участник
Сообщений: 143



Ну никто же не мешает выделить под это дело отдельный экшн-лист, тем более, что это логически будет оправданно.
olegenty
Отправлено: 11.09.2005, 07:22


Ветеран

Группа: Модератор
Сообщений: 2412



вот мне делать нечего — экшн листы плодить. просто по группам разобъю, да и всё.
sander
Отправлено: 12.09.2005, 13:09


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE (Rius @ 09/09/2005, 09:41)
p.s. на микроконтролерах проще? да ну?

в чем то проще в чем то нет
у меня был компилятор IAR, многие команды он просто не понимает:) т.е. там практически как в паскале писать нуно:) конечно есть свои заморочки с нехваткой памяти и т.д.
максимальный экран у меня был это 5 дюймовый монохромный экран и 4 кнопки, на котором понятное дело сложно сделать толковый интерфейс. теперь куплен pcm-5820 и 15 дюймовый жки. задачи не сложные но из устройств ввода будет только 16 кнопочная клавиатура (цифровые клавиши 0-9, exit, enter, и клавиши вверх вниз влево вправо). поэтому мне нужны горячие клавиши.smile.gif вот:)
sander
Отправлено: 12.09.2005, 13:22


Ученик-кочегар

Группа: Участник
Сообщений: 28



вот честно:)
я так и не понял как сделать горячие клавиши:)
даже ваша большая дискуссия мне не помогла... наверное, только запутала:)
olegenty
Отправлено: 12.09.2005, 15:41


Ветеран

Группа: Модератор
Сообщений: 2412



вот решение Gedeon'а в коде:

User Attached Image Скачать файл
HotKeyEx.zip


Rius
Отправлено: 12.09.2005, 15:46


Мастер участка

Группа: Участник
Сообщений: 321



знаком с IAR'ом, в частности для ARM7 (LPC21xx) и MSP430 smile.gif

еще один вариант: в заголовки страниц писать текст вида TabSheet&3, в результате будет отображаться как TabSheet3, горячие клавиши будут Alt+3, но с вашей 16-кнопочной клавиатурой...
можно переименовать кнопку Exit в что-нибудь типа Shift или Func (с функцией Ctrl или Alt), и в комбинации с цифровыми использовать как горячую комбинацию (через ActionList например).
sander
Отправлено: 12.09.2005, 16:09


Ученик-кочегар

Группа: Участник
Сообщений: 28



у меня интерфейс программы состоит из серии закладок.к каждой закладке планирую присвоить горячую клавишу (только цифры, без контрл и шифт.) после нажатия кнопки ввод будет входить в содержание закладки. если интересно могу выложить тестовую версию интерфейса.

я работал с MSP430:)
новые версии IAR в разы лучше:)

Отредактировано sander — 12/09/2005, 16:09
sander
Отправлено: 12.09.2005, 16:19


Ученик-кочегар

Группа: Участник
Сообщений: 28



olegenty
пасиб
сейчас буду изучать:)
sander
Отправлено: 13.09.2005, 01:10


Ученик-кочегар

Группа: Участник
Сообщений: 28



блин видимо руки кривые...
выкидывает ошибку
[C++ Error] Unit1.cpp(20): E2316 '_fastcall TForm1::Action1Execute(TObject *)' is not a member of 'TForm1'

Не понимаю в чем дело функцию объявил. (void __fastcall Action1Execute(TObject *Sender)wink.gif
так же как и в примере olegenty. кстати ваш пример не компилится:(. и моё теперь тож:( что не так? если поможет вылужу то что я навоял:)

спасибо!!!
olegenty
Отправлено: 13.09.2005, 06:54


Ветеран

Группа: Модератор
Сообщений: 2412



ну, может я пакет какой выкинул лишний, или наоборот — забыл выкинуть.

пример работает.

объявлять надо в среде, а не ручками.
sander
Отправлено: 20.09.2005, 22:15


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE (olegenty @ 13/09/2005, 06:54)


объявлять надо в среде, а не ручками.

ет как?smile.gif
сорри понимаю что вопрос чрезвычайно глупый:)
Rius
Отправлено: 21.09.2005, 05:35


Мастер участка

Группа: Участник
Сообщений: 321



да, черезчур..
создать Action в ActionList, и щелкнуть по выбранному Action два раза мышкой, создастся функция обработчика.
sander
Отправлено: 27.09.2005, 11:43


Ученик-кочегар

Группа: Участник
Сообщений: 28



CODE
   if (A) pc->ActivePageIndex = A->Tag;  

выдает ошибку
CODE

[C++ Error] Unit1.cpp(27): E2451 Undefined symbol 'pc'
Rius
Отправлено: 27.09.2005, 11:59


Мастер участка

Группа: Участник
Сообщений: 321



pc — PageControl, посмотрите как он у вас называется wink.gif

Вернуться в Вопросы программирования в C++Builder