Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Чем лучше пользоваться для хранения объектов


Автор: Delphist 17.10.2008, 14:50
Чем лучше пользоваться для хранения списка объектов TList'ом или динамическим массивов, ну т.е.:
Код

var
 m: array of TMyObject;


Предпалагается хранения свыше 1000 объектов. Например где будет выше скорость поиска элемента?

Автор: Rennigth 17.10.2008, 16:10
Delphist, 
Есть такая штука как TObjectList  smile

Добавлено через 1 минуту и 6 секунд
Цитата(Delphist @  17.10.2008,  14:50 Найти цитируемый пост)
динамическим массивов

массив банально не удобен, хоть и памяти занимать будет меньше, но с современными машинами это не актуально.

Автор: Delphist 17.10.2008, 16:13
Цитата(Rennigth @  17.10.2008,  17:10 Найти цитируемый пост)
массив банально не удобен, хоть и памяти занимать будет меньше, но с современными машинами это не актуально. 

А в скорости

Автор: Bose 17.10.2008, 16:21
внутри TList-a тот же array

Автор: Rennigth 17.10.2008, 16:37
Цитата(Delphist @  17.10.2008,  16:13 Найти цитируемый пост)
А в скорости 

Цитата(Delphist @  17.10.2008,  14:50 Найти цитируемый пост)
Например где будет выше скорость поиска элемента?

НУ в TList-е уже давно написан алгоритм поика эл-тов, а для массива тебе придеться писать самому, как напишешь так и будет, но имхо врятли придумаешь что-то новое что будет быстрее устоявшихся весчей smile Юзай TList или TObjectList и не парься.

Автор: Delphist 18.10.2008, 23:41
Цитата(Rennigth @  17.10.2008,  17:37 Найти цитируемый пост)
Юзай TList или TObjectList и не парься


Выявил один большой недостаток при хранение списка объектов в TObjectList или TObject, а именно при отладке. Т.е. когда я поднесу курсор мыши в режиме отладки к объекту TObjectList, то в результате мне неудастся увидеть список всех моих объектов и их свойств, зато использование дин. массива лишает меня этого недостатка, особенно это актуально для BDS2006 и выше т.к. он красиво формирует список объектов в Hint'e.
Поэтому даже и не знаю стоит ли использовать TObjectList?

Автор: Delphist 20.10.2008, 11:11
???

Автор: MetalFan 20.10.2008, 14:46
напиши наследника от TObjectList, где элементами будут объекты твоего класса...

Автор: Christoph 20.10.2008, 16:09
Как по мне...ничего лучше чем TObjectList нету. Я когда то пробывал так:
А массив не актуально уже...и работать может не будет smile

Автор: Delphist 20.10.2008, 16:45
Цитата(MetalFan @  20.10.2008,  15:46 Найти цитируемый пост)
напиши наследника от TObjectList, где элементами будут объекты твоего класса...

В смысле написать метод типа GetItemsDbg:

Код

type
  TDynArrOfMyObj = array of TMyObject;
  TMyObjList = class(TObjectList)
   ...
   public
     function GetItemsDbg: TDynArrOfMyObj;
   ...
  end

function TMyObjList.GetItemsDbg: TDynArrOfMyObj;
var
  i: integer;
begin
  
  SetLength(Result, Count);
  for i := 0 to Count - 1 do
    Result[i] := List^[i];
end;


Автор: MetalFan 20.10.2008, 16:56
Delphist, не, эт чтото извращенно получилось...

Автор: Delphist 20.10.2008, 16:58
Цитата(MetalFan @  20.10.2008,  17:56 Найти цитируемый пост)
Delphist, не, эт чтото извращенно получилось... 

а ты как имел ввиду?

Автор: Bose 20.10.2008, 17:31
Код

 TMyObjList = class(TObjectList)
   ...
   public
     function GetObject(aIndex:integer): TDynArrOfMyObj; reintroduce;
  ...



function TMyObjList.GetObject(aIndex:integer): TDynArrOfMyObj; 
begin
  result := (inherited GetObject(aIndex)) as TDynArrOfMyObj;
end;


Автор: Delphist 20.10.2008, 20:44
Цитата(Bose @  20.10.2008,  18:31 Найти цитируемый пост)
function GetObject(aIndex:integer): TDynArrOfMyObj; reintroduce;

Интересно, где ты нашел метод GetObject в TObjectList у меня твой код не компилиться пишется Undeclared identifier GetObject

Автор: Bose 20.10.2008, 23:47
Цитата(Delphist @  20.10.2008,  20:44 Найти цитируемый пост)
Интересно, где ты нашел метод GetObject в TObjectList у меня твой код не компилиться пишется Undeclared identifier GetObject

А головой подумать? 

Замени GetObject на GetItem

Автор: Delphist 21.10.2008, 09:16
Цитата(Bose @  21.10.2008,  00:47 Найти цитируемый пост)
Замени GetObject на GetItem 

Я уже догадался, но as TDynArrOfMyObj вызывает ошибку при компиляции и это понятно

Автор: Christoph 21.10.2008, 10:07
Код

result := ((inherited GetObject(aIndex)) as TDynArrOfMyObj);
end;

Автор: Delphist 21.10.2008, 10:54
Цитата(Christoph @  21.10.2008,  11:07 Найти цитируемый пост)

result := ((inherited GetObject(aIndex)) as TDynArrOfMyObj);
end;

что-то я не понял к чему ты привел этот код

Автор: Delphist 22.10.2008, 13:17
???

Автор: Christoph 23.10.2008, 18:06
Думал то что скобки не хватает ругается....

Автор: MetalFan 23.10.2008, 20:03
в общем если тебе необходимо удобство при отладке в виде просмотра содержащихся данных, то конечно пользуй массив и забудь про возможности и удобства списков.

Автор: pseud 24.10.2008, 15:39
Код

 TMyObjList = class(TObjectList)
   ...
   public
     function GetItem(AIndex: Integer): TMyObj; reintroduce;
  ...



function TMyObjList.GetItem(AIndex: Integer): TMyObj; 
begin
  Result := TMyObj(inherited GetItem(AIndex));
end;

Автор: Delphist 24.10.2008, 16:27
pseud, данный код не катит т.к. Items[i] все равно будет возвращать тип TObject

Автор: pseud 24.10.2008, 17:02
Код

property Items[Index: Integer]: TEdit read GetItems write SetItems; default;  //чтение элементов списка будет происходить через метод GetItems, а запись - через SetItems


На форуме есть хорошая статьейка на эту тему: http://forum.vingrad.ru/forum/topic-97983.html

Добавлено через 1 минуту и 57 секунд
найди:
Цитата

Пример 1. Работа с динамически созданными объектами (а именно с TEdit).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)