Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: 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 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.047 c
15-1341775548
Invoker
2012-07-08 23:25
2013.03.22
Как сделать LockUpdate ListBox у?


2-1345929626
Wadimka
2012-08-26 01:20
2013.03.22
Подскажите компонент для delphi для работы с SSH


2-1346143882
FIL-23
2012-08-28 12:51
2013.03.22
ehlib


2-1345708838
Molchanov
2012-08-23 12:00
2013.03.22
Высокоскоростной обмен с аппаратурой


15-1354038522
Дмитрий С
2012-11-27 21:48
2013.03.22
Менеджер паролей.