:: 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;
|
Как отловить нажатие на 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;
|
При использовании материала - ссылка на сайт обязательна
|
|