Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в 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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо