Форум: "Основная";
Текущий архив: 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