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

Как присвоить обобщенную процедуру   Найти похожие ветки 

← →
VLK32   (2011-01-22 20:43) [0]

Есть описание ссылки на функцию

TSelector<T> = reference to function (const Item:T; const Index:Integer=-1):Boolean;

Есть функция кот. возвращает ссылку на функцию с уже конкретизированным типом:

function GetCurrentSelector:TSelector<TTestRec>;
 var op,e12,e13 : Integer;
     substr     : String;
 begin
  //
  op  := MainForm.ComboBox1.ItemIndex;
  e12 := StrToInt(MainForm.Edit12.Text);
  e13 := StrToInt(MainForm.Edit13.Text);
  substr := MainForm.Edit13.Text;
  if MainForm.RadioButton3.Checked then Exit(
   function (const Item:TTestRec; const Index:Integer=-1):Boolean
    begin
     if op=0 then Result := Item.ID<e12
             else Result := Item.ID>e12;
    end);
  //
  if MainForm.RadioButton4.Checked then Exit(
   function (const Item:TTestRec; const Index:Integer=-1):Boolean
    begin
     Result := (Item.ID mod e13)=0;
    end);
  //
  if MainForm.RadioButton5.Checked then Exit(
   function (const Item:TTestRec; const Index:Integer=-1):Boolean
     begin
      Result := Pos(substr,Item.Data)<>0;
     end);
 end;

И в результате:

procedure TMainForm.BTN_SELECT1Click(Sender:TObject);
 var selector : TSelector<TTestRec>;
 begin

   // такое присваивание работает
   selector := function (const Item:TTestRec; const Index:Integer=-1):Boolean
    begin
     Result := Item.ID>15;
    end;

  // а вот такое присваивание не работает!
  selector := GetCurrentSelector;

  Memo2.Clear;
  A1.SelectAsObject(selector).Perform
   (procedure (var Item:TTestRec; const Index:Integer=-1)
              begin
               Memo2.Lines.Add(Format("%7d: %7d %s",[Index,Item.ID,Item.Data]));
              end);

 end;

Вроде типы совпадают. Почему же компилятор пишет:
Incompatible types: "TSelector<Main.TTestRec>" and "Procedure"?

Я тупой, я не могу понять в чем тут загвоздка. Помогите кто же может а то скоро клаву разобью нафиг...


← →
_Юрий   (2011-01-23 11:58) [1]

Трудно сказать, почему не работает, вероятно это недоработка в компиляторе.
Что можно сделать -
можно вернуть функцию не результатом, а var-параметром


← →
oxffff ©   (2011-01-23 21:48) [2]

IMHO. Баг.


← →
v2 ©   (2011-01-24 00:52) [3]


> // а вот такое присваивание не работает!
>   selector := GetCurrentSelector;
>

selector := GetCurrentSelector();


← →
oxffff ©   (2011-01-24 09:05) [4]


> v2 ©   (24.01.11 00:52) [3]


:)



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

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



Память: 0.46 MB
Время: 0.049 c
2-1339697624
vasa777
2012-06-14 22:13
2013.03.22
ico с несколькими ico


2-1340050503
ankazh
2012-06-19 00:15
2013.03.22
Отмена добавления новой записи


15-1334176202
Юрий
2012-04-12 00:30
2013.03.22
С днем рождения ! 12 апреля 2012 четверг


15-1345581002
Юрий
2012-08-22 00:30
2013.03.22
С днем рождения ! 22 августа 2012 среда


2-1331584288
advise
2012-03-13 00:31
2013.03.22
Посоветуйте плз как разбить AVI файл на кадры?




   Наверх