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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.042 c
2-1160658592
tsiren
2006-10-12 17:09
2006.10.29
обнуление поля с типом Data


3-1156875836
Николай_Москва
2006-08-29 22:23
2006.10.29
Запрос к 2м таблицам, объединенным отн. многие-ко-многим


15-1160409437
Kerk
2006-10-09 19:57
2006.10.29
ВЛАДИМИР ПУТИН: СЕМЬ ЛЕТ У ВЛАСТИ


2-1160537533
pkm
2006-10-11 07:32
2006.10.29
Типизированный файл.


6-1149575747
Vavilon
2006-06-06 10:35
2006.10.29
Написание плагина для Internet Explorera





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