Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.57 MB
Время: 0.029 c
2-1160863326
Khabibulin
2006-10-15 02:02
2006.10.29
LPT


15-1160381382
kot andrei
2006-10-09 12:09
2006.10.29
бесплатный англо-русский словарь


9-1137878222
Аццкий_рыцарь:)
2006-01-22 00:17
2006.10.29
Переход с DelphiX на UnDelphiX


15-1159902923
EkZot
2006-10-03 23:15
2006.10.29
ПОмогите плз. операции с матрицами.


3-1157437612
svt
2006-09-05 10:26
2006.10.29
!!!!ADOStoredProc1 !!!!Объясните, пожайлуста, где я ошибся