Главная страница
    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.083 c
9-1193069982
lubass
2007-10-22 20:19
2013.03.22
Помогите! Как мне использовать только фон из delphi dxsprite


15-1345118559
Es
2012-08-16 16:02
2013.03.22
ADO + Ora = пропихнуть в хранимку blob более 32 кбайт


15-1329381756
Pit
2012-02-16 12:42
2013.03.22
borland.ru


2-1328617065
AV
2012-02-07 16:17
2013.03.22
TClientDataSet (TDataset) проапдейтить поле


2-1328181215
harisma
2012-02-02 15:13
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский