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

Вниз

Методы и процедуры   Найти похожие ветки 

 
oxffff ©   (2006-09-15 22:19) [40]

>Задача написать процедуру, которая могла бы выполнять и методы и процедуры!! Куда конкретней!

Так сделай абстрактный класс.
Один потомок вызывает методы, второй процедуры.

procedure ExecProc(prcObject: AbstractCallerClass; a,b: integer);
begin
prcObject.call(a,b);
end;

Можно конечно и так выкрутиться но сложнее.


 
oxffff ©   (2006-09-15 22:20) [41]

Паттерны друзья. Паттерны.
Гамма, Хелм, Джонсон, Влиссидес


 
oxffff ©   (2006-09-15 22:33) [42]

Второй вариант

procedure ExecProc1(proc: PMyProc1; a,b: integer);
var p: TMyProc1;
begin
@p := proc;
p(a,b);
end;

Procedure Abc(a,b:integer);
begin

end;

procedure MethodSmart(a,b:integer);
begin
globalVariableMethod(a,b);
end;

Думаю можно еще улучшить


 
oxffff ©   (2006-09-15 22:51) [43]

Третий способ Костыльный способ

В процедуре ExecProc1 проверять EAX и таблицу VTB.
Естественно загородить все в try except.
Далее
-44 Pointer pointer to short string containing class name
Сравнить с Tobject.
Если нет далее VBT родителя и т.д. До исключения, либо до Tobject


 
oxffff ©   (2006-09-15 22:54) [44]

Тут с третьим способом я поторопился. :)
Извиниюсь


 
oxffff ©   (2006-09-15 23:08) [45]

Хотя подождите.
Только не смейтесь.

var a:Tmethod;
begin
.........
ExecProc1(@a,1,2);

и далее применяем oxffff ©   (15.09.06 22:51) [43]


 
Eraser ©   (2006-09-15 23:18) [46]

> oxffff ©

и к чему эта куча сообщений? ) думаешь кому-то здесь открыл на что-то глаза :)


 
zamtmn ©   (2006-09-16 00:18) [47]

>Eraser
TMyProc2 = procedure(a,b: integer) of object
вовсе не подразумевает метод class`а, это может быть метод objecta`а, такчто третий способ не катит:)
>Doma
к чему PMyProc1 = ^TMyProc1?
TMyProc1 сам по себе является указателем
Лучше пересмотри свою систему плагинов, или пиши 2 разных процедуры для вызова процедур и методов.
PMyProc1 у тебя ^pointer
PMyProc2 у тебя ^Tmethod
и по proc: PMyProc1, ты никак не что нужно вызвать, никакие is и try не помогут


 
zamtmn ©   (2006-09-16 00:19) [48]

первое конечно не к Eraser, а к oxffff, сорри:)


 
oxffff ©   (2006-09-16 02:59) [49]

to eraser
>и к чему эта куча сообщений? ) думаешь кому-то здесь открыл на что-то >глаза :)

Абсолютно нет.

to zamtmn
А что касаемо оbject. Согласен

Безуслосно нужно использовать первый способ


 
begin...end ©   (2006-09-16 07:53) [50]

> Palladin ©   (15.09.06 21:11) [35]

При любом соглашении о вызове метода Self передаётся как первый неявный его параметр. Я полагал, что речь идёт именно об этом (см. [24]: "передается, в параметрах самым первым").


 
isasa ©   (2006-09-16 11:44) [51]

Не все так просто.
Вот выдержка из глубин желпа.

Methods use the same calling conventions as ordinary procedures and functions,
except that every method has an additional implicit parameter Self,
which is a reference to the instance or class in which the method is called.
The Self parameter is passed as a 32-bit pointer.

Under the register convention, Self behaves as if it were declared before all other parameters.
It is therefore always passed in the EAX register.

Under the pascal convention,
Self behaves as if it were declared after all other parameters
(including the additional var parameter sometimes passed for a function result).
It is therefore pushed last, ending up at a lower address than all other parameters.

Under the cdecl, stdcall, and safecall conventions,
Self behaves as if it were declared before all other parameters, but after the additional
var parameter (if any) passed for a function result.
It is therefore the last to be pushed, except for the additional var parameter.


 
begin...end ©   (2006-09-16 12:12) [52]

> isasa ©   (16.09.06 11:44) [51]

Угу, насчёт pascal -- не знал.


 
isasa ©   (2006-09-16 12:26) [53]

begin...end ©   (16.09.06 12:12) [52]
Я когдато на stdcall науродовался, пока не вырыл это в хелпе. После этого, даже сохранил этот текст отдельно в файл. :)

По сабжу. А кто мешает сделать так

TMyProc1 = procedure(self: pointer; a,b: integer); stdcall;
TMyProc2 = procedure(a,b: integer) of object; stdcall;

и вызывать не разбираясь?

stdcall - для Plug in, очень даже нормально.



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

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

Наверх





Память: 0.54 MB
Время: 0.046 c
15-1160368764
nali
2006-10-09 08:39
2006.10.29
Не работает Delphi6


2-1161074883
Dmitry_177
2006-10-17 12:48
2006.10.29
Запись в файл в DLL, THandle файла в разных процессах


2-1160596262
pathfinder
2006-10-11 23:51
2006.10.29
Сообщение как модальная форма..


2-1160667413
Oksana_new
2006-10-12 19:36
2006.10.29
Перевод символов в бинарный код


2-1160806111
gidd
2006-10-14 10:08
2006.10.29
TPopupMenu





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