![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как присвоить обобщенную процедуру [WinXP]
VLK32 © (2011-01-22 20:43:00)Есть описание ссылки на функцию
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'?
Я тупой, я не могу понять в чем тут загвоздка. Помогите кто же может а то скоро клаву разобью нафиг...
oxffff (2011-01-24 09:05:00) [1]
> v2 © (24.01.11 00:52) [3]
:)
v2 (2011-01-24 00:52:00) [2]
> // а вот такое присваивание не работает!
> selector := GetCurrentSelector;
>
selector := GetCurrentSelector();
oxffff (2011-01-23 21:48:00) [3]IMHO. Баг.
_Юрий (2011-01-23 11:58:00) [4]Трудно сказать, почему не работает, вероятно это недоработка в компиляторе.
Что можно сделать -
можно вернуть функцию не результатом, а var-параметром