본문 바로가기

카테고리 없음

[일반/컴포넌트] ListBox에 Edit 올려 항목 편집하기

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure ListBox1KeyPress(Sender: TObject; var Key: Char);
    procedure ListBox1Exit(Sender: TObject);
  private
    { Private declarations }
    ListEdit : TEdit;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to 10 do
    ListBox1.Items.Add('Item: '+IntTostr(i));

  ListEdit := TEdit.Create(Self) ;
  ListEdit.Visible     := False;
  ListEdit.Ctl3D       := False;
  ListEdit.BorderStyle := bsNone;
  ListEdit.Parent      := ListBox1;
  ListEdit.Width       := ListBox1.ClientWidth;
  ListEdit.OnKeyPress  := ListBox1KeyPress;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  ii : integer;
  lRect: TRect;
begin
  ii := ListBox1.ItemIndex;
  if ii = -1 then exit;

  lRect := ListBox1.ItemRect(ii) ;
  ListEdit.Top := lRect.Top + 1;
  ListEdit.Left := lRect.Left + 1;
  ListEdit.Height := (lRect.Bottom - lRect.Top) + 1;

  ListEdit.Text := ListBox1.Items.Strings[ii];
  ListBox1.Selected[ii] := False;

  ListEdit.Visible := True;
  ListEdit.SelectAll;
  ListEdit.SetFocus;
end;

procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
var
  ii: Integer;
begin
  if Key = #13 then
  begin
    ii := ListBox1.ItemIndex;
    ListBox1.Items.Delete(ii) ;
    ListBox1.Items.Insert(ii, ListEdit.Text) ;
    ListEdit.Visible := False;
    Key := #0;
  end;
end;

procedure TForm1.ListBox1Exit(Sender: TObject);
begin
  ListEdit.Visible := false;
end;

end.