⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listview.pas

📁 类似Delphi Ide的对象查看器 可以在RUNTIME时使用
💻 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 + -