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

Вниз

Вызов функции с неизвестными параметрами.   Найти похожие ветки 

 
Дмитрий С ©   (2012-12-12 17:19) [0]

Конструктивно.

Есть тип:
TSomeProc = procedure (Sender: TObject {+ любое количество параметров, включая var}) of object; {тут можно выбрать любую декларацию вызова для решения задачи}

Есть три переменных:
A, B, C: TSomeProc;

Есть метод, тело которой и является вопросом ветки.
procedure TSomeObject.DoProc;

Предположим, что A и B заполнено где-то.

Что нужно написать в теле TSomeObject.DoProc, чтобы выполнение следующего кода вызвало A и B с теми же параметрами, что и у C ?
TMethod(C) := TMethod(DoProc);
C(.....);


 
RWolf ©   (2012-12-12 19:39) [1]

вписать значения параметров вместо многоточия?


 
Владислав ©   (2012-12-12 20:05) [2]

Ничего не понял.


 
Игорь Шевченко ©   (2012-12-12 20:41) [3]

Согласен с предыдущим выступающим


 
Студент   (2012-12-12 20:54) [4]

Рекурсия? Игнор?

TMethod(C) := TMethod(DoProc);

procedure DoProc(a,b,c:integer);
begin
if((a = 0) and (b = 0))then
   buddaboom();
end;

procedure DoProc(a,b,c:integer);
begin
if(c <> 0) then
for c := 0 to c do
  if((a = 0) and (b = 0))then
     buddaboom();
else
  buddaboom();
end;


 
TSas   (2012-12-12 23:17) [5]

Tape TMultyParam = Array of variant;
function Func(var X: TMultyParam)...
Func([a, b])?


 
Rouse_ ©   (2012-12-12 23:21) [6]

Бредовая изначально задача, решаемая передачей параметров в виде структуры, у которой первыми 4 байтами идет размер блока параметров (как делают все грамотные апи, которым нужно поддерживать туеву хучу старых вариантов вызовов).
Городить огород на стеке на изменяемом количестве параметром = делать себе больно


 
Юрий Зотов ©   (2012-12-12 23:49) [7]

А прежде всего стоит задуматься - не появилась ли такая странная задача в результате плохой архитектуры, как это нередко бывает? И если да, то не лучше ли такую архитектуру пересмотреть?


 
Дмитрий С ©   (2012-12-13 03:55) [8]


> И если да, то не лучше ли такую архитектуру пересмотреть?

Да-да, задумался и не стал так делать. Но задача в голове осталась, как теоретическая.


> Rouse_ ©   (12.12.12 23:21) [6]

Идея была сделать дженерик-класс для поддержки нескольких слушателей событий. У разных событий ведь может быть разное число параметров. Как я понял можно использовать декларацию вызовов С и просто, не трогая стек, вызвать по порядку все обработчики событий.

Но в итоге сделал так, что у всех событий только один параметр - объект события, как это, например, в JavaScript сделано и задача стала решаться нормальным человеческим паскалем.


 
icWasya ©   (2012-12-13 09:35) [9]

По умолчанию в Delphi используется модель вызова - fastcall, то есть несколько первых параметров передаются через регистры, остальные через стек. И без танцев с бубном(асмом) не обойтись. А есть ещё stdcall, cdecl


 
Anatoly Podgoretsky ©   (2012-12-13 10:29) [10]

Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No



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

Форум: "Прочее";
Текущий архив: 2013.04.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1355386943
Empleado
2012-12-13 12:22
2013.04.07
Функции Interlocked...NoFence


2-1349156867
ixen
2012-10-02 09:47
2013.04.07
Не выполняется SQL запрос


15-1355413952
Rouse_
2012-12-13 19:52
2013.04.07
Delphi XE3 64 бита


2-1349394762
Wadimka
2012-10-05 03:52
2013.04.07
Подскажите примерчик


2-1349354094
vertual
2012-10-04 16:34
2013.04.07
Пожалуйста, помогите дописать программу





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