Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  20:12[Войти] | [Зарегистрироваться]

VCL.TComboBox.AV при выборе пустого элемента списка

Алексей Кузнецов
дата публикации 13-04-2007 02:10

КАТЕГОРИЯБИБЛИОТЕКА.VCL.TComboBox.AV при выборе пустого элемента списка
ПРОДУКТDelphi 7
ПЛАТФОРМАWindows


Баг воспроизводится ТОЛЬКО в Delphi 7.0 он подробно описан на Quality Central (БАГ номер 2442)

Так как не все посещают QC :) имеет смысл этот баг запостить в камни :)

Вот текст прям с QC.
Если кратко — предлагают патчить StdCtrls или писать наследника

Description

Delphi 7 introduced a new bug in TCombobox. When an empty line is present in Items and you select that empty line from the dropdown, an access violation in ntdll.dll occurs.

Steps to Reproduce:

  • New Application
  • Place a TCombobox on Form1
  • Fill the Items property with at least one empty line
  • Run the application and choose the empty line from the dropdown
  • The Access Violation Occurs



Типовые решения
Workarounds

The solution is to change a function in StdCtrls.
When asking windows for LBTEXTLEN and zero is returned then the length of Result will be set to zero and a not initialized PChar will be passed to windows which results in an access violation. The solution is not only to test for CB_ERR but also for len=0. (because CB_ERR equals -1 the fast test would be Len>0 but that's not descriptive, decide yourself...)

This is the changed function

function TCustomComboBoxStrings.Get(Index: Integer): string;
var
  Len: Integer;
begin
  Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0);
  if (Len <> CB_ERR) {solution: also test for zero length} and (Len <> 0)   then
  begin
    SetLength(Result, Len);
    SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result)));
  end
  else
    SetLength(Result, 0);
end;

(when you look in the Delphi6 source, you can see they used an array of const (4096 chars), so the setlength (Result, 0) problem was not present in Delphi6)

If you have a descedant or want to make a descedant of TCustomComboBox, then you can also make a descedant of TCustomComboBoxStrings with an override for the function Get (with the fix in it) override the TCustomComboBox.GetItemsClass and return the class of your own descedant of TCustomCombBoxStrings.

Oh: don't forget to copy the function Add and the procedure Insert form the TComboboxStrings, which is defined in the implementation, so you can't descent from that class.


Смотрите также материалы по темам:


[TComboBox] [Отображение списков, сеток]

 Обсуждение материала [ 01-05-2007 20:18 ] 10 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Хостинг предоставлен компанией DOTNETPARK (ASP.NET, MS SQL hosting)  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования