Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
ВнизВызов метода класса (с параметрами) через типизированный казатель Найти похожие ветки
← →
Cyrax © (2006-09-26 19:05) [0]Как ето самое в Delphi ?
← →
alex_*** © (2006-09-26 19:06) [1]MyObject(p).method(p1, p2);
← →
alex_*** © (2006-09-26 19:07) [2]obj: TObject
Тоже типизированный казатель, кстати
← →
TStas © (2006-09-26 19:11) [3]Дык указатель на объект не совсем ведь нормальный указатель. Его ведь нельзя разыменовать, к примеру.
← →
Cyrax © (2006-09-26 19:12) [4]p - должен быть типа казатель на такую-то ункцию с такими-то параматами...функцию
← →
TStas © (2006-09-26 19:13) [5]Дык тогда это не указатель вовсе, в процедурный тип.
← →
clickmaker © (2006-09-26 19:15) [6]
> [4] Cyrax © (26.09.06 19:12)
казатель на функцию объявляется так:
type TMyFunction = function(p1: integer; p2: string): integer;
var p: TMyFunction;
← →
Cyrax © (2006-09-26 19:16) [7]clickmaker © (26.09.06 19:15) [6]
Это и недо так...
← →
Cyrax © (2006-09-26 19:16) [8]тьфу, надо...
← →
Cyrax © (2006-09-26 19:18) [9]Нужно объявить указатель на метод класса, затем через конкретный экземпляр этого класса вызвать по этому указателю функцию...
← →
Eraser © (2006-09-26 19:23) [10]> [9] Cyrax © (26.09.06 19:18)
type
TMyFunction = function(p1: integer; p2: string): integer of object;
← →
default © (2006-09-26 19:43) [11]надо думать ту самую задачу решаешь?:):):)
← →
Cyrax © (2006-09-26 19:57) [12]Вася! Привет.
Как ты догадался...
← →
alex_*** © (2006-09-26 20:02) [13]а у default"a прописано имя Александр, однако
← →
Cyrax © (2006-09-26 20:07) [14]Так это не имя !
← →
default © (2006-09-26 20:25) [15]alex_*** © (26.09.06 20:02) [13]
правильно прописано
← →
Cyrax © (2006-09-26 20:33) [16]default, чудо разрабатывается на C++. Потом при желании можно будет сконвертить и на Object Pascal, и на C#...
← →
Сергей М. © (2006-09-26 21:01) [17]
> Cyrax
type
TMyMethod = procedure(..) of object;
...
var
MyMethod: TMyMethod; // вот тебе тот самый типизированный указатель
..
MyMethod(..); //а вот тебе вызов метода класса через тот самый типизированный указатель
?
← →
palva © (2006-09-26 22:50) [18]> MyMethod: TMyMethod; // вот тебе тот самый типизированный указатель
Какой же это указатель? Указатель это когда
MyMethod: ^TMyMethod;
← →
Cyrax © (2006-09-26 23:02) [19]Говорю с колокольни C++:
переменная функционального типа есть указатель на функцию/метод...
Да и вообще, отсутствие крыши не говорит о значимых типах...
← →
Суслик © (2006-09-26 23:22) [20]пишу тут, но идея верна - иногда так сам делаю.
var
m: tmethod;
o: tmyclass;
begin
m.code := @tmyclass.method;
...
o := tmyclass.cretae();
m.data := o;
m();
end;
← →
Суслик © (2006-09-26 23:24) [21]не, вроде еще m перед вызовом надо приведением типов к method pointer преобразовать
type
tm = procedure(); of object;
begin
...
tm(m)();
end;
← →
Суслик © (2006-09-26 23:30) [22]Меня тут совесть замучала - кидать непроверенные примеры.
Вот рабочий пример. Я правда вопроса не очень понял, т.к. кроме исходного топика не читал, но может будет полезным.
program Project1;
uses
SysUtils, Windows;
type
TMyMethod = procedure (a: integer) of object;
TMyClass = class
procedure M(a: integer);
end;
procedure TMyClass.M(a: integer);
begin
MessageBox(0, PChar(IntToStr(a)), "Hi", 0);
end;
var
m: TMethod;
c: TMyClass;
begin
m.Code := @TMyClass.M;
c := TMyClass.Create();
m.Data := c;
TMyMethod(m)(1);
end.
← →
palva © (2006-09-26 23:55) [23]Вот работающий код:
{$APPTYPE CONSOLE}
type
TC = class
fint: Integer;
function f(n: Integer): Integer;
end;
fun = function (n: Integer): Integer of object;
sfun = function (o: TC; n: Integer): Integer;
function TC.f(n: Integer): Integer;
begin
Result := n + fint;
end;
var
c1, c2: TC;
p: ^fun;
begin
c1 := TC.Create;
c1.fint := 5;
c2 := TC.Create;
c2.fint := 1;
p := @TC.f;
WriteLn(sfun(p)(c1, 4)); // 9
WriteLn(sfun(p)(c2, 4)); // 5
c1.Free;
end.
← →
Суслик © (2006-09-27 00:10) [24]Если пошла мода на работающий код, то посмотрите и на такой :)
uses
SysUtils,Windows;
type
TMyMethod = procedure(a: integer) of object;
TMyClass = class
class procedure M(a: integer);
end;
class procedure TMyClass.M(a: integer);
begin
MessageBox(0, PChar(IntToStr(a)), "Hi", 0);
end;
var
m: TMyMethod;
begin
m := TMyClass.M;
m(1);
end.
← →
palva © (2006-09-27 00:23) [25]Я понял задачу так, чтобы функция использовала поля из разных объектов, поэтому искал способы как при вызове функции через указатель кроме собственных параметров передать туда еще и объект, содержащий поля.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.053 c