Показать сообщение отдельно
  #7  
Старый 02.10.2008, 15:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,107
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ребята, все гораздо проще.

Варианта 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];
Ответить с цитированием