همانطور که می دانید لیست باکس فقط آیتمهای موجود و تعریف شده در خودش را نشان می دهد و امکان ویرایش آیتمها نیست. اما اگر شما در برنامه ای بخواهید امکان ویرایش آیتمهای لیست باکس را به کاربر بدهید چکار خواهید کرد؟
برنامه زیر روش انمجام اینکار را به شما نشان می دهد. استفاده از این روش برای همه کامپوننتهای دیگر هم جواب می دهد.
ابتدا یک لیست باکس درون فرم خود قرار دهید و در تعریف فرم خود سورس زیر را اضافه کنید:
type
TForm1 = class(TForm)
...
private
ListEdit : TEdit;
procedure ListEditKeyPress(Sender: TObject; var Key: Char) ;
end;
متغیر اول برای این است که بتوانیم یک editbox را در زمان اجرا ایجاد کنیم و به آیتم انتخاب شده در لیست باکس مقدار دهی کنیم.
روال نام برده شده هم برای این است که بتوانیم کنترل ورود صفحه کلید را برای این برنامه داشته باشیم.
شیء مربوط به ویرایش را باید در زمان ایجاد فرم بسازیم. و والد آ«را به لیست باکس تغییر دهیم. با سورس کد زیر میشه اینکار را انجام داد که باید در بخش مربطو به رویداد ایجاد فرم نوشته بشه.
procedure TForm1.FormCreate(Sender: TObject) ;
begin
ListEdit := TEdit.Create(self) ;
ListEdit.Visible := false;
ListEdit.Ctl3D := false;
ListEdit.BorderStyle := bsNone;
ListEdit.Parent := ListBox1;
ListEdit.Width := ListBox1.ClientWidth;
ListEdit.OnKeyPress := ListEditKeyPress;
end;
حالا باید کاری کنیم که با کلیک روی یک آیتم لیست باکس ، ادیت باکس خودمون را بیاریم و در همان مکان نشان بدیم.
با استفاده از سورس زیر در رویداد onclick لیست باکس میشه اینکار را انجام داد.
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.ListEditKeyPress(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;
در سورس کد بالا بعد زا اینکه کلید Enter زده شد باید مقدار EditBox را در ListBox بگذاریم و مقدار قبلی را حذف کنیم.
و در کنار آنهم باید بعد از اینکه focus از روی listbox برداشته شد editbox را پنهان کنیم که سورس کد زیر اینکار ار انجام میده.
این سروس کد باید در رویداد خروج لیست باکس نوشته بشه.
procedure TForm1.ListBox1Exit(Sender: TObject) ;
begin
ListEdit.Visible := false;
end;