Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.062 c
15-1337000174
Внук
2012-05-14 16:56
2013.03.22
На Москву!


4-1261361454
SPeller
2009-12-21 05:10
2013.03.22
Проблема с циклом выборки сообщений


4-1258554833
Егорка
2009-11-18 17:33
2013.03.22
Интерфейсы


2-1340658279
Альманах
2012-06-26 01:04
2013.03.22
Создание одного фрейма два раз


2-1338534766
leklerk
2012-06-01 11:12
2013.03.22
Вторичная форма в центре главной





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский