Форум: "Основная";
Текущий архив: 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.072 c