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

 
ComboBox, Программно открыть список
Pan-SQL
Отправлено: 18.05.2005, 11:36


Не зарегистрирован







Можно ли программно открыть список ComboBox?
Gedeon
Отправлено: 18.05.2005, 13:33


Ветеран

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



CODE

ComboBox1->DroppedDown = true;
Sl@Sh
Отправлено: 18.05.2005, 13:42


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

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



Как это работает ?
Gedeon
Отправлено: 18.05.2005, 13:48


Ветеран

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



QUOTE (Sl@Sh @ 18/05/2005, 13:42)
Как это работает ?

user posted image

Бросаете на форму комбо бокс и кнопку и в обработчик кнопки приведенный код, жмете кнопку и смотрите.
Sl@Sh
Отправлено: 18.05.2005, 13:53


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

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



Ясно, просто я в OnCreate формы сразу пишу, чтобы что-то проверить. В OnCreate у меня не работало.
Иван
Отправлено: 18.05.2005, 13:58


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

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



У меня в OnCreate работает...
sleep какой нибудь поставьте будет видно работает или нет
Sl@Sh
Отправлено: 18.05.2005, 14:06


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

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



Либо список без формы, либо очень быстро мелькает(зависит от того, где Sleep вызвал). С OnShow такая-же байда smile.gif

В OnPaint без Sleep работает. Он же всё-таки уже после OnCreate и OnShow работает.
timson
Отправлено: 18.05.2005, 17:31


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

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



раскрыть/скрыть список:
CODE
SendMessage(ComboBox1->Handle, CB_SHOWDROPDOWN, TRUE, 0);


в OnCreate и не будет работать, т.е. отработает но без результата видимого.

OnCreate событие на сообщение окну WM_CREATE, т.е. это самое первое сообщение, приходящее окну, при его создании CreateWindow(). Т.е. при вызове этой функции окну идет сообщение WM_CREATE, и результат выполнения (создания) окна зависит от того что возратит оконная функция на сообщение WM_CREATE.

И уже после WM_CREATE будет идти WM_PAINT, после которой уже можно раскрывать список..
Sl@Sh
Отправлено: 18.05.2005, 17:39


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

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



QUOTE (timson @ 18/05/2005, 17:31)
И уже после WM_CREATE будет идти WM_PAINT, после которой уже можно раскрывать список..

QUOTE
В OnPaint без Sleep работает. Он же всё-таки уже после OnCreate и OnShow работает.


Похоже ? Да и потом зачем SendMessage ? Это хорошо когда на чистом WinAPI неконсольные приложения писать. Доступ к свойству выглядит проще и короче.

Отредактировано Sl@Sh — 18/05/2005, 17:41
timson
Отправлено: 18.05.2005, 19:02


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

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



QUOTE
Да и потом зачем SendMessage ? Это хорошо когда на чистом WinAPI неконсольные приложения писать. Доступ к свойству выглядит проще и короче.

ComboBox1->DroppedDown = true; — это не доступ к свойству, здесь идет вызов функции (может как-то хитро перегруженная??), функция VCL, будет делать то же самое что и API.
А SendMessage — сразу обращается к контролу, без всяких обвязок ВЦЛ. посмотрел в отладчике:

ComboBox1->DroppedDown = true;
~30 asm строк + два вызова GetHandle() (VCL) + вызов какой-то системной функции

SendMessage(ComboBox1->Handle, CB_SHOWDROPDOWN, TRUE, 0);
~17 asm строк + один вызов GetHandle() (VCL) + вызов какой-то системной функции

на лицо выйгришь в быстродействии.. Но когда нет необходимости чтоб приложение работало быстрее чем со скоростью нажатия клавиш, то смысла нет (да и вообще смысла нет).
VCL это обвязка WinApi, и не все там реализовано (лично встречал, и делал с помощью АПИ)
Да и поняв Апи, Вцл становиться прозрачным... =)))
Sl@Sh
Отправлено: 19.05.2005, 16:19


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

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



QUOTE

ComboBox1->DroppedDown = true; — это не доступ к свойству, здесь идет вызов функции (может как-то хитро перегруженная??)

Ничего хитрого. Вообще-то это свойство класса (__property). А вот при его чтении и записи действительно функции вызываются (GetDroppedDown и SetDroppedDown)

Отредактировано Sl@Sh — 19/05/2005, 16:20

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