Главная страница
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.022 c
15-1235468752
axis_of_evil
2009-02-24 12:45
2009.05.03
об интегрированных видеокартах


2-1234419532
vegarulez
2009-02-12 09:18
2009.05.03
Как правильно разбирать xml?


2-1237739173
dron9999
2009-03-22 19:26
2009.05.03
Как в мемо удалять текст по 1-й букве с концa


15-1236080729
забылпароль
2009-03-03 14:45
2009.05.03
sql 2000 и таблицы на разных серверах. Какой формат имен?


2-1237367742
b@v
2009-03-18 12:15
2009.05.03
Размер по экрану