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
|
На самом деле удобно в каждом случае делать по разному, от задачи зависит, и абсолютного ответа нету .
А вообще интересно откуда изначально пришел этот тэг, он есть в визуал бэйсике, вс да и еще где-то я видел, вот кто первый это придумал и сейчас тэг стал практически стандартом для визуальных компонент.
|
|
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 делает сопровождение софта более опасным |
|
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, и клавиши вверх вниз влево вправо). поэтому мне нужны горячие клавиши. вот:)
|
|
sander |
Отправлено: 12.09.2005, 13:22 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 28
|
вот честно:)
я так и не понял как сделать горячие клавиши:)
даже ваша большая дискуссия мне не помогла... наверное, только запутала:) |
|
olegenty |
Отправлено: 12.09.2005, 15:41 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот решение Gedeon'а в коде:
|
|
Rius |
Отправлено: 12.09.2005, 15:46 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
знаком с IAR'ом, в частности для ARM7 (LPC21xx) и MSP430
еще один вариант: в заголовки страниц писать текст вида 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)
так же как и в примере olegenty. кстати ваш пример не компилится:(. и моё теперь тож:( что не так? если поможет вылужу то что я навоял:)
спасибо!!! |
|
olegenty |
Отправлено: 13.09.2005, 06:54 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ну, может я пакет какой выкинул лишний, или наоборот — забыл выкинуть.
пример работает.
объявлять надо в среде, а не ручками.
|
|
sander |
Отправлено: 20.09.2005, 22:15 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 28
|
QUOTE (olegenty @ 13/09/2005, 06:54) |
объявлять надо в среде, а не ручками. |
ет как?
сорри понимаю что вопрос чрезвычайно глупый:)
|
|
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, посмотрите как он у вас называется
|
|