![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в TList [D6, Win95/98]
Elast © (2004-12-01 17:56:00)Есть классы для Item и для хранения Item:
TMyItem = class
fId : integer;
fName : string;
constructor Create( aId : integer; aName : string);
end;
TMyList = class(TList)
private
fFindProc : TMyFindProc;
procedure AddItem(Item: TMyItem);
public
property FindProc : TMyFindProc read fFindProc write fFindProc;
constructor Create;
destructor Destroy; override;
end;
Я хочу построить поиск перебором в TMyList по одному из полей TMyItem, например Name.
TMyFindProc = function (aItem: variant): Pointer;
BSearch : TMyFindProc;
function BSearch(aItem: variant): Pointer;
var i: Integer;
P: TMyItem;
begin
Result := nil;
with MyList do begin
for i:=0 to Count-1 do begin
P := TMyItem(Items[i]);
If (P.fName = aItem) then begin
Result := P;
exit;
end;
end;
end;
end;
TMyItem может наследоваться поэтому поле поиска заранее неизвестно. В BSearch есть ошибки. Возможно ли это сделать. Гда располагать BSearch? Заранее спасибо.
Elast (2004-12-01 18:31:00) [1]Спасибо. Буду пробовать.
jack128 (2004-12-01 18:26:00) [2]TFindedProc = function ( AItem: TMyItem): boolean of object;
function TMyList.BSearch(FindedProc: TFindedProc): Pointer;
var i: Integer;
P: TMyItem;
begin
Result := nil;
with Self do begin
for i:=0 to Count-1 do begin
P := TMyItem(Items[i]);
If FindedProc(p) then begin
Result := P;
exit;
end;
end;
end;
end;
Теперь когда те нужен поиск по имени пишешь
function TSameObj.FindByName(AItem: TMyItem): boolean;
begin
Result := AItem.Name = FNeededName; // FNeededName - тот имя которое ты ищешь.
end;
Item := MyList.BSearch(FindByName);
нужен поиск по id
function TSameObj.FindById(AItem: TMyItem): boolean;
begin
Result := AItem.Id = FNeededId;
end;
Item := MyList.BSearch(FindById);