![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследник TList
J.S. © (2009-03-24 12:45:00)Пишу класс-список который будет хранить нужный мне 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;
J.S. (2009-03-24 13:14:00) [1]
> Сергей М
Большое спасибо
Сергей М. (2009-03-24 13:06:00) [2]
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:00) [3]
> Item: TCondTypeItem;
Это лишнее
Palladin (2009-03-24 13:04:00) [4]
> А как написать алгоритм проверки существования в списке
> записи
"А ты вообще учился?" (С) Жмурки
J.S. (2009-03-24 13:00:00) [5]ошибку с утечкой памяти исправил. Спасибо. А как написать алгоритм проверки существования в списке записи (Кстати метод AddItem добавляет вроде как надо).
Сергей М. (2009-03-24 12:54:00) [6]
> Result := IndexOf(P) <> -1;
Результат всегда будет False, потому что в списке нет указателя со значением, равным P.
Мало того, в методе Exists у тебя утечка памяти - память под временную структуру TCondTypeItem безусловно выделяется при GetMem, но освобождается только при возникновении исключения
Palladin (2009-03-24 12:48:00) [7]
> Подскажите, что я делаю не так?
не так понимаешь, что такое TList.IndexOf
и как следствие, возможны проблемы с понимаем принципов работы с дин. памятью и что такое указатель