Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.105 c
15-1158672046
Оксана
2006-09-19 17:20
2006.10.15
Работа


2-1159279828
Fostr
2006-09-26 18:10
2006.10.15
Вставить картинку в Word из Image


2-1159685512
Roeg
2006-10-01 10:51
2006.10.15
Как вывести чужое окно на передний план?


2-1159201684
Mishenka
2006-09-25 20:28
2006.10.15
Как распечатать StringGrid?


1-1157509175
dimon1
2006-09-06 06:19
2006.10.15
Нужна помощь





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