![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ComboBox
Alex8 © (2008-04-01 12:31:00)Уважаемые мастера !
Помогите, пожалуйста, разобраться в следующей ситуации.
Выпадающий список компонента ComboBox формируется при
открытии формы в процедуре FormActivate() Посредством
cmb.Item.Add();
Дальше. Если мои действия стандартны (т.е. кликаю
кнопку списка, а затем выбираю одну из его позиций),
то все нормально.
А вот если после раскрытия списка кликнуть в любом
пустом месте формы (вне списка), то взникает исключение
непонятно к чему относящееся.
Текст сообщения следующий:
" 65536 is not a valid value for field 'iKod'.
The allowed range is -32768 to 32767"
При этом все это происходит только с тем ComboBox'ом,
Список которого формируется в процедуре FormActivate().
Остальные ComboBox этой формы работают нормально.
Кликай где угодно-никаких исключений.
Пробовал остановиться по событию OnClick - не останавливается.
я в полной растеряности. Спасибо
Сергей М. (2008-04-02 21:01:00) [1]
> iKod - фактически № записи, определяемый своим
> положением в исходном файле
Какой еще нафих "исходный файл" ?
Нет никакого файла.
Есть НД, ты запрашиваешь его RecordCount, который заведомоinteger.
Ты его с какого-то перепугу усекаешь до word. Вопрос - с какого конкретно перепугу ?)
Alex8 (2008-04-02 17:57:00) [2]> Причем здесь i ? [49]
> Сергей М. © (01.04.08 15:44) [30]
> А выводы отсюда давным давно озвучены в [3] и [9] : -1,
> пройдя какие-то несуразные приведения типа к Cardinal и
> получив при этом значение 65536, тычется в поле iKod, имеющее
> тип Smallint
Я что-то запутался. iKod - фактически № записи, определяемый своим
положением в исходном файле. Поэтому i и iKod величины одного порядка.
И если iKod (i) превосходят допустимые границы типа Smallint,
то сделав LongInt, я эти границы расширю.
Сергей М. (2008-04-02 17:31:00) [3]
> При большом числе записей я сделаю
> iне SmallInt, а LongInt.
>
Причем здесь i?
Да и какой тайный смысл объявлять сч-к цикла разрядностью меньшей, чем разрядность значения, возвращаемого св-вом RecordCount и ItemIndex ?
Alex8 (2008-04-02 17:21:00) [4]> Это вопрос кол-ва записей
При большом числе записей я сделаю
i не SmallInt, а LongInt.
Сергей М. (2008-04-02 15:16:00) [5]
> это уже вопрос выбора типа данных
Да нихрена это не вопрос выбора типа данных)
Это вопрос кол-ва записей в НД, по которому ты проходишь в цикле с целью заполнения своего комбобокса.
Alex8 (2008-04-02 14:52:00) [6]> Если у тебя в списке более 32767
Ну, это уже вопрос выбора типа данных.
Фактор размерности, конечно, надо учитывать.
И не только при работе с ComboBox.
Сергей М. (2008-04-02 12:08:00) [7]
> Этот обработчик
> начинает работы только при допустимых значениях ItemIndex
> Правильно?
Нет, не правильно.
Если у тебя в списке более 32767 элементов и ты щелкнул , например, на 32768-м, то ItemIndex в обработчике события вернет тебе именно 32768, в то время как соотв.поле НД у тебя имея тип SmallInt допускает значения в диапазоне -32768..32767, что, разумеется, вызовет проблемы.
Alex8 (2008-04-02 11:52:00) [8]> Есть же событие OnSelect !
> В его обработчике и следует обращаться к ItemIndex.
Очень ценная мысль! Зачем onClozeUp-лишние хлопоты.
При OnSelect никаких блокировок не нужно. Этот обработчик
начинает работы только при допустимых значениях ItemIndex
Правильно?
Спасибо. Обязательно воспользуюсь.
Сергей М. (2008-04-02 10:39:00) [9]
> Alex8 (01.04.08 19:41) [41]
ССЗБ.
Есть же событие OnSelect !
В его обработчике и следует обращаться к ItemIndex.
{RASkov} (2008-04-01 20:19:00) [10]> Ну что мне землю есть?
Вот ведь не везет людям :(
:)
Alex8 (2008-04-01 19:41:00) [11]> Врешь. Сам по себе temIndex не может получить такое значение.
Ну что мне землю есть?
Прверил все в пошаговом режиме.
Германн (2008-04-01 19:26:00) [12]
> Alex8 (01.04.08 19:15) [39]
>
> > Хоть раз уидешь 65536?
>
> В рассматриваемом случае ItemIndex=65536.
Врешь. Сам по себе temIndex не может получить такое значение.
Alex8 (2008-04-01 19:15:00) [13]> Хоть раз уидешь 65536?
В рассматриваемом случае ItemIndex=65536. Причем не только
в ComboBox, где возникло исключение, но и в других при клике
снаружи. А есть исключение или нет, это уже зависит от содержания
обработчика OnCloseUp.
{RASkov} (2008-04-01 18:13:00) [14]> Только когда клик внутри ItemIndex=-1,
> а клик снаружи ItemIndex=65536....
> Правильно?
Нет :)
Поставь строку в самое начало OnCloseUp следующую:
ShowMessage(IntToStr(ComboBox.ItemIndex));
И скажи: Хоть раз уидешь 65536?
Alex8 (2008-04-01 17:52:00) [15]Я тут немного отлучился, а вернувшись с интересом и благодарностью ознакомился с прошедшей беседой. Как будто все прояснилось
Все действительно упирается в OnCloseUp, где у меня предусмотрена
блокировка на ItemIndex=-1, но не блокирован вариант ItemIndex=65536.
Я просто упустил из виду, что при клике по форме список все равно убирается, а потому OnCloseUp. Только когда клик внутри ItemIndex=-1,
а клик снаружи ItemIndex=65536. Значит надо блокировать оба значения.
Правильно? Хороший урок на будущее.
Большое спасибо всем, принявшим участие в обсуждении.
Anatoly Podgoretsky (2008-04-01 17:33:00) [16]> {RASkov} (01.04.2008 16:29:32) [32]
После такого количество сообщений, не так уж и хочется его видеть.
Семеныч (2008-04-01 16:37:00) [17]> {RASkov} © (01.04.08 16:31) [33]
Потому что отвечающим уже все ясно...
:о)
tesseract (2008-04-01 16:36:00) [18]
> Ошибка-то ведь в нем, скорее всего. Похоже, что именно там
> пытаются что-то запихнуть в поле iKod, а в комбобоксе в
> этот момент ничего не выбрано.
Я это уже вроде как сказал. И сказал чего его сбрасывает.
{RASkov} (2008-04-01 16:31:00) [19]> иначе долго можно гадать...
и как не страно, гадают не отвечающие в данной ветке, а вопрошающий :)
{RASkov} (2008-04-01 16:29:00) [20]> [17] Alex8 (01.04.08 14:00)
> > {RASkov} [7]
> > Какие обработчики задействованы у данного комбобокса?
>
> У данного комбобокса задействован только onCloseup
Ну вот и покажи его... иначе долго можно гадать...