Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TComboBox bug?


Автор: December 28.2.2005, 01:46
Greetings All!
Прошу проверить энтузиастов следующую ситуацию. Положите на форму банальный TComboBox. Задайте списку несколько элементов, один из которых - пустая строка. Запустите проект и выберите пустую строку в выпадающем списке. Спасибо.
У меня на D7/Win2KSP3 вылезает ntdll error. Кроме того, это не единственный баг с сабжем.

Автор: <Spawn> 28.2.2005, 05:39
D7/Win2003 - "Access violetion ... in module ntdll.dll"

Автор: ~FoX~ 28.2.2005, 09:49
December
Д7/В2К Сервер - все Ок

Поставь в св-вах компилера Use Debug DCU погляди где он ругнется.

Автор: Snowy 28.2.2005, 10:57
WinXP/D7 - все в порядке. Даже предупреждений при всех галочках не дает.
Видимо проблема с Win2k3.
P.S. Сервиспак уже вышел...

Автор: p0s0l 28.2.2005, 13:40
WinXPSp1/D7 - Access Violation

Автор: bursa 28.2.2005, 13:58
D7/Win2KSP4 - ntdll error

Автор: p0s0l 28.2.2005, 14:11
Источник ошибки легко обнаруживается... Опять же, уже в который раз, виновата Borland... smile
Даже если просто обратиться к пустому итему, то будет ошибка:
Код
ComboBox1.Items[2];


Код получения i-ой строки таков:
Код
function TCustomComboBoxStrings.Get(Index: Integer): string;
var
 Len: Integer;
begin
 Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0);
 if Len <> CB_ERR then // CB_ERR = -1
 begin
   SetLength(Result, Len);
   SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result)));
 end
 else
   SetLength(Result, 0);
end;

Посылка CB_GETLBTEXTLEN возвращает 0... Длина Result'а = 0, PChar(Result)'а ссылается на нулевой байт, лежащий в области кода, т.е. эта область не доступна для записи (PAGE_EXECUTE_READ)...
Ну и CB_GETLBTEXT пытается записать нулик, и обламывается... smile

Добавлено @ 14:15
Странно, что у нескольких людей нормально работает... Буди что в других виндах/сервис паках сделали проверку на защиту памяти...

Автор: Snowy 28.2.2005, 14:33
Ненаю. Дома еще попробую. Просто на работе автоапдейт микросовтовский работает. Дома без него еще попробую...

Автор: NiJazz 28.2.2005, 14:42
Delphi 7 / WinZP SP1
Цитата
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 77F52CC3 in module 'ntdll.dll'. Write of address 004042D5'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------

Автор: The MASTER 28.2.2005, 14:51
Windows XP Service Pack 2, Delphi 7, ошибок нету!

Автор: ~FoX~ 28.2.2005, 15:10
D7 with updite|W2k Server без SP все ок!
D7 with updite|W2k Server SP4 все ок!

Автор: Alex 28.2.2005, 18:49
Кто-то тут недавно говорил, что SP1 на Delphi 7 Ставить не нужно smile

Прошу:
Код

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


Код проверил на машинах с Win98/WinXP/WinXP SP2

Автор: ~FoX~ 28.2.2005, 19:45
Дома проверил D7SP|Win2k prof без SP ок!

Автор: December 28.2.2005, 21:57
Да, забавно. Из-за этого я когда-то потратил часов 6, в попытке локализовать баг... Или это был совсем ДРУГОЙ баг с ТКомбоБоксом? smile

Интересно посмотреть на реализацию этого метода в D6:
Код

function TCustomComboBoxStrings.Get(Index: Integer): string;
var
 Text: array[0..4095] of Char;
 Len: Integer;
begin
 Len := SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(@Text));
 if Len = CB_ERR then Len := 0;
 SetString(Result, Text, Len);
end;
Как видим, код полностью переделали, наверно, чтобы быстрее работал smile
Всем спасибо за сотрудничество.

Alex
Цитата(Alex @ 28.2.2005, 18:49)
Кто-то тут недавно говорил, что SP1 на Delphi 7 Ставить не нужно
Ещё один инцидент - и поставлю smile Пока что обошёлся малой кровью, патчем в одну строку smile

Автор: Romtek 28.2.2005, 22:31
В Delphi 6 Personal+Update Pack 2 / WinXP+SP1 никаких ошибок.

Автор: Medved 1.3.2005, 04:23
Цитата(Alex @ 28.2.2005, 21:49)
Кто-то тут недавно говорил, что SP1 на Delphi 7 Ставить не нужно


ИМХО наоборот нужно. Много он подобных ошибок исправляет. Где-то на сайте борланда, я видел перечень ошибок, которые он фиксит, и скажу что он довольно внушительный.

Автор: Alex 1.3.2005, 09:47
Pegas http://forum.vingrad.ru/index.php?showtopic=40939

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)