Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 01:19   #1
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию Список табличных данных

Доброго времени суток.

Мне нужно в программе хранить что-то типа табличных данных (строковых). данных очень много.

Идея пришла такая.

Код:
//item
type Tdataitem = class
   a,b,c:string;
end;

//items
type Tdataitems = class(TList)
  procedure add(s:string);
  procedure Tdataitems.additem(path:string);
  destructor Destroy; override;
end;

destructor Tdataitems.Destroy;
var i : integer;
tmpItem : Tdataitem;
begin
  for i := 0 to Count-1 do
  begin
    tmpItem := Tdataitem(items[i]);
    freeandnil(tmpitem);
  end;      
  inherited;
end;

procedure Tdataitems.additem(path:string);
var
  tmpItem : Tdataitem ;
begin
    tmpItem := Tdataitem.Create;
    tmpitem.a:='some1';
    tmpitem.b:='some2';
    tmpitem.c:='some3';
    Add(tmpItem);
end;
И вот в Tdataitems храним каждый item. Насколько корректно такое хранение данных? Почему без inherited идет утечка?

И как реализовать правильнее все это? Везде, где искал очень мало инфы по этому поводу. Думаю что надо наверно список структур.

Заранее благодарен кто чем поможет.

Последний раз редактировалось Anfall; 24.08.2011 в 01:25.
Anfall вне форума Ответить с цитированием
Старый 24.08.2011, 01:24   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что inherited это вызов унаследованого деструктора.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2011, 01:26   #3
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
потому что inherited это вызов унаследованого деструктора.
Так, уже яснее. А вообще в принципе, такой код, как у меня допустим? Я правильно делаю? Утечек нет, проверял. Но все равно, толком только начал понимать как работает Tlist.
Anfall вне форума Ответить с цитированием
Старый 24.08.2011, 07:20   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

А не логичнее написать нечто вроде Tlist в котором каждый Item суть Tstrings ?
Код:
Ttable = class(tlist)
protected
  function Get(Index: Integer): tstrings;
  procedure Put(Index: Integer; Item: tstrings);
public
function add (item : tstrings): integer;
property items [index:integer]: TStrings read get write Put;
end;

{ Ttable }
function Ttable.add(item: tstrings): integer;
begin
Result := inherited add(item);
end;
function Ttable.Get(Index: Integer): tstrings;
begin
Result := TStrings(inherited Get(index)) ;
end;
procedure Ttable.Put(Index: Integer; Item: tstrings);
begin
inherited put(Index,item);
end;

{testing}
procedure TForm_Main.Button1Click(Sender: TObject);
var tbl : Ttable;
i : Byte;
begin
tbl := Ttable.Create;
for i := 0 to 2 do begin
  tbl.add(stringgrid_In.Cols[i]);
  StringGrid_Out.Rows[i] := tbl[i]; //переворачиваем табличку из грида на 90 градусов
  end;
tbl.free;
end;
Ещё в объявление добавить прочие нужные функции из Tlist'a, а в реализации обернуть pointer'ы в Tsrtings. Ну и предусмотреть освобождение Item'ов если Ваш Ttable будет единственным их владельцем.

Последний раз редактировалось phomm; 24.08.2011 в 07:22.
phomm вне форума Ответить с цитированием
Старый 24.08.2011, 11:37   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А не логичнее написать нечто вроде Tlist в котором каждый Item суть Tstrings ?
ну тогда уж TObjectList
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2011, 12:13   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
данных очень много
Возможно разумней было бы отказаться от огорода с самописными классами в пользу готовых наследников TDataSet - TClientDataSet или TADODataSet
mss вне форума Ответить с цитированием
Старый 24.08.2011, 23:29   #7
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Спасибо всем за ответы.
Anfall вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных + двунаправленный список. qwertytol Помощь студентам 1 06.12.2009 14:46
Способы раскрашивания ячеек в табличных формах x8i Microsoft Office Access 0 13.05.2009 15:44
Создать Генератор табличных чисел. 13Legion Паскаль, Turbo Pascal, PascalABC.NET 1 03.05.2009 15:06
Народ как аписать генератор табличных чисел 13Legion Паскаль, Turbo Pascal, PascalABC.NET 16 03.05.2009 01:01
Диаграмма на основе полученных табличных данных Dark_Maks Общие вопросы .NET 0 07.05.2008 03:25