Форум: "Прочее";
Текущий архив: 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