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

Добавление записей в TStrings, TTreeView или TListView

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

Добавление записей в TStrings, TTreeView или TListView

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

{ 
  Bei der Klasse TStrings und den Komponenten TTreeview/TListview gibt es die 
  Moglichkeit, neben dem einfachen einfugen eines Strings auch Objekte mitanzufugen. 
  Da eine Klasse TObject erwartet wird, muss man einen kleinen Umweg programmieren. 
}

 { 
  The Classes TStrings and the components TTreeview/TListview allow you to add an 
  additional Object to a string. 
  Since a TObject is expected, you need to make a little detour to achive this. 
}


 type
   TMyRecord = record
     id: Integer;
     Name: string;
     {...}
   end;
   PMyRecord = ^TMyRecord;

   {...}


   { In this example I use a Listview component }

 procedure Form1.Form1Create(Sender: TObject)
   var
   i: Integer;
   pRec: PMyRecord;
 begin
   for i := 0 to 10 do
   begin
     new(pRec);
     pRec.id := i;
     pRec.Name := 'Entry' + IntToStr(i);
     {...}
     ListView1.AddItem('Entry' + IntToStr(i), Pointer(pRec));
   end;
 end;

 { To retrieve the stored records just use this: }

 procedure Form1.ListView1Click(Sender: TObject);
 var
   i: Integer;
   xRec: TMyRec;
 begin
   for i := 0 to Listview1.Count - 1 do
     if ListView1.Selected[i] then
     begin
       xRec := PMyRecord(ListView1.Items.Objects[i])^;
       ShowMessage(Format('Record #%d Name: %s', [xRec.id, xRec.Name]));
     end;
 end;

 { finally do not forget to free assigned memory }

 procedure Form1.FormClose(Sender: TObject);
 var
   i: Integer;
 begin
   for i := 0 to ListView1.Count - 1 do
     if ListView1.Items.Objects[i] <> nil then
       Dispose(ListView1.Items.Objects[i]);
 end;

Привет! Я перевёл текст на русский язык:

Это код Delphi, демонстрирующий, как добавить записи в компонент TStrings, TTreeView или TListView, хранящие дополнительную информацию в объекте.

Код использует тип записи TMyRecord с двумя полями: id и Name. Тип указателя PMyRecord используется для создания нового экземпляра этой записи и хранения его в элементе списка.

При создании элементов списка код проходит 11 итераций, создает новый экземпляр записи для каждой итерации, устанавливает поля (id и Name) и добавляет ее в список с помощью метода AddItem с указателем на запись как вторым параметром. Это позволяет хранить запись в элементе списка.

Чтобы получить хранящиеся записи, код определяет обработчик события клика для списка. Когда выбирается элемент, код получает соответствующую запись из объекта, хранящегося в элементе списка, и отображает сообщение об ошибке с полями (id и Name).

Наконец, когда форма закрывается, код освобождает память, выделенную для каждой записи с помощью метода Dispose.

Вот разбивка кода:

  • Определение типа TMyRecord объявляет пользовательский тип записи с двумя полями: id (целое число) и Name (строка).
  • Тип указателя PMyRecord используется для создания нового экземпляра этой записи.
  • В процедуре создания формы код проходит 11 итераций, создает новый экземпляр записи для каждой итерации. Он устанавливает поле id в текущую итерацию и поле Name в строку "Entry" с добавлением номера итерации.
  • Код затем добавляет каждую запись в список с помощью метода AddItem с указателем на запись как вторым параметром. Это позволяет хранить запись в элементе списка.
  • В обработчике события клика для списка код получает выбранный элемент и проверяет, не является ли он nil. Если это не nil, код кастует объект, хранящийся в элементе списка, в указатель PMyRecord, десериализует его, чтобы получить оригинальную запись, и отображает сообщение об ошибке с полями (id и Name).
  • Наконец, в обработчике события закрытия формы код освобождает память, выделенную для каждой записи с помощью метода Dispose.

Вот улучшенная версия кода:

type
  TMyRecord = record
    id: Integer;
    Name: string;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  pRec: PMyRecord;
begin
  for i := 0 to 10 do
  begin
    New(pRec);
    pRec.id := i;
    pRec.Name := 'Entry' + IntToStr(i);
    ListView1.Items.AddObject('Entry' + IntToStr(i), TObject(pRec));
  end;
end;

procedure TForm1.ListView1Click(Sender: TObject);
var
  i: Integer;
  xRec: TMyRecord;
begin
  for i := 0 to ListView1.Count - 1 do
    if ListView1.Selected[i] then
      with PMyRecord(ListView1.Items.Objects[i])^ do
        ShowMessage(Format('Record # %d Name: %s', [id, Name]));
end;

procedure TForm1.FormClose(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListView1.Count - 1 do
    if ListView1.Items.Objects[i] <> nil then
      Dispose(PMyRecord(ListView1.Items.Objects[i]));
end;

В этой улучшенной версии код использует метод AddObject вместо AddItem и хранит запись в поле TObject. Это упрощает получение записи позднее и уменьшает необходимость явного кастинга.

Кроме того, я использовал оператор with в обработчике события клика для списка, чтобы упростить код и уменьшить количество строк.

Добавление записей в TStrings, TTreeView или TListView: описано пример использования компонентов для добавления объектов типа TObject и их последующего извлечения.


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

Получайте свежие новости и обновления по 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 17:42:49/0.0037810802459717/0