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) | Как это работает ? |
Бросаете на форму комбо бокс и кнопку и в обработчик кнопки приведенный код, жмете кнопку и смотрите.
|
|
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 такая-же байда
В 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
|
|