Главная страница
    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.047 c
2-1159244988
tlv
2006-09-26 08:29
2006.10.15
MediaPlayer - не запускается на компьютере без Delphi


1-1157484310
Sergioni
2006-09-05 23:25
2006.10.15
TwebBrowser


2-1159358066
Fostr
2006-09-27 15:54
2006.10.15
Передать данные из одной формы в другою


1-1157366830
Кабанчик
2006-09-04 14:47
2006.10.15
Синхронизация компонентов


15-1159206038
доктор
2006-09-25 21:40
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский