Как закрыть Combo?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте!

Как-то, кажеться, в рассылке уже звучало что-то подобное. По-моему, от Вадима Синявского?
Но не помню - был-ли ответ?

Может кто знает, как заставить Combo-контрол закрыть выпадющий список? Естественно, без клавиатуры и мыши, чисто программно. И желательно без сабклассинга.
Единственное, чего удалось добится - закрытие списка при передаче фокуса на другой контрол. Через Select или PressKey(TabKey). Но это, имхо, не есть хорошо.

И заодно - если кто разбирался с этим контролом - есть-ли способ определить, открыт-ли список или нет?

Спасибо!

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Ну, с последним вопросом разобрался - надо проверить видимость окна выпадающего списка:

ListPart# = ?Combo{PROP:ListFeq}
IsWindowVisible(ListPart#{PROP:Handle})

А вот с закрытием - не получается ничего!

=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
Гость

Сообщение Гость »

Олег - как раз это как два пальца об асфальт :)
Когда нужно закрыть список - почти достаточно сделать:
(?Combo{PROP:ListFeq}){PROP:Hide} = True
Правда после этого наивный движек продолжает считать, что дропик открыт и нужно дважды нажимать на стрелку для вторичного открытия списка.

--
Best regards,
Vadim mailto:vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)
Гость

Сообщение Гость »

Ну-у-у, так тоже, имхо, не совсем красиво!
К тому-же, как ты сам заметил, имеется побочный эффект, не совсем приятный для юзера.
У меня, в конце-концов, и то лучше получилось - эмулирую нажатие мыши на кнопке открытия/закрытия.
Через WinAPI. Правда, в этом случае курсор мыши остается на кнопке. Хотя, конечно, можно его вернуть туда, откуда взял :) Вот сейчас и думаю - возвращать или оставить на кнопке? Типа дополнительного сервиса :)

Вообщем, не хорошо они поступили с дроп-списками - добраться до кнопки можно, а вот работать с ней (кроме как через WinAPI) - нельзя!

А весь "сыр-бор", кстати, из-за желания юзверей иметь в формах яля-ДОС навигацию по полям, когда переход идет по Enter`у. Особых проблем нет - работало всегда прекрасно, пока не ввел в одну из форм дроп-списки на своем классе (таких списков там много и не хочеться, что-бы код "распухал" из-за многократного повторения кода бровз-шаблона). И выбор, естественно, в этих списках хочеться иметь то-же по Enter-у.
Сначала пришлось решать задачу определения состояния списка (закрыт-открыт), что-бы не обрабатывать закрытый список. И здесь разработчики SV "забыли" дать нужную инфу. Ну и, в конце, когда запись выбрана надо теперь закрыть этот список. Пока оставил закрытие по переходу на следующее поле - как-бы "вписывается" в общую идеологию перехода по Enter-у!

И еще с одним столкнулся - проблемы с PRESS/PRESSKEY.
Причем - ужасные. PRESS практически не работает, а KEYPRESS "залипает" на SHIFT-комбинациях!

=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
Гость

Сообщение Гость »

Я себе (в chSTD) добавил такую процедурку (примерно):

Код: Выделить всё

fCloseDrop    procedure(signed parCombo)
 code
  if parCombo{prop:type} = create:combo
    if IsWindowVisible((parCombo{prop:ButtonFeq}){prop:Handle})
      SendMessage((parCombo{prop:ButtonFeq}){prop:Handle}, 0100h, enterkey, 0)
    end
  end


Сергей - chusha@mail333.com ; chusha@hotbox.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

О! Это - наиболее красивый вариант!
Надо будет проверить - а то я в своих экспериментах что-то подобное делал, но ничего не получалось.
Правда, я "дергал" кнопку не через SendMessage, а через mouse_event и посылал ему нажатие левой кнопки мышки.

Спасибо!

Здесь, скорее всего, надо так

if IsWindowVisible((parCombo{prop:ListFeq}){prop:Handle})

А то будешь не только закрывать комбо, но еще и открывать!

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Сорри! Поторопился! Попробовал - кнопка не реагирует на Enter в закрытом состоянии.
Хотя, имхо, все равно следует проверять открытость списка - для пущей "красивости" :))

=============================
С уважением, Олег А. Руденко.
Написал: ClaList(2)
Гость

Сообщение Гость »

SendMessage часто "рулит". Например, в svGraph я с её помощью определяю размер текста который будет выведен в контроле
(метод Graph2PrimitiveClass.GetTextRec).
Пока мне Соловьёв не сказал, как можно получить истинные
параметры шрифта - измучался, пытаясь понять почему рассчитанные
размеры не совпадают с реальными. :/

Сергей
Написал: ClaList(2)
Гость

Сообщение Гость »

А что, вывод текста в скрытый контрол с последующим определением получившегося размера не проходит?!
У меня так работает. Или ты имеешь в виду вывод текста через API-функции?

=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
Гость

Сообщение Гость »

Привет, Всем!

Не пробовал WinAPI функцию GetTextExtentPoint32 использовать? Ее прямая обязанность посчитать размер строки. Хотя шрифт все равно в контексте устанавливать, видимо, придется, потому разницы наверное с DrawText особой не будет ;)

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Гость

Сообщение Гость »

А то будешь не только закрывать комбо, но еще и открывать!
Упссс :) Да, конечно так. Очепятка...
У меня так работает. Или ты имеешь в виду вывод текста через API-функции?
По началу у меня так и было. Но это медленнее и не всегда удобно. А в некоторых случаях и невозможно было.
Да и не правильно это: получать параметры контрола посредством другого. :)
Это как-то по нашенски получится - "через то самое место"
Не пробовал WinAPI функцию GetTextExtentPoint32 использовать? Ее прямая обязанность посчитать размер строки. Хотя шрифт все равно в контексте устанавливать, видимо, придется, потому разницы наверное с DrawText особой не будет ;)

Пробовал, но ничего путного не получилось - размеры получал "не те".

Сергей
Написал: ClaList(2)
Ответить