Можно ли сохранить запись в свойстве Item.Object объекта ListBox? - PullRequest
4 голосов
/ 16 ноября 2010

У меня есть запись, которую я хотел бы сохранить для каждого элемента, который добавляется в список.Должен ли я сделать запись классом вместо этого для достижения этой цели?

TServerRec = record
    ID: integer;
    DisplayName: string;
    Address: string;
    Port: integer;
end;

procedure TMainForm.PopuplateServers;
var
  server: TServerRec;
begin
  for server in FServerList do
  begin
    lbServers.AddObject(server.DisplayName, server);
  end;
end;

Ответы [ 3 ]

5 голосов
/ 16 ноября 2010

попробуйте объявить вашу структуру следующим образом

type    
PServerRec = ^TServerRec;
TServerRec = record
    ID: integer;
    DisplayName: string[255];
    Address: string[255];
    Port: integer;
end;

   //now filling your list of objects
    procedure TForm1.Button1Click(Sender: TObject);
    const
      Max=10;
    var
      FServerList : Array [1..Max] of PServerRec;
      server      : PServerRec;
      i           : Integer;
    begin
      for i := 1 to Max do
      begin
        new(server);
        server^.DisplayName:='Server '+IntToStr(i);
        FServerList[i]:=server;
      end;

      for server in FServerList do
      begin
        lbServers.Items.AddObject(server.DisplayName, TObject(server));
      end;
    end;

    //now to retrieve the info
    procedure TForm1.lbServersDblClick(Sender: TObject);
    var
       server      : TServerRec;
    begin
       server:=PServerRec(lbServers.Items.Objects[lbServers.ItemIndex])^;
       ShowMessage(server.DisplayName);
    end;

не забудьте вызвать функцию dispose, чтобы освободить память для каждого выделенного объекта.

5 голосов
/ 16 ноября 2010

Нет, но вы можете сохранить указатель на эту запись с небольшим количеством типов.Но затем вы попадаете в динамическое распределение указателей записи, что может быть немного головной болью.Почему бы не превратить TServerRec в объект?

0 голосов
/ 16 ноября 2010

Был там, сделал это. Я решил похожую проблему, выведя новый класс из класса TListbox, который включал динамический массив записей, которые я хотел сохранить связанными. Вам нужно будет переопределить несколько методов TListbox, чтобы синхронизировать динамический массив с элементами в списке, но у него есть несколько преимуществ. Например, динамический массив записей не должен выделять или освобождать память. Вам просто нужно установить длину массива, равную количеству элементов в вашем списке. (SetLength) Вы получаете доступ не к записям через указатели, а через индекс. Вы можете просто скопировать записи из одного места в другое в списке, чтобы изменить их порядок.
Недостаток? Это большая функциональность, которую необходимо переопределить, и нелегко проверять наличие ошибок в коде, поскольку она должна работать во время выполнения и во время разработки. Также помните, что вы используете записи, а не классы. Если вместо этого вы используете классы, вам все равно нужно освободить каждый элемент в массиве. Но записи намного менее сложны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...