admin

[系统应用] Delphi中如何编辑listview的subitem编辑列

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Edit1: TEdit;
    procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit1Exit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    Item: TListItem;
    Index: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  I, Temp: Integer;
  Arr: Array of Integer;

  Rect: TRect;
begin
  with ListView1 do
    begin
      Item := GetItemAt(X, Y);
      if Item = nil then
        begin
          Edit1.Hide;
          Index := -1;
          exit;
        end;

      SetLength(Arr, Columns.Count);
      for I := Low(Arr) to High(Arr) do
        Arr[I] := Columns[I].Width;

      Temp := 0;
      Index := -1;
      for I := Low(Arr) to High(Arr) do
        begin
          if (X > Temp + 1) and (X < Temp + Arr[I]) then
            begin
              Index := I;
              break;
            end;
          Temp := Temp + Arr[I];
        end;

      if Index < 0 then
        begin
          Edit1.Hide;
          exit;
        end;

      Rect := Item.DisplayRect(TDisplayCode(0));

      Edit1.Font.Assign(Font);
      if Index = 0 then
        Edit1.Text := Item.Caption
      else
        Edit1.Text := Item.SubItems[Index - 1];
      Edit1.SetBounds(Temp + Left + 2, Rect.Top + Top + 2, Arr[I] + 1, Rect.Bottom - Rect.Top);
      if not Edit1.Showing then
        Edit1.Show;
    end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  Edit1.Hide;
  Index := -1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with ListView1 do begin
    ReadOnly := True;
    HideSelection := False;
    RowSelect := True;
  end;

  Edit1.Hide;
  Index := -1;
  Item := nil;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if (Item = nil) or (Index = -1 ) then exit;
  if Index = 0 then
    Item.Caption := Edit1.Text
  else
    Item.SubItems[Index - 1] := Edit1.Text
end;

end.

#1楼
发帖时间:4月前   |   查看数:0   |   回复数:0
游客组