Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.03;
Скачать: CL | DM;

Вниз

Наследник TList   Найти похожие ветки 

 
J.S.   (2009-03-24 12:45) [0]

Пишу класс-список который будет хранить нужный мне 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;


 
Palladin ©   (2009-03-24 12:48) [1]


> Подскажите, что я делаю не так?

не так понимаешь, что такое TList.IndexOf
и как следствие, возможны проблемы с понимаем принципов работы с дин. памятью и что такое указатель


 
Сергей М. ©   (2009-03-24 12:54) [2]


> Result := IndexOf(P) <> -1;


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

Мало того, в методе Exists у тебя утечка памяти - память под временную структуру TCondTypeItem безусловно выделяется при GetMem, но освобождается только при возникновении исключения


 
J.S.   (2009-03-24 13:00) [3]

ошибку с утечкой памяти исправил. Спасибо. А как написать алгоритм проверки существования в списке записи (Кстати метод AddItem добавляет вроде как надо).


 
Palladin ©   (2009-03-24 13:04) [4]


> А как написать алгоритм проверки существования в списке
> записи

"А ты вообще учился?" (С) Жмурки


 
Сергей М. ©   (2009-03-24 13:06) [5]

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


 
Сергей М. ©   (2009-03-24 13:06) [6]


> Item: TCondTypeItem;


Это лишнее


 
J.S.   (2009-03-24 13:14) [7]


> Сергей М


Большое спасибо



Страницы: 1 вся ветка

Текущий архив: 2009.05.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
2-1237979966
Alexei
2009-03-25 14:19
2009.05.03
Проблема запуска с помощью ShellExecute


2-1237367852
igorntk
2009-03-18 12:17
2009.05.03
как осуществить выборку с помощью SQL?


15-1235821749
TInt
2009-02-28 14:49
2009.05.03
Чем отличается OnClose от OnDestroy ?


2-1237898311
Андрей (начинающий)
2009-03-24 15:38
2009.05.03
Отображение ListView с большим количеством строк


2-1237352448
DmitriyR
2009-03-18 08:00
2009.05.03
Регулярные выражения