Форум: "Начинающим";
Текущий архив: 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