Главная страница
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.066 c
15-1345572518
Dennis I. Komarov
2012-08-21 22:08
2013.03.22
БИК update online


2-1333473036
Usver
2012-04-03 21:10
2013.03.22
Перевод с C++ на Delphi


2-1334672711
новичок2012
2012-04-17 18:25
2013.03.22
Ссылка на контролы класса TCombobox и TEdit


2-1330273177
Михаил
2012-02-26 20:19
2013.03.22
Почему изменяются поля в глобальной переменной


15-1353709407
Kerk
2012-11-24 02:23
2013.03.22
Про Москву