FAQ VCL
Компоненты\ListView

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как в ListView пеpетаскивать итемы?

// ListView1.DragMode = dmAutomatic

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := True;
end;

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  LI: TListItem;
  i1, i2: Integer;
begin
  ListView1.Items.BeginUpdate;
  LI := TListItem.Create(ListView1.Items);
  try
    i1 := ListView1.Selected.Index;
    // или i1 := ValueList.ItemIndex - на ваше усмотрение
    i2 := ListView1.DropTarget.Index;
    LI.Assign(ListView1.Items[i1]);
    ListView1.Items[i1].Assign(ListView1.Items[i2]);
    ListView1.Items[i2].Assign(LI);
  finally
    LI.Free;
    ListView1.Items.EndUpdate;
  end;
end;


Как ListView перевести в режим редактирования по нажатию на F2?

// Способ первый
procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ListView1.SelCount <> 0 then
    if Ord(Key) = VK_F2 then
      ListView1.Selected.EditCaption;
end;

// Способ второй
procedure TForm1.ListView1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_F2) and (ListView1.SelCount <> 0) then
    ListView1.Selected.EditCaption;
end;


Как произвести сортировку в ListView при нажатии на заголовок?

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  // Если щелкнули по первой колонке - Caption
  if Column = ListView1.Columns[0] then
    ListView1.CustomSort(@SortCaption, 0)
  else
  // Если щелкнули по второй колонке - SubItem1
    ListView1.CustomSort(@SortFirstSubItem, 0);
end;

// Сортируем по первой колонке - Caption (строковое поле)
function SortCaption(Item1, Item2: TListItem; ParamSort: Integer): Integer; stdcall;
begin
  Result := 0;
  if AnsiUpperCase(Item1.Caption) > AnsiUpperCase(Item2.Caption) then
    Result := 1
  else if AnsiUpperCase(Item1.Caption) < AnsiUpperCase(Item2.Caption) then
    Result := -1;
end;

// Сортируем по второй колонке - SubItem1 (поле даты)
function SortFirstSubItem(Item1, Item2: TListItem; ParamSort: Integer): Integer; stdcall;
begin
  Result := 0;
  if StrToDate(Item1.SubItems[0]) > StrToDate(Item2.SubItems[0]) then
    Result := 1
  else if StrToDate(Item1.SubItems[0]) < StrToDate(Item2.SubItems[0]) then
    Result := -1;
end;


Как выделить некоторые строчки TListView бледным (аналогично Ctrl+X в проводнике)?

uses
  {...,} CommCtrl;

procedure SetItemState(item: TListItem; Flags: Integer);
var
  tli: TLVItem;
begin
  FillChar(tli, SizeOf(tli), 0);
  tli.iItem := item.Index;
  tli.mask := LVIF_STATE;
  tli.stateMask := LVIS_CUT;
  tli.state := Flags;
  ListView_SetItem(item.Handle, tli);
end;

procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  // Выделяем бледным
  if (Sender as TListView).SelCount > 0 then
    if ssCtrl in Shift then
      if (Key = Ord('X')) or (Key = Ord('x')) then
        SetItemState((Sender as TListView).Selected, LVIS_CUT);
  // Снимаем выделение
  if Key = VK_ESCAPE then
    SetItemState((Sender as TListView).Selected, 0);
end;


Как изменить цвет фона строки TListView?

// Способ первый
// Меняем цвет первых трех строк
// ListView1.OwnerDraw = true
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  with ListView1.Canvas.Brush do
  begin
   case Item.Index of
     0: Color := clYellow;
     1: Color := clGreen;
     2: Color := clRed;
   end;
  end;
end;

// Способ второй
// Чередуем цвет через строку
// ListView1.OwnerDraw = true
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if Item.Index mod 2 <> 0 then
    Sender.Canvas.Brush.Color := cl3DLight
  else
    Sender.Canvas.Brush.Color := clWhite;
end;


Как предотвратить изменение ширины колонки для TListView?

uses
  {...,} CommCtrl;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FListViewOldWndProc: TWndMethod;
    procedure ListViewNewWndProc( var Msg: TMessage );
  public
    { Public declarations }
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FListViewOldWndProc := ListView1.WindowProc;
  Listview1.WindowProc := ListViewNewWndProc;
end;

procedure TForm1.ListViewNewWndProc(var Msg: TMessage);
var
  Hdn: ^THDNotify;
begin
  if Msg.Msg = WM_NOTIFY then
  begin
    Hdn := Pointer(Msg.lParam);
    if (Hdn.Hdr.code = HDN_BEGINTRACKW) or (Hdn.Hdr.code = HDN_BEGINTRACKA) then
      Msg.Result := 1
    else
      FListViewOldWndProc(Msg);
  end
  else
    FListViewOldWndProc(Msg);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ListView1.WindowProc := FlistViewOldWndProc;
  FListViewOldWndProc := nil;
end;


Как получить все выделенные элементы TListView?

// MultiSelect = true

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  with Listview1 do
  for i := 0 to Items.Count-1 do
    if Items[i].Selected then
      Items[i].Caption := Items[i].Caption + ' - Selected!';
end;


Как определить, по какой колонке в TListView был произведен щелчок?

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  ShowMessage(IntToStr(Listview1.Column[Column.Index].Index));
end;


Как отловить нажатие на CheckBoxe в TListView?

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Item: TListItem;
  HitTest: THitTests;
begin
  Item := ListView1.GetItemAt(X, Y);
  HitTest := ListView1.GetHitTestInfoAt(X, Y);
  if (Item <> nil) and (HitTest = [htOnStateIcon]) then
  begin
    if Item.Checked then
      ShowMessage(Format('Включен CheckBox с индексом %d', [Item.Index]))
    else
      ShowMessage(Format('Выключен CheckBox с индексом %d', [Item.Index]));
  end;
end;


Как изменить шрифт в ListView на моноширный?

// SYSTEM_FIXED_FONT или ANSI_FIXED_FONT

procedure TForm1.FormCreate(Sender: TObject);
begin
  SendMessage(ListView1.Handle, WM_SETFONT,
              GetStockObject(SYSTEM_FIXED_FONT), 1);
end;

При использовании материала - ссылка на сайт обязательна