1. Создайте свой стиль для ListBoxItem, например 'listboxitemMystyle', скопировав стандартный и переобозвав его. В своем стиле Итемов просто сделайте невидимым Detail. Или, что еще лучше, - храните Ваши ссылки в TagString Итема.
2. В Style Designer, при редактировании Вашего listboxitemMystyle, вставьте TImage задайте ему необходимые свойства: выравнивание, размеры, отступы и т.д. (не забудьте сделать "растягивание" или что там Вам требуется - просто проверьте в дизайнере). И задайте Вашему TImage имя, например, 'myimagestyle'.
3. При загрузке изображения я бы рекомендовал сначала загрузить изображение в созданный TBitmap, а потом уже грузить его в наш 'myimagestyle'. А самое оптимальное решение - загрузка изображений в "контейнер", в фоновом режиме, а при окончании загрузки, по событию, - отрисовка уже в самом итеме. В любом случае - сначала в битмап, а потом этот битмап в Итем. Иначе, вероятность того что битмап отрисуется в вашем случае - практически нулевая.
4. Далее, при создании итемов:
procedure ContactList_AddItem(Sender: TObject);
var
newItem : TListBoxItem;
newBitmap : TBitmap;
begin
newItem := TListBoxItem.Create(nil);
newItem.StyleLooup := 'listboxitemMystyle'; // хотя будет проще не писать этого, а прописать в ListBox1.DefaultItemStyles.ItemStyle
newItem.Text := 'текст';
newItem.TagString := тут может быть Ваша ссылка
newBitmap := TBitmap.Create;
newBitmap.LoadFrom ....... // грузим картинку
newItem.TagObject := newBitmap;
newItem.OnApplyStyleLookup := MyItemApplyStyle;
ListBox1.AddObject(newItem);
end;
procedure MyItemApplyStyle(Sender: TObject);
var
LI : TListBoxItem;
tmpBitmap : TBitmap;
begin
LI := Sender as TListBoxItem;
if Assigned(LI) then
try
LI.BeginUpdate;
tmpBitmap := LI.TagObject as TBitmap;
if Assigned(tmpBitmap) then
LI.StylesData['myimagestyle.bitmap'] := tmpBitmap;
// тут вообще можно обновлять все что угодно в этом Итеме
finally
LI.EndUpdate;
end;
end;
Собственно все.
Сорри если что не понятно - писал "от руки", без проверки. Но вроде все просто.