Текущий архив: 2006.10.29;
Скачать: CL | DM;
Вниз
Методы и процедуры Найти похожие ветки
← →
Doma (2006-09-15 18:48) [0]Всем привет!
Помогите разобраться.
Есть два типа:
TMyProc1 = procedure(a,b: integer);
TMyProc2 = procedure(a,b: integer) of object);
PMyProc1 = ^TMyProc1
PMyProc2 = ^TMyProc2;
И есть процедура, который выполняет процедуры типа TMyProc1
procedure ExecProc1(proc: PMyProc1; a,b: integer);
var p: TMyProc1;
begin
@p := proc;
p(a,b);
end;
Задача сделать так чтобы эта же процедура могла выполнчть и методы типа TMyProc2.
← →
Palladin © (2006-09-15 18:49) [1]зачем?
← →
Doma (2006-09-15 19:07) [2]Есть необходимость...
Я предполагаю, что надо сделать приметно так:
procedure ExecProc(proc: pointer; a,b: integer);
begin
if proc is PMyproc1 then begin
...
end else begin
...
end;
end;
Но у меня не как не получается...
Знаю, что можно сделать две процедуры с разными параметрами, но с одинаковым названием ( с overload ), но задача сделать это в одной процедуре.
← →
Ketmar © (2006-09-15 19:08) [3]за геморроем соскучились.
← →
Ketmar © (2006-09-15 19:09) [4]> [2] Doma (15.09.06 19:07)
бросай ты этот Delphi. отстоище редкое. чтобы на нём писать -- надо ещё и какой-то там язык учить. а учить -- сложно. ещё и английский надо знать, чтобы со справкой подружиться... сложно, однозначно. бросай лучше.
← →
Palladin © (2006-09-15 19:21) [5]
> Есть необходимость...
нет, нету, зато есть поиск второго слова в третьем посте...
правда если ты поделишься с нами смыслом задачи, то может быть найдется более простое решение...
← →
Doma (2006-09-15 19:23) [6]Давайте писать по существу... если можешь помочь - помоги... а демогонию разводить не надо... надо это или нет, нужно ли писать на делфи или не надо, я думаю решать каждому... а обсуждение подобных тем явно должно быть не в этом разделе форума.
← →
Doma (2006-09-15 19:24) [7]Задача написать процедуру, которая могла бы выполнять и методы и процедуры!! Куда конкретней!
← →
Джо © (2006-09-15 19:26) [8]> [7] Doma (15.09.06 19:24)
> Задача написать процедуру, которая могла бы выполнять и
> методы и процедуры!! Куда конкретней!
Не нужно кричать.
По указателю не отличишь метод от процедуры. Есть частные решения, но общего нет.
← →
Ketmar © (2006-09-15 19:26) [9]> [6] Doma (15.09.06 19:23)
давай давать советы и рекомендации у себя дома, а не здесь? уж до сих пор как-то жили без ценных указаний, и дальше проживём.
← →
Doma (2006-09-15 19:28) [10]Да я не кричу! Совершенно спокоен...
А если попробовать вызвать в конструкции:
try
// пробуем как метод, если не прокатывает - падает
except
// значит пробуем как процедуру
end;
вот тока не понятно как метод в поинтер превратить...
← →
Ketmar © (2006-09-15 19:30) [11]класс. орешек за орешком.
мне вот всегда было интересно: почему народ вместо того, чтобы учить матчасть, включает бредогенератор?
← →
Palladin © (2006-09-15 19:30) [12]
> [7] Doma
это подзадача, которая происходит от задачи более верхнего уровня, вот этот более верхний уровень от тебя и ожидается... и давай без эксцессов...
← →
Palladin © (2006-09-15 19:32) [13]
> [10] Doma
падать может по куче причин, так же как и может неупасть при вызове метода
← →
Doma (2006-09-15 19:35) [14]думаю в этом случае не може не упасть при вызове метода, т.к адресация происходит по расному...
Может перейдем от теории к практики? Пока я тут прочитал тока размышления, некторорые даже не связаня с проблемой (не будем показывать пальцем)...
← →
Doma (2006-09-15 19:36) [15]думаю в этом случае не може не упасть при вызове метода, т.к адресация происходит по разному...
Может перейдем от теории к практике? Пока я тут прочитал тока размышления, некторорые даже не связаня с проблемой (не будем показывать пальцем)...
← →
Ketmar © (2006-09-15 19:38) [16]предланаю начать переход к практике с торжественной отсылки метлы на адрес корреспондента Doma. адрес в студию, если можно.
← →
Джо © (2006-09-15 19:38) [17]> Пока я тут прочитал тока размышления, некторорые даже не
> связаня с проблемой
Рановато пока судить об уровне других, не кажется?
Так задача будет поставлена или нет?
← →
Ketmar © (2006-09-15 19:40) [18]> [17] Джо © (15.09.06 19:38)
не будет. это очевидно. нам же доставляет удовольствие корчить из себя гестаповцев. это, по-моему, всему рунету известно. правило есть такое неписаное: "пришёл на ДельфиМастер -- ни в коем случае не начинай вопрос с толкового описания проблемы. все знаю, что посетители форума ничем не занимаются и очень скучают. поэтому позволь им развлечься и в течение нескольких дней выяснять, что же именно имелось в виду, и чего охота добиться."
← →
Doma (2006-09-15 19:41) [19]Задача поставлена. см Doma [1,2,7]...
Если интересует задача более верхнего уровня, то это оч долго объяснять... могу тока сказать, что это все нужно для системы плагинов, которую я реализую.
← →
Джо © (2006-09-15 19:43) [20]> [19] Doma (15.09.06 19:41)
> Задача поставлена. см Doma [1,2,7]...
> Если интересует задача более верхнего уровня, то это оч
> долго объяснять... могу тока сказать, что это все нужно
> для системы плагинов, которую я реализую.
Так значит, изменить свою "систему плагинов" ничего не мешает? Не базировать ее, так сказать, на заведомо глупых технических решениях.
← →
Doma (2006-09-15 19:46) [21]Что значит заведомо глупое техническое решение, я думаю об этом рано судить... Задача появилась потому, что плагины вызывают эту процедуру с параметром метод и параметры, все было замечательно пока не пришлось писать плагин на другом языке программирования, где понятия метод просто нет... вот я и думаю на решение проблемя, заодно решил и народ поспрашивать...
И опять же, я не спрашиваю совет, правильно я сделал или нет, спрашиваю помочь с решением конкретной проблемы...
← →
Ketmar © (2006-09-15 19:52) [22]> [21] Doma (15.09.06 19:46)
вьюноша, с подобным самомнением вам бы лучше книги писать. глядишь, второй Флёнов появится.
мы тут, знаете ли, привыкли учить думать. вот и вам во всей ветке намекали, что так -- не строят. зря, видимо, намекали... %-(
← →
Джо © (2006-09-15 19:54) [23]Еще раз. Исправить изначально непродуманную систему плагинов при помощи введения "костылей" — это возведения костыля в квадрат.
Свое мнение о технической реализации я уже высказал в [8].
Твой вариант в [10] только укрепил меня в мысли, что усовершенствованные костыли — это еще большее зло, чем неусовершенствованные. Уж позволь метафорически, я мог бы и резче, но нет мне нужды надрываться и что-то доказывать.
Нормальные решения выглядели бы так. Выкинуть всю эту систему и изначально сделать ее (если уж нужны были "методы") на COM. А теперь — поздно.
← →
Palladin © (2006-09-15 20:04) [24]
> спрашиваю помочь с решением конкретной проблемы
проблемма не решаема
> правильно я сделал или нет
Неправильно конечно... причем с самого начала... что такое метод - это та же процедура и отличается тем, что при его вызове неявно передается, в параметрах самым первым, пресловутый Self, и что тип объявления of object является записью TMethod, описаной в справке...
Как же ты сможешь по нетипизированному указателю на область памяти определить, что в ней находится и как оно вызовется?
разве что есть одно решение сравнивать содержимое стека с указателями на все созданные объекты в программе, и если найдешь, то метод, не найдешь - не метод... пойдет? :)
← →
Джо © (2006-09-15 20:08) [25][24] Palladin ©
> разве что есть одно решение сравнивать содержимое стека
> с указателями на все созданные объекты в программе,
Еще учесть, что эти все "объекты" находятся в подгружаемых DLL (ибо "плагины") :)
← →
Palladin © (2006-09-15 20:09) [26]
> проблемма не решаема
хотя конечно вру... еще одно решение... просто беднягам которые будут писать тебе плюгины придется эмулировать вызов методов, что конечно ты должен заявить в документации по написанию плюгинов... :)
← →
Lamer@fools.ua © (2006-09-15 20:11) [27]>при его вызове неявно передается, в параметрах самым первым, пресловутый Self
AFAIR, может быть и не первым. Зависит от соглашения о вызовах. По умолчанию, register => Self первым.
← →
Lamer@fools.ua © (2006-09-15 20:13) [28]>>Palladin © (15.09.06 20:09) [26]
Не такой уж и плохой вариант, кстати. Сигнатура будет содержать некийReserved: Pointer
.
← →
Doma © (2006-09-15 20:13) [29]Спасибо, я понял вашу точку зрения... буду придумывать другие решение проблемы...
← →
Palladin © (2006-09-15 20:13) [30]
> [27] Lamer@fools.ua ©
угу... твой AFAIR справедливый... это я упустил...
← →
Palladin © (2006-09-15 20:16) [31]
> [29] Doma ©
:)) Дык это не точка зрения, это реальность... И не ты первый, и не ты последний, кто сталкивается с необходимостью координального перепродумывания некоторого куска или иногда и целого фундамента проекта... потому и появляются, 2ые, 3тьи и XXXXные версии программных продуктов...
← →
Doma © (2006-09-15 20:16) [32]
> Lamer@fools.ua © (15.09.06 20:13) [28]
> Не такой уж и плохой вариант, кстати. Сигнатура будет содержать
> некий Reserved: Pointer.
Спасибо за поддержку ;)
← →
Doma © (2006-09-15 20:21) [33]Могу сказать, что у меня все учтено было заранее и переписовать мне ничего не придется... я немного не так сформулировал проблему, изначально у меня все было как показано в [1], потом я уже захотел туда внести делфевые методы... чтобы писать было легче, потому что система плагинов на компонентах реализована, а создать метод можно двойным кликом по инсектору объектов, а писать процедуру немного дольше, вот я и думал над оптимизацие... Теперь буду думать над другой проблемой, как можно компонентой создавать в дизайн-тайме шаблоны процедур...
Еще раз спасибо за отклики...
← →
begin...end © (2006-09-15 20:22) [34]> Lamer@fools.ua © (15.09.06 20:11) [27]
> Зависит от соглашения о вызовах.
Насколько я знаю, не зависит.
← →
Palladin © (2006-09-15 21:11) [35]
> [34] begin...end ©
Зависит.
← →
guav © (2006-09-15 21:53) [36]Если смотреть на место в списке параметров - не зависит.
Если смотреть на расположение в стеке - разумеется, зависит - при stdcall/cdecl/safecall он наверху, при pascal внизу, при register вообще не попадает в стек.
← →
Palladin © (2006-09-15 21:54) [37]
> Если смотреть на расположение в стеке
о чем и речь...
← →
oxffff © (2006-09-15 22:11) [38]To guav
>Если смотреть на место в списке параметров - не зависит.
>Если смотреть на расположение в стеке - разумеется, зависит - при >stdcall/cdecl/safecall он наверху, при pascal внизу, при register вообще не >попадает в стек.
Слегка поправлю про register
The register convention uses up to three CPU registers to pass parameters, while the other conventions pass all parameters on the stack.
← →
guav © (2006-09-15 22:16) [39]> [38] oxffff © (15.09.06 22:11)
Речь шла именно о self, так что он всегда попадает в регистр. Ошибся я как раз с остальными соглашениями вызова (верх стека - это большие адреса, потому верх/низ в [36] наоборот).
← →
oxffff © (2006-09-15 22:19) [40]>Задача написать процедуру, которая могла бы выполнять и методы и процедуры!! Куда конкретней!
Так сделай абстрактный класс.
Один потомок вызывает методы, второй процедуры.
procedure ExecProc(prcObject: AbstractCallerClass; a,b: integer);
begin
prcObject.call(a,b);
end;
Можно конечно и так выкрутиться но сложнее.
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.29;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.038 c