Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследник TList 
V
    Опции темы
NieL
Дата 24.3.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: 1
Всего: 1



Пишу класс-список который будет хранить нужный мне record. 
Неполучается написать функцию которая проверяет существование определенной записи в списке (в коде называется Exists). Подскажите, что я делаю не так?

Вот код:

Код

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 { TCondTypeItem }

 TCondTypeItem = packed record
   TypeId: Integer;
   CondId: Integer;
 end;
 PCondTypeItem= ^TCondTypeItem;

 { TCondTypeList }

 TCondTypeList = class(TList)
 public
   procedure AddItem(aTypeId, aCondId: Integer);
   function Exists(aTypeId, aCondId: Integer): Boolean;
 end;

var
 Form1: TForm1;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 C: TCondTypeList;
begin
 C := TCondTypeList.Create;
 try
   C.AddItem(1, 1);
   C.AddItem(1, 2);
   C.AddItem(2, 1);
   C.AddItem(2, 2);

   if C.Exists(2, 2) then
     ShowMessage('Exists in list')
   else
     ShowMessage('No exists in list');
 finally
   C.Free;
 end;
end;

procedure TCondTypeList.AddItem(aTypeId, aCondId: Integer);
var
 P: PCondTypeItem;
begin
 GetMem(P, SizeOf(TCondTypeItem));
 try
   with P^ do
   begin
     TypeId := aTypeId;
     CondId := aCondId;
   end;
   inherited Add(P);
 except
   FreeMem(P);
   raise;
 end;
end;

function TCondTypeList.Exists(aTypeId, aCondId: Integer): Boolean;
var
 P: PCondTypeItem;
begin
 GetMem(P, SizeOf(TCondTypeItem));
 try
   with P^ do
   begin
     TypeId := aTypeId;
     CondId := aCondId;
   end;
   Result := IndexOf(P) <> -1;
 except
   FreeMem(P);
   raise;
 end;

end;

PM MAIL   Вверх
pseud
Дата 24.3.2009, 13:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



а если так:
Код

function TCondTypeList.Exists(aTypeId, aCondId: Integer): Boolean;
var
  P: PCondTypeItem;
  i: Integer;
begin
  Result := False;
  for i := 0 to Count - 1 do
  begin
    P := PCondTypeItem(Items[i]);
    if (P.TypeId = aTypeId) and (P.CondId = aCondId) then
    begin
      Result := True;
      Exit;
    end;
  end;
end;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Beltar
Дата 24.3.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

IndexOf(P)


Как я понимаю, для TList эта ф-ия сравнивает значения указателей, а не данных на которые они указывают.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
kami
Дата 24.3.2009, 16:31 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Немаловажное замечание:
чтобы избежать утечек памяти, в TCondTypeList нехватает 1 метода:

Код

protected
  procedure Notify(Ptr: Pointer; Action: TListNotification); override;


Реализация метода:
Код

procedure TCondTypeList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action=lnDeleted then
    FreeMem(Ptr);
end;


И - Beltar прав - сравниваются именно указатели (см. исходный код TList.IndexOf). Откуда TList может знать, что хранится по указателю? У меня, например, в нем могут "вариться" и объекты, и записи (в т.ч. с string типами)...
Посему тут правильный вариант pseud.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.