Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

TListBox.AddItem( , TObject(-1))   Найти похожие ветки 

 
Sandman25   (2003-11-18 11:07) [0]

Доброе время суток.
Недавно писали об интересной фиче при добавлении в список TStrings.Objects значения, равного -1. А теперь я сам на это нарвался - Delphi Exception при вызове Items.Objects(-1).
Как можно избежать этого бага? Переделывать кучу кода не очень хочется, а данные могут быть любыми (читаются из БД), в том числе и -1.


 
Sandman25   (2003-11-18 11:08) [1]

Вместо Items.Objects(-1) следует читать Items.Objects(i)


 
Семен Сорокин   (2003-11-18 11:17) [2]

а какие данные туда заносятся?


 
Sandman25   (2003-11-18 11:19) [3]

[2] Семен Сорокин © (18.11.03 11:17)

Примерно TObject(I), I - переменная типа integer. Можно, конечно, записывать туда PInteger с динамическим выделением памяти, но не очень хочется. Медленнее будет.


 
Семен Сорокин   (2003-11-18 11:21) [4]

как вариант заносить cardinal - с соответсвующим сдвигом при занесении, и обратным при чтении


 
Sandman25   (2003-11-18 11:26) [5]

[4] Семен Сорокин © (18.11.03 11:21)

Спасибо. Не совсем понял насчет сдвигов. Попробую разобраться. Но думаю, что проблема останется: $FFFFFFFF все равно может встретиться в исходных данных (или $7FFFFFFF, если со сдвигом). Видимо, придется разбираться с исходником TStrings, и если не получится их нормально исправить, переходить на указатели :(


 
Юрий Зотов   (2003-11-18 11:34) [6]

Непонятно, о каких проблемах и багах идет речь. Я такие вещи делал несчетное множество раз и никаких проблем до сих пор не было.

Запись: Objects[i] := TObject(-1);
Чтение: N := Integer(Objects[i]);

На всякий случай проверьте состояние опции Range Checking - может, это она влияет?


 
Reindeer Moss Eater   (2003-11-18 11:44) [7]

Всегда работало, не понимаю откуда проблема высосана.

with TStringList.Create do
try
AddObject("",TObject(-1));
ShowMessage(IntToStr(Integer(Objects[0])));
finally
Free;
end;


 
Семен Сорокин   (2003-11-18 11:47) [8]

вот и я думаю :))


 
Sandman25   (2003-11-18 11:52) [9]

[6] Юрий Зотов © (18.11.03 11:34)

Я тоже такое делаю не первый раз :)
С обычными Strings проходит, а с TListBox не хочет. List index out of bounds. {$R-} не помогает.
Проверьте в своей версии Delphi...

procedure TForm1.FormCreate(Sender: TObject);
var
ListBox1: TListBox;
begin
ListBox1 := TListBox.Create(nil);
try
ListBox1.Parent := Self;
ListBox1.AddItem("0", TObject(0));
ListBox1.AddItem("1", TObject(-1));
{ Application.MessageBox(PChar(IntToStr(integer(ListBox1.Items.Objects[0]))), "0");}
Application.MessageBox(PChar(IntToStr(integer(ListBox1.Items.Objects[1]))), "1");
finally
ListBox1.Free;
end;
end;

Если комментарий убрать, то вообще зависает после показа первого сообщения.

Я в принципе уже свою задачу решил - перешел на TRecord = record id: integer; PRecord = ^TRecord; Возможно, расширение записи когда-нибудь понадобится. Всем спасибо.


 
Sandman25   (2003-11-18 11:54) [10]

[7] Reindeer Moss Eater © (18.11.03 11:44)

Такое и у меня работает, Вы с TListBox проверьте.


 
Murad   (2003-11-18 12:10) [11]

Да интересно... не работет действительно при TObject(-1), хотя при TObject(-2) и т.п. работает...


 
Reindeer Moss Eater   (2003-11-18 12:14) [12]

Все дело в том, что у TListBox свойство Items не TStrings а TListBoxStrings.

Windows.pas;
....
{$EXTERNALSYM LB_ERR}
LB_ERR = -1;
....

StdCtrls.pas
....
function TListBoxStrings.GetObject(Index: Integer): TObject;
begin
Result := TObject(ListBox.GetItemData(Index));
if Longint(Result) = LB_ERR then Error(SListIndexError, Index);
end;
....


 
Sandman25   (2003-11-18 12:17) [13]

[12] Reindeer Moss Eater © (18.11.03 12:14)

Понятно. Спасибо за объяснение.


 
Семен Сорокин   (2003-11-18 12:19) [14]

век живи, век учись


 
Digitman   (2003-11-18 12:35) [15]

та же "засада", кстати, и с комбо-боксом :

function TComboBoxStrings.GetObject(Index: Integer): TObject;
begin
Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
if Longint(Result) = CB_ERR then
Error(SListIndexError, Index);
end;


 
Игорь Шевченко   (2003-11-18 12:58) [16]

Это вообще-то не засада...это by design.


 
Digitman   (2003-11-18 13:02) [17]


> Игорь Шевченко


поэтому и в кавычках оная)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
4-90181
stainer
2003-10-05 14:45
2003.11.27
иконка 16 на 16


1-89846
mmmaloy
2003-11-16 18:52
2003.11.27
Не работает Find в TStringList


14-90101
чайник
2003-11-04 14:53
2003.11.27
Windows XP


1-89962
romeo
2003-11-13 22:42
2003.11.27
Не хватает памяти для печати (или у меня мозгов? :-)


14-90091
vuk
2003-11-04 14:04
2003.11.27
Получите! Распишитесь!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский