Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как отжать кнопку на ToolBar?


Автор: Bima 30.1.2007, 15:05
Есть ToolBar и PopupMenu. Кнопки ToolBar привязаны к соответствующим пунктам меню.
Задумка такая: если нажать на кнопку в ToolBar то она должна стать неактивной, до тех пор, пока не отработает подпрограмма подвешаная на нажатие этой кнопки.
Задумка, задумкой а выходит следущее: я нажимаю кнопку, программа успевает отработать до того, как я ее отпущу и она под курсором сначала становится неактивной, а потом активной в нажатом состоянии. То есть в результате на ToolBar вместо обыкновенной кнопки получается кнопка нажатая и отжать ее я не знаю как. smile

варианты:
Код

Application->ProcessMessages();
ToolBar1->Update();
ToolBar1->Refresh();

Пробовал, не помогают.

Может есть способ отжать кнопку программно? а то как то не красиво смотрится smile

Добавлено @ 15:06 
P.S. по форуму полазил ничего не нашел smile

Автор: Vyacheslav 30.1.2007, 15:20
для таких вещей изпользут TSpeedButton

Автор: Bima 30.1.2007, 15:24
Цитата

для таких вещей изпользут TSpeedButton 


Интересно, а ToolBar для чего используют???

Это что нужно самому создавать панель ToolBar  на основе панели и кнопок TSpeedButton ??? Что-то кривоватый подход на мой взгляд?

Автор: Vyacheslav 30.1.2007, 15:42
Извините, не обратил внимание на ToolBar. Тогда вопрос в другом. Как Вам вообще удалось ее  сделать ее неотжимаемой ? Стиль tbsCheck установили что ли. Или программно с Down что творите? По умолчанию он отжимается сразу после нажатия

Автор: Anikmar 30.1.2007, 16:23
Цитата(Bima @  30.1.2007,  15:24 Найти цитируемый пост)
Это что нужно самому создавать панель ToolBar  на основе панели и кнопок TSpeedButton ??? Что-то кривоватый подход на мой взгляд? 

SpeedButton на ToolBare плохо смотрятся, если привязаны к акциям, у которой установлен Caption.

Немного похожую задачу я реализовывал с помощью SpeedButton на обычной панели, у которой выравнивание стоит alTop. По виду от ToolBar не отличается. Мне правда нужно было залипание кнопок в нажатом состоянии. 

Автор: Bima 30.1.2007, 16:28
Стиль стоит tbsButton
c Down не играю.

у меня только одни догадки.

В подпрограмме, которая висит на кнопке я запускаю потоки. Перед запуском потоков, я делаю Enabled=false;
сама подпрограмма заканчивается а потоки еще работают. После того как все потоки отработают, последний поток посылает сообщение формы и в обработчике сообщения я делаю Enabled=true.

Может это быть причиной залипания кнопок, если да, то как можно избежать этого???

Автор: Vyacheslav 30.1.2007, 17:54
Вообще то, даже задисабленная кнопка будет отжата. Я в недоумении

Добавлено @ 17:56 
Опс. Я понял.  У Вас в обработчике зацикливается отсновной поток
Вот при таком ракладе кнопка остается нажатой
Код

void __fastcall TForm1::ToolButton1Click(TObject *Sender)
{
 while(1);
}

Автор: Bima 31.1.2007, 06:40
Цитата

Опс. Я понял.  У Вас в обработчике зацикливается отсновной поток


Интересно, каким образом он зацикливается?
Если я правильно понял, то происходит следущее...
Запускается подпрограмма, выставляется Enabled=false, а потом еще раз запускается подпрограмма(в момент ее работы)???

Автор: default_user 31.1.2007, 09:47
Цитата(Bima @ 30.1.2007,  15:24)
Это что нужно самому создавать панель ToolBar  на основе панели и кнопок TSpeedButton ??? Что-то кривоватый подход на мой взгляд?

Самому создавать не нужно. Просто на пустой тулбар шлепаешь TSpeedButton. У него есть свойство Down, которое можно менять программно. Кстати, у SpeedButton есть свойство Flat=true, с помощью которого панель можно сделать симпотишнее, попробуй. 

Цитата

SpeedButton на ToolBare плохо смотрятся, если привязаны к акциям, у которой установлен Caption.


Это легко решается - на Action свойство Caption не указывается, а в пунктах меню прописывается самостоятельно.

Автор: Bima 31.1.2007, 10:46
Переделал, все заработало (даже не прибегая к свойствам Down) .
Только вот все как то разношерстно получается smile

Я вставлял иконки на меню и на кнопки в ToolBare. А SpeedButton принимает только bmp smile. Причем маска у этого рисунка формируется на базе левого нижнего пикселя. Пришлось конвертировать рисунки и выставлять этот пиксель согласно фону. Естественно это сказалось на размере, так как по две картинки находятся в памяти только разного формата.

Как нибудь можно при инициализации программы вытащить рисунки из ImageList и вставить их на SpeedButton? или может не стоит этого делать, так как код скомпилированный превысит вес самих рисунков?

Добавлено @ 10:58 
Я сделал такой код:
Код

Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();
ImageList->GetBitmap(11,Bitmap1); //
Bitmap1->Transparent=true;//
SpeedButton1->Glyph=Bitmap1;
delete Bitmap1;

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

Автор: Vyacheslav 31.1.2007, 16:48
Вообще то я все ,в том числе и иконки ,  присваиваю в Action ( ActionList )

Добавлено @ 16:49 
Цитата(Bima @  31.1.2007,  10:46 Найти цитируемый пост)
Переделал, все заработало (даже не прибегая к свойствам Down) .

И как Вы это переделали?

Добавлено @ 16:53 
Цитата(Bima @  31.1.2007,  06:40 Найти цитируемый пост)
Запускается подпрограмма, выставляется Enabled=false, а потом еще раз запускается подпрограмма(в момент ее работы)??? 

Без разницы. Кнопка задисаблится но будет отжата. Я вообще не понимаю, как Вам удалось добиться такого эффекта. К тому же у Вас сама Action срабатывает моментально, поскольку он просто запускает поток. Самое плохое, что должно случиться, так это получить задисайбленную отжатую кнопку.

Автор: Anikmar 31.1.2007, 17:09
Цитата(Bima @  31.1.2007,  10:46 Найти цитируемый пост)
Как нибудь можно при инициализации программы вытащить рисунки из ImageList и вставить их на SpeedButton? или может не стоит этого делать, так как код скомпилированный превысит вес самих рисунков?

Если привязка SpeedButton идет к акции - то она вытаскивает из ImageList картинку. Но проблема с Caption остается (см. мой пост выше).
Причем если у SpeedButton Caption обнулить - в дизайнтайме все отлично. При запуске - он опять эти заголовки тянет. Как вариант обнулять их при запуске (не пробовал).

Был совет:
Цитата(default_user @  31.1.2007,  09:47 Найти цитируемый пост)
Это легко решается - на Action свойство Caption не указывается, а в пунктах меню прописывается самостоятельно. 


Тогда теряется весь смысл использования списка акций - надо помнить где что изменять, как минимум основное меню, PopUp меню и т.п.

Автор: Bima 1.2.2007, 07:14
Цитата

И как Вы это переделали?

удалил все кнопки с ToolBar, вставил туда кнопки SpeedButton. OnClick этих кнопок привязал соответствующим пунктам меню. Сконвертировал иконки в bmp (установив предварительно у нижнего левого пикселя цвет - цвет фона). и все, все заработало, без существенной переделки кода.
код изменил: только заменой названия кнопок!!!
Цитата

Я вообще не понимаю, как Вам удалось добиться такого эффекта. 

я сам не понимаю, но эффект был. Почему SpeedButton работает иначе чем кнопки ToolBar, я не понимаю.
Цитата

Если привязка SpeedButton идет к акции - то она вытаскивает из ImageList картинку. Но проблема с Caption остается (см. мой пост выше).

Если честно, я с такой проблемой не сталкивался, и в моем проекте я ее не заметил smile

Автор: default_user 1.2.2007, 10:47
Цитата(Anikmar @ 31.1.2007,  17:09)
Был совет:
Цитата(default_user @  31.1.2007,  09:47 Найти цитируемый пост)
Это легко решается - на Action свойство Caption не указывается, а в пунктах меню прописывается самостоятельно. 


Тогда теряется весь смысл использования списка акций - надо помнить где что изменять, как минимум основное меню, PopUp меню и т.п.

Ну, допустим, прям весь смысл акций не теряется  smile  Код ведь дублировать и картинки не придется? К тому же, не так уж и часто Caption акций используется где-то еще. У меня чаще всего получается тулбар+меню.

Автор: Anikmar 1.2.2007, 11:01
Цитата(Bima @  1.2.2007,  07:14 Найти цитируемый пост)
Если честно, я с такой проблемой не сталкивался, и в моем проекте я ее не заметил  

Я тоже очень удивился.
Если Caption-а нет - все отлично. А если есть, то SpeedButton пфтается и картинку запихать и Caption. В дизайнтайме обнуляю, запускаю прогу - опять вылезли. Я не стал подробно разбираться с этим, почему так происходит, обошел другим способом. Может это у меня билдер какой-то глючный - не знаю.
Цитата(default_user @  1.2.2007,  10:47 Найти цитируемый пост)
Ну, допустим, прям весь смысл акций не теряется    Код ведь дублировать и картинки не придется? К тому же, не так уж и часто Caption акций используется где-то еще. У меня чаще всего получается тулбар+меню.

Ну это естественно, я тут немного переборщил, но все равно - подход какой-то неправильный. У меня на главной форме порядка полусотни акций, как-то  лень вручную дважды записывать. - и в основное меню и в PopUp...

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