![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк - TStrings.AddObject(TObject(-1)) [D7]
TheEd © (2005-02-20 00:41:00)Господа мастера, сабж:
Берём TStrings и делаем:
AddObject(TObject(X))
для к примеру X=0,1,2,-1,-2...
Потом получаем обратно наши циферки:
for i:=0 to SomeStrings.Count - 1 do begin
SomeInteger := integer(SomeStrings.Objects[i]); // так
SomeObject := integer(SomeStrings.Objects[i]); // или так
end;
для i=3 фокус не удастся (X=-1), причём дёрнется исключение типа Index out of range, однако SomeStrings.Count - 1 > 3 и для i=0,1,2,4,... это сработает! Дело видимо в том что -1 не приводится к TObject.
Как поместить в список -1???
TheEd (2005-02-21 02:15:00) [1]Странный ход конём :) - это я по поводу того что -1 считается ошибкой...
А за ответ спасибо. Толково и ясно - короче помогло!
default (2005-02-20 04:21:00) [2]
Result := TObject(ListBox. GetItemData(Index));
function TCustomListBox.GetItemData(Index: Integer): LongInt;
begin
Result := SendMessage(Handle, LB_GETITEMDATA, Index, 0);
end;
можешь так получать, как видишь, доступ
вообще ты информация есть дальше уже как тебе нужно делай
default (2005-02-20 04:13:00) [3]
constructor TCustomListBox.Create(AOwner: TComponent);
const
ListBoxStyle = [csSetCaption, csDoubleClicks];
begin
inherited Create(AOwner);
if NewStyleControls then
ControlStyle := ListBoxStyle else
ControlStyle := ListBoxStyle + [csFramed];
Width := 121;
Height := 97;
TabStop := True;
ParentColor := False;
FAutoComplete := True;
FItems := TListBoxStrings.Create; TListBoxStrings(FItems).ListBox := Self;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
FItemHeight := 16;
FBorderStyle := bsSingle;
FExtendedSelect := True;
FOldCount := -1;
end;
function TListBoxStrings.GetObject(Index: Integer): TObject;
begin
if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
Result := ListBox.DoGetDataObject(Index)
else
begin
Result := TObject(ListBox.GetItemData(Index));
if Longint(Result) = LB_ERR then Error(SListIndexError, Index); end;
end;
LB_ERR = -1;
так что вот так:)
default (2005-02-20 03:53:00) [4]покопайся в исходниках
TListBox виноват в этом, там считается -1 за код ошибки
(я не стал лезть уж там сильно в дебри...)
если уберёшь отовсюду -1 то заработает
TheEd (2005-02-20 03:06:00) [5]да я по памяти писал, а ошибки нет - попробуй напр. так поиздеваться над TListBox:
SomeListBox.AddItem('Item5', TObject(2));
SomeListBox.AddItem('Item4', TObject(1));
SomeListBox.AddItem('Item1', TObject(0));
SomeListBox.AddItem('Item2', TObject(-1));
SomeListBox.AddItem('Item3', TObject(-2));
а потом:
SomeListBox.Sort := true; // !!! будет исключение
Исключение того же рода - т.к. SomeListBox пытается получить доступ к Objects, связанным с Item2 при сортировке. У кода ListBox ошибки нет - Borland писал.
default (2005-02-20 00:58:00) [6]у тебя ошибка в программе
покажи реальный код
TheEd (2005-02-20 00:44:00) [7]Сорри, ошибка в 1 строке:
вместо
SomeObject := integer(SomeStrings.Objects[i]); // или так
так:
SomeObject := SomeStrings.Objects[i]; // или так