Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Вниз

Объектный процедурный тип   Найти похожие ветки 

 
postedman   (2008-12-13 17:24) [0]

Возник у меня тут такой вопрос. Скажем, есть у меня указатель на объектную функцию, скажем так:

type
 TMethod = function(const A, B : integer) : integer of object;

Есть объект:

type
 TFManager = class(TObject)
public
   { Public declarations }
   function Sum(const A,B : integer) : integer;

Тогда в программе я легко могу вызвать
Method : TMethod;
Manger : TFManager;
Method:=Manager.Sum;

Но предположим у меня есть еще не объектная, общая функция

function Add(const A,B : integer) : integer;

Как мне с помощью этого же самого указателя (Method) вызвать ее? Что и как нужно указателю присваивать?


 
Loginov Dmitry ©   (2008-12-13 18:00) [1]

> Как мне с помощью этого же самого указателя (Method) вызвать
> ее?


Непонятно, зачем это...
Но самое простое - добавить метод Add в тот же TFManager, и присваивать Method:=Manager.Add; (объект Manager при этом создавать не обязательно).


 
postedman   (2008-12-13 18:26) [2]

Мне, если честно, это нахрен не надо. Препод сказал "Так сделать можно, а как - ты должен мне ответить". Ничего никуда нельзя перемещать. Нужно присвоить объектному указателю ссылку именно на внешний, не объектный метод


 
Slym ©   (2008-12-13 18:44) [3]

postedman   (13.12.08 18:26) [2]
function Add(Self:TObject;const A,B : integer) : integer;

Method.Code:=@Add;
Method.Data:=pointer(Manger);


 
postedman   (2008-12-13 19:22) [4]

Пробовал уже так, сейчас вот снова попробовал - не работает:
Not enough actual parameters
Ругается на строчки:
Method.Code:=@Add;
Method.Data:=pointer(Manger);


 
jack128_   (2008-12-13 19:45) [5]


> Пробовал уже так, сейчас вот снова попробовал - не работает:

а ты отучись от привычки - давать своим типам такие же названия, какие имею стандартные типы. Slym в своем ответе думал, TMethod - System.TMethod (или этот тип в sysUtils описал? не помню)


 
postedman   (2008-12-13 20:01) [6]

Сорри, да, это мой собственный тип. Так как это сделать с моим типом?


 
postedman   (2008-12-13 20:33) [7]

В указателе на объектную функцию первые четыре байта отводятся на адрес подпрограммы, а вторые - на экземпляр объекта, как я помню. Получается мне нужно к ним по отдельности обратиться, и записать в первые 4 байта указатель на внешнюю, необъектную функцию, а во вторые четыре записать nil. Вот только как это сделать?


 
Servy ©   (2008-12-13 20:33) [8]

> Как мне с помощью этого же самого указателя (Method) вызвать
> ее?


А как ты с его помощью вызываешь Sum? Я не вижу способа вызвать его без приведения к нужному типу, например:

TNotifyEvent(Method)(MySender);

Если очень хочется, то можно запихнуть в TMethod укатазель на процедуру. Правда смысла в этом очень немного, почему бы не объявить обычный указатель вместо TMethod?

var
 Method : TMethod;

type
 TSum = function (const A, B: Integer): Integer;

function Add(const A, B: Integer) : Integer;
begin
 Result := A + B;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Method.Code := @Add;
 ShowMessage(IntToStr(
     TSum(Method.Code)(2,2)));
end;


 
Servy ©   (2008-12-13 20:36) [9]

> Сорри, да, это мой собственный тип. Так как это сделать
> с моим типом?


Твой тип точно также представляет собой 8 байтовую структуру. И его можно привести у типу System.TMethod. Дальше, все сказанное остается справедливым.


 
Servy ©   (2008-12-13 20:40) [10]

type
 TMethod = function(const A, B: Integer): Integer of object;

var
 Method : TMethod;

type
 TSum = function (const A, B: Integer): Integer;

function Add(const A, B: Integer) : Integer;
begin
 Result := A + B;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 System.TMethod(Method).Code := @Add;
 ShowMessage(IntToStr(
     TSum(System.TMethod(Method).Code)(2,2)));
end;


Видимо, это соответствует постановке задачи
> Но предположим у меня есть еще не объектная, общая функция


> Как мне с помощью этого же самого указателя (Method) вызвать
> ее?


Но на самом деле редкая глупость. Есть мнение, что либо:
1. Ты не правильно понял преподавателя
2. Преподаватель не адекватен


 
postedman   (2008-12-13 20:40) [11]

Sum с его помощью я вызыву так:
summa := method(2,2);

Тип TMethod - это мой тип, не стандартный, уж сорри, что так совпало имя.
Мне просто задали это сделать, и я нигде не могу найти как. Это тип - указатель на объект какого-то класса. В моем примере - указатель на Manager.Sum.

А мне нужно, чтобы с помощью абсолютно этого же указателя, указателя на метод объекта, можно было вызвать обычный метод, который вне объекта. То есть присвоить ему, указателю на объектный метод, адрес не объектной функции, а обычной, внеобъектной.

И не спрашивайте зачем делать все через такое место - это ОНИ хотят... %)


 
postedman   (2008-12-13 20:47) [12]

Так оно работает, хз, понравится ли преподавателю.
Спасибо огромное, я уже просто не знал, к кому обратиться, а то преподавателей у нас по дельфи всего два. Один ведет лекции и ничего почти не знает с практической точки зрения, а второй ведет лабы и любит задать какой-нибудь вопрос, попросить что-нибудь сделать, причем не обязательно полезное или умное, а сделать только потому, что так сделать можно... %))

Спасибо огромное)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
1-1228947824
angvelem
2008-12-11 01:23
2009.12.20
C to pascal


15-1256065014
Yegorchic
2009-10-20 22:56
2009.12.20
Поиск картинки по картинке


6-1209028510
ivanov
2008-04-24 13:15
2009.12.20
3агрузить страницу с подменой своего стиля


2-1256993435
Keba
2009-10-31 15:50
2009.12.20
Границы родительской формы для MDI


1-1228851112
Tack
2008-12-09 22:31
2009.12.20
Как открыть длинный URL в браузере?





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