Ребята, все гораздо проще.
Варианта 2:
1. Вот функция (и класс-хелпер), которая добавляет строчку в лист бокс. Принимает на вход имя файла, помещает в контрол "чистое" имя (без пути и без расширения), а в коллекцию Objects - экземпляр класса-хелпера, содержащего полное имя файла. Ну и в довесок функция получения полного имени файла по индексу. внимание! В этом коде доп. ссылки на объекты-хелперы не сохраняются, так что при удалении строки из ListBox'а надо позаботиться об удалении соответсвующего хелпера.
Код целиком вставляется в секцию имплементации. Если нужен доступ снаружи, то вынесите описания функций в секцию интерфейса.
Код:
type
TFileNameHelper = class
FileName : String;
end;
function AddFileName(AListBox : TListBox; AFileName : TFileName) : Integer;
var
AHelper : TFileNameHelper;
begin
AHelper := TFileNameHelper.Create;
AHelper.FileName : =AFileName;
Result := AListBox.AddObject(ChangeFileExt(ExtractFileName(AFileName),''),AHelper);
end;
function GetFileName(AListBox : TListBox; AIndex : Integer) : String
begin
Result := (AListBox.Items.Objects[AIndex] As TFileNameHelper).FileName;
end;
==================================
Вариант 2ой - OwnerDraw.
Файлы добавляются с полным путем как обычно:
Код:
ListBox1.Items.Add('c:\myfolder\myfile.ext');
А вот отрисовку итема листбокса делаем руками (в данном примере грубо, просто отрисовываем). Что надо для этого сделать:
1. У ListBox'а поставить свойство Style в значение lbOwnerDrawFixed.
2. Реализовать обработчик события OnDrawItem примерно так:
Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
ACanvas : TCanvas;
AText : String;
begin
ACanvas := (Control As TListBox).Canvas;
If State In [odSelected, odFocused]
Then
Begin
ACanvas.Brush.Color := clHighlight;
ACanvas.Font.Color := clHighlightText;
End
Else
Begin
ACanvas.Brush.Color := clWindow;
ACanvas.Font.Color := clWindowText;
End;
ACanvas.FillRect(Rect);
AText := ChangeFileExt(ExtractFileName((Control As TListBox).Items[Index),'');
ACanvas.TextOut(Rect.Left,Rect.Top,AText);
end;
При этом получение реального имени файла останется таким же, как было бы, если бы выводилось все обычным образом:
Код:
AFileName := ListBox1.Items[AIndex];