Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создать редактируемый TListBox

Delphi , Компоненты и Классы , Списки

Создать редактируемый TListBox

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{NOTE : This will also work with an OwnerDraw ListBox 
But be sure you "pad" the Left Property of the Edit so 
Any icons etc, do not get covered up by the TEdit. 
And also be aware that there will be a bit of "flashing" 
if you do use an OwnerDraw ListBox}

 {This is in a Popup menu.}
 procedure TForm1.Change1Click(Sender: TObject);
 var
   I9: Integer;
   ColInt: Integer;
   LRect: TRect;
 begin
   LRect := ListBox1.ItemRect(ListBox1.ItemIndex);
   {Set the size of the TEdit}
   Edit1.Top := LRect.Top + 1;
   Edit1.Left := LRect.Left + 1;
   Edit1.Width := ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[ListBox1.ItemIndex]) + 6;
   Edit1.Height := (LRect.Bottom - LRect.Top) + 1;

   Edit1.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];
   ListBox1.Selected[ListBox1.ItemIndex] := False;
   Edit1.Visible := True;
   Edit1.SelectAll;
   Edit1.SetFocus;
 end;

 procedure TForm1.ListBox1Click(Sender: TObject);
 begin
   Edit1.Visible := False;
 end;

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

Перевод контента на русский язык:

Это программное обеспечение Delphi, созданное для создания редактируемого списка (TListBox) с связанным текстовым полем ввода (TEdit). Когда пользователь кликает по элементу в списке, соответствующий текст отображается в текстовом поле. Пользователь может затем изменить текст и нажать Enter для сохранения изменений.

Разбивка кода:

  1. Процедура Change1Click:
    • Она настраивает позицию и размер текстового поля на основе выбранного элемента в списке.
    • Она устанавливает текст текстового поля в текст выбранного элемента.
    • Она отключает выбор элемента в списке.
    • Она отображает текстовое поле и фокусирует его.
  2. Процедура ListBox1Click:
    • Она скрывает текстовое поле, когда пользователь кликает вне него или по другому элементу в списке.
  3. Процедура Edit1KeyPress:
    • Она проверяет, является ли нажатой клавишей Enter (#13).
    • Если да, она удаляет выбранный элемент из списка и вставляет новый элемент с измененным текстом.
    • Затем она скрывает текстовое поле.

Обратите внимание, что это код предполагает, что список имеет владельца (то есть родительскую форму или контроль). Также обратите внимание на потенциальные проблемы, упомянутые в комментарии, связанные с мерцанием при использовании OwnerDraw ListBox.

Альтернативное решение:

Вместо использования отдельного текстового поля для редактирования можно использовать встроенную возможность TListBox отображать текстовый редактор. Это можно сделать, установив свойство ItemHeight списка в значение больше 0 и реализуя событие OwnerDraw.

Пример:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TItemState);
begin
   // Отображение текста элемента как обычно
  ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items.Strings[Index]);
end;

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ItemIndex: Integer;
begin
   // Получение индекса элемента под мышью
  ItemIndex := ListBox1.ItemAtPos(X, Y);

   // Отображение текстового редактора для редактирования
  Edit1.Visible := True;
  Edit1.Left := ListBox1.ClientWidth - Edit1.Width;
  Edit1.Top := Index * (Edit1.Height + 1);
  Edit1.Text := ListBox1.Items.Strings[ItemIndex];
  Edit1.SelectAll;

   // Скрытие элемента списка
  ListBox1.Items[ItemIndex].Visible := False;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   // Сохранение измененного текста и скрытие редактора
  if Key = #13 then
  begin
    ListBox1.Items[Edit1.Top / (Edit1.Height + 1)] := Edit1.Text;
    Edit1.Visible := False;
  end;
end;

Эта APPROACH avoids using a separate TEdit control and simplifies the code. However, it may not be suitable for all scenarios, especially if you need more advanced editing features.

В статье описывается создание редактируемого TListBox с помощью TEdit в Delphi, при котором пользователь может изменять текст элементов списка нажав на них и вводить новое значение.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 18:34:08/0.0039730072021484/0