... or a helper function that can be used on any TListBox without requiring a modification introduced on a specific base class (easily adapted for other control types, obviously)
uses RTLConsts; type TListBoxHelper = class(TListBox); TStringsHelper = class(TStrings); function ListBoxGetObject(const aListBox: TListBox; const aIndex: Integer): TObject; begin if (aIndex < 0) or (aIndex >= aListBox.Items.Count) then TStringsHelper(aListBox.Items).Error(SListIndexError, aIndex); result := TObject(TListBoxHelper(aListBox).GetItemData(aIndex)); end; In this approach I separate the two entirely separate problems of an invalid list index and an error in retrieving item data by specifically testing the index for validity *before* attempting to retrieve the object. Whatever errors might conceivably occur as a result of calling GetItemData() you at least won't get a spurious and misleading "list index out of bounds". > -----Original Message----- > From: delphi-boun...@delphi.org.nz [mailto:delphi- > boun...@delphi.org.nz] On Behalf Of Karl Reynolds > Sent: Tuesday, 16 February 2010 11:16 a.m. > To: NZ Borland Developers Group - Delphi List > Subject: Re: [DUG] Is it a bug in latest version of Delphi? > > One way to get around this would be to add your own descendant of > TListBox and add an Objects property that works as you would expect > (ie. use that instead of items.objects). Here's a quick sample I > knocked together: > > >> > unit MyListBox; > > interface > > uses > SysUtils, Classes, Controls, StdCtrls, RTLConsts; > > type > TMyListBox = class(TListBox) > private > function GetObject(AIndex: Integer): TObject; > procedure SetObject(AIndex: Integer; const AValue: TObject); > { Private declarations } > protected > { Protected declarations } > public > property Objects[AIndex: Integer]: TObject read GetObject write > SetObject; > published > { Published declarations } > end; > > procedure Register; > > implementation > > type > TIPRStrings = class(TStrings); > > function TMyListBox.GetObject(AIndex: Integer): TObject; > begin > Result := TObject(GetItemData(AIndex)); > if GetLastError <> 0 then > TIPRStrings(Items).Error(SListIndexError, AIndex); > end; > > procedure TMyListBox.SetObject(AIndex: Integer; const AValue: TObject); > begin > Items.Objects[AIndex] := AValue; > end; > > procedure Register; > begin > RegisterComponents('Samples', [TMyListBox]); > end; > > end. > << > > Alternatively, you could just use the relevant code yourself on your > own listbox where you need to > > type > TIPRCustomListBox = class(TListBox); > > procedure TForm1.Button1Click(Sender: TObject); > var > i: Integer; > begin > ListBox1.Items.AddObject('foo', TObject(-1)); > i := Integer(TIPRCustomListBox(ListBox1).GetItemData(0)); > if GetLastError <> 0 then // an error occurred, raise an exception or > whatever > else ShowMessage(IntToStr(i)); > end; > > Cheers, > Karl > _______________________________________________ > NZ Borland Developers Group - Delphi mailing list > Post: delphi@delphi.org.nz > Admin: http://delphi.org.nz/mailman/listinfo/delphi > Unsubscribe: send an email to delphi-requ...@delphi.org.nz with > Subject: unsubscribe _______________________________________________ NZ Borland Developers Group - Delphi mailing list Post: delphi@delphi.org.nz Admin: http://delphi.org.nz/mailman/listinfo/delphi Unsubscribe: send an email to delphi-requ...@delphi.org.nz with Subject: unsubscribe