Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];

Вниз

Наследник 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
4-1208939351
Дмитрий С
2008-04-23 12:29
2009.05.03
Как получить Handle?


2-1237207108
Дмитрий
2009-03-16 15:38
2009.05.03
CheckListBox с Columns = 2 без Horizontal Scroll


15-1235938120
@!!ex
2009-03-01 23:08
2009.05.03
Особенности продажи софта на запад.


2-1237441995
ариса
2009-03-19 08:53
2009.05.03
письмо


2-1237442197
vat
2009-03-19 08:56
2009.05.03
KeyPress





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский