📄 listview.pas
字号:
unit ListView;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, InspCtrl, CompInsp, MySplit, ComCtrls, MyListVw,
ExtCtrls, MyPanel, MyButton, MyAutoBtn, TypInfo, PropList, PropEdit;
type
TListViewPropertyEditor = class(TPropertyEditor)
private
function GetListItems: TListItems;
public
function Execute: Boolean; override;
property ListItems: TListItems read GetListItems;
end;
TTargetPosition = (tpNone,tpTop,tpItem,tpBottom);
TInspectorData = class(TPersistent)
private
FCaption: string;
FImageIndex: Integer;
FStateIndex: Integer;
FSubitems: TStrings;
published
property Caption: string read FCaption write FCaption;
property ImageIndex: Integer read FImageIndex write FImageIndex;
property StateIndex: Integer read FStateIndex write FStateIndex;
property Subitems: TStrings read FSubitems write FSubitems;
public
constructor Create;
destructor Destroy; override;
end;
TfrmListViewEditor = class(TForm)
MyPanel1: TMyPanel;
lsvItems: TMyListView;
MySplitter1: TMySplitter;
cinItemProperties: TComponentInspector;
btnClose: TMyAutoBitBtn;
btnDelete: TMyAutoBitBtn;
btnAdd: TMyAutoBitBtn;
spbMoveUp: TMySpeedButton;
spbMoveDown: TMySpeedButton;
btnOk: TMyAutoBitBtn;
procedure spbMoveDownClick(Sender: TObject);
procedure spbMoveUpClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure lsvItemsChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure lsvItemsDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure lsvItemsDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure cinItemPropertiesExit(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure cinItemPropertiesChange(Sender: TObject; TheIndex: Integer);
private
FEditor: TListViewPropertyEditor;
DragItem: TListItem;
FInspectorData: TInspectorData;
procedure ItemToData(Item: TListItem; Data: TInspectorData);
procedure DataToItem(Data: TInspectorData; Item: TListItem);
procedure WMGetMinMaxInfo(var Msg: TMessage); message WM_GETMINMAXINFO;
{ Private declarations }
public
{ Public declarations }
end;
var
frmListViewEditor: TfrmListViewEditor;
implementation
{$R *.dfm}
const
ScrollArea = 6;
function TListViewPropertyEditor.GetListItems: TListItems;
begin
Result:=Prop.AsObject as TListItems;
end;
function TListViewPropertyEditor.Execute: Boolean;
begin
with TfrmListViewEditor.Create(Application) do
try
FEditor:=Self;
lsvItems.Items.Assign(ListItems);
with cinItemProperties do
begin
if ListItems.Count>0 then
begin
ItemToData(lsvItems.Items[0],FInspectorData);
Instance:=TComponent(FInspectorData);
end
else Instance:=nil;
Root:=TCompInspPropertyList(Prop.Owner).Root;
PaintStyle:=TCompInspPropertyList(Prop.Owner).CompInspList.Owner.PaintStyle;
TCompInspPropertyList(Prop.Owner).CompInspList.Owner.CustomizeInspector(cinItemProperties);
end;
Result:=ShowModal=mrOK;
if Result then ListItems.Assign(lsvItems.Items);
finally
Free;
end;
end;
constructor TInspectorData.Create;
begin
inherited;
FSubitems:=TStringList.Create;
end;
destructor TInspectorData.Destroy;
begin
FSubitems.Free;
inherited;
end;
procedure TfrmListViewEditor.FormActivate(Sender: TObject);
begin
with FEditor do
if ListItems.Count>0 then
begin
ItemToData(lsvItems.Items[0],FInspectorData);
cinItemProperties.Instance:=TComponent(FInspectorData);
end
else cinItemProperties.Instance:=nil;
end;
procedure TfrmListViewEditor.ItemToData(Item: TListItem; Data: TInspectorData);
begin
Data.Caption:=Item.Caption;
Data.ImageIndex:=Item.ImageIndex;
Data.StateIndex:=Item.StateIndex;
Data.Subitems.Assign(Item.Subitems);
end;
procedure TfrmListViewEditor.DataToItem(Data: TInspectorData; Item: TListItem);
begin
Item.Caption:=Data.Caption;
Item.ImageIndex:=Data.ImageIndex;
Item.StateIndex:=Data.StateIndex;
Item.Subitems.Assign(Data.Subitems);
end;
procedure TfrmListViewEditor.WMGetMinMaxInfo(var Msg: TMessage);
begin
inherited;
with PMinMaxInfo(Msg.LParam)^.ptMinTrackSize do
begin
X:=413;
Y:=200;
end;
end;
procedure TfrmListViewEditor.spbMoveDownClick(Sender: TObject);
var
I: TListItem;
Idx: Integer;
begin
with lsvItems,Items do
if Selected.Index<Pred(Count) then
begin
I:=TListItem.Create(lsvItems.Items);
try
Idx:=Selected.Index;
I.Assign(Selected);
Selected.Free;
Selected:=Insert(Succ(Idx));
Selected.Assign(I);
ItemFocused:=Selected;
finally
I.Free;
end;
end;
end;
procedure TfrmListViewEditor.spbMoveUpClick(Sender: TObject);
var
I: TListItem;
Idx: Integer;
begin
with lsvItems,Items do
if Selected.Index>0 then
begin
I:=TListItem.Create(lsvItems.Items);
try
Idx:=Selected.Index;
I.Assign(Selected);
Selected.Free;
Selected:=Insert(Pred(Idx));
Selected.Assign(I);
ItemFocused:=Selected;
finally
I.Free;
end;
end;
end;
procedure TfrmListViewEditor.btnDeleteClick(Sender: TObject);
var
I: Integer;
begin
with lsvItems do
if Assigned(Selected) then
begin
I:=Selected.Index;
Selected.Free;
if Items.Count>0 then
begin
if I>Pred(Items.Count) then I:=Pred(Items.Count);
Selected:=Items[I];
ItemFocused:=Selected;
end
else cinItemProperties.Instance:=nil;
end;
end;
procedure TfrmListViewEditor.btnAddClick(Sender: TObject);
begin
with lsvItems do
begin
ItemFocused:=Items.Add;
ItemFocused.Caption:='NewItem';
Selected:=ItemFocused;
end;
end;
procedure TfrmListViewEditor.lsvItemsChange(Sender: TObject;
Item: TListItem; Change: TItemChange);
begin
if not (csDestroying in ComponentState) then
if (Change=ctState) and not (lsvItems.Dragging) then
begin
ItemToData(Item,FInspectorData);
cinItemProperties.Instance:=TComponent(FInspectorData);
end;
end;
procedure TfrmListViewEditor.lsvItemsDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
I: TListItem;
begin
with lsvItems,Items do
if Assigned(DragItem) and (DragItem<>Selected) then
begin
I:=TListItem.Create(lsvItems.Items);
try
I.Assign(Selected);
Selected.Free;
Selected:=Insert(DragItem.Index);
Selected.Assign(I);
ItemFocused:=Selected;
finally
I.Free;
end;
end;
end;
procedure TfrmListViewEditor.lsvItemsDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:=Sender=Source;
if Accept then DragItem:=lsvItems.GetItemAt(X,Y);
end;
procedure TfrmListViewEditor.cinItemPropertiesExit(Sender: TObject);
begin
cinItemProperties.ApplyChanges;
end;
procedure TfrmListViewEditor.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if ModalResult=mrOk then cinItemProperties.ApplyChanges;
end;
procedure TfrmListViewEditor.FormCreate(Sender: TObject);
begin
FInspectorData:=TInspectorData.Create;
if GetACP=936 then
self.Caption:='控件集编辑器'
else if GetACP=950 then
self.Caption:='北ン栋絪胯竟'
else self.Caption:='List View Editor';
end;
procedure TfrmListViewEditor.FormDestroy(Sender: TObject);
begin
FInspectorData.Free;
end;
procedure TfrmListViewEditor.cinItemPropertiesChange(Sender: TObject;
TheIndex: Integer);
begin
with cinItemProperties do
DataToItem(FInspectorData,lsvItems.Selected);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -