Вниз
Скачать: CL | DM;

Поиск в TList   Найти похожие ветки 

 
Elast   (2004-12-01 17:56) [0]

Есть классы для 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? Заранее спасибо.


 
jack128 ©   (2004-12-01 18:26) [1]

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);


 
Elast   (2004-12-01 18:31) [2]

Спасибо. Буду пробовать.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.032 c
9-1092799626
Andry
2004-08-18 07:27
2004.12.19
Как не проходить сквозь преметы???


4-1099124045
Arnold
2004-10-30 12:14
2004.12.19
Как програмно изменить региональные стандарты??


1-1102323409
_sulent
2004-12-06 11:56
2004.12.19
Про описания


8-1093579072
race1
2004-08-27 07:57
2004.12.19
играть два файла без задержки


14-1101883869
GanibalLector
2004-12-01 09:51
2004.12.19
Расчет потребности в оборудовании




   Наверх