Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
ВнизКак создать событие на изменение своей переменной Найти похожие ветки
← →
MasterKolyan (2004-02-27 14:19) [0]<Уважаемые мастера Delphi: я думаю вы сталкивались с такой проблемой, или хотели когда-то открыть новую возможность своей проги>
<предисловие>
Как обрабатывать события (стандартные (у компонентов)) или Wind-ы - это понятно, а вот
<вопрос>
как обработать своё какое нибудь нестандартное (левое) событие, да так чтоб ещё и скорость не уступала стандартным - неясна....
← →
Fay (2004-02-27 14:20) [1]хрень какая-то...
← →
Anatoly Podgoretsky (2004-02-27 14:22) [2]Ни как
← →
Алхимик (2004-02-27 14:24) [3]Копай в сторону TEvent.
← →
Юрий Зотов (2004-02-27 14:30) [4]> MasterKolyan (27.02.04 14:19)
Если Вы хотите услышать конкретный ответ - задайте конкретный вопрос.
← →
Никто (2004-02-27 14:37) [5]1. По идеологии ООП "вызов метода" аналогичен "посылке сообщения".
2. "Событие на изменение переменной" - это из области свойств:
property MyVariable: integer read m_iMyVariable write SetMyVariable;
в таком случае SetMyVariable - метод, вызываемый при (попытке) изменения переменной (см. п. 1).
← →
Eagle-XK (2004-02-27 14:41) [6]Приведи пример программы и укажи, что конкретно ты хочешь! (тут же бывают и кадры, которые не знают, как обработать простой Эдит :-) )
Тем более, что переменную можешь изменить только ТЫ или внешняя программа (вроде АртМаны, Сосульки и т.д.). Тогда совет - проверяй ее почаще!
← →
MasterKolyan (2004-02-27 14:41) [7]а как тогда события на Delphi-нские компоненты реализовываются: Window-возовские события чтоли используют
← →
Digitman (2004-02-27 14:42) [8]
> Никто (27.02.04 14:37) [5]
> 1. По идеологии ООП "вызов метода" аналогичен "посылке сообщения".
что за ерунда ?
вызов метода ООП-объекта - это вызов метода ООП-объекта
посылка Win-сообщения - это посылка Win-сообщения
никакой "аналогии" нет даже в первом приближении
← →
MasterKolyan (2004-02-27 14:44) [9]свои события можно обрабатывать Timer-ом или application.idle-ом но мне кажется что они будут тормозить процесс....
← →
Digitman (2004-02-27 14:46) [10]
> MasterKolyan (27.02.04 14:44) [9]
ты путаешь понятия "возбуждение события" и "обработка события"
← →
Digitman (2004-02-27 14:49) [11]
> MasterKolyan (27.02.04 14:44) [9]
> свои события можно обрабатывать Timer-ом
какие же они "свои" ? объект-таймер возбуждает собственное событие - OnTimer(), равно как и объект-аппликация возбуждает собственное событие - OnIdle() ..
ты же волен только обрабатывать или не обрабатывать (игнорировать) эти события, назначив или не назначив им соотв.методы-обработчики
← →
MasterKolyan (2004-02-27 14:49) [12]а как же они тогда возбуждаются?
← →
MasterKolyan (2004-02-27 14:54) [13]Digitman © (27.02.04 14:49) [11]
ты же волен только обрабатывать или не обрабатывать (игнорировать) эти события, назначив или не назначив им соотв.методы-обработчики
так что же это получается программист должен ограничивать возможности своей проги в силу недостатка каких-то там событий, и не может даже добавить к стандартным какое-то своё чтобы снять ограничение....странно....
← →
Digitman (2004-02-27 14:55) [14]
> MasterKolyan (27.02.04 14:49) [12]
> а как же они тогда возбуждаются?
а ты загляни в исх.тексты этих компонентов !
думаю, многое для тебя сразу прояснится
например, в модуле stdctrls.pas найди реализацию метода
procedure TTimer. Timer;
begin
if Assigned(FOnTimer) then FOnTimer(Self); //здесь и вызывается твой собственный обработчик, если он тобой назначен
end;
а вот оконная процедура, в которой приложения реагирует на системные события таймера и при наличии таковых возбуждает собственно прикладное событие этого таймера :
procedure TTimer.WndProc(var Msg: TMessage);
begin
with Msg do
if Msg = WM_TIMER then
try
Timer; //вот оно - возбуждение события !!
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
← →
Digitman (2004-02-27 14:58) [15]
> MasterKolyan (27.02.04 14:54) [13]
> так что же это получается программист должен ограничивать
> возможности своей проги в силу недостатка каких-то там событий,
> и не может даже добавить к стандартным какое-то своё чтобы
> снять ограничение....странно....
ну почему же ? никаких ограничений на это счет нет !
ты вправе создать собственный компонент, например, на базе уже существующего (т.е. создать собственный класс-наследник некоего существующего класса, например, TTimer), и определить/реализовать в нем собственный механизм возбуждения нужных тебе событий, которыми будет управлять экземпляр твоего класса
← →
Никто (2004-02-27 14:58) [16]2 Digitman
Читайте внимательнее: не "Win-сообщение", а "сообщение". Это разные вещи. Вызов метода - единственный способ общения с экемпляром класса. Вызывая метод, мы посылаем экземпляру класса сообщение. (Читайте об идеологии ООП). Win-сообщения - суррогат, призванный внести единообразие в различные способы вызовов методов (stdcall, pascal, ...).
← →
Digitman (2004-02-27 15:02) [17]
> Вызывая метод, мы посылаем экземпляру класса сообщение
вызывая метод, мы всего лишь вызываем метод) ... не более и не менее того ... никакими "сообщениями" в этот момент (т.е. в момент вызова метода) даже не пахнет - просто выполняется маш.инструкция call, передающая управление указанно подпрограмме
← →
Eagle-XK (2004-02-27 15:03) [18]2 MasterKolyan
Да моджно создать свое событие и обрабатывать его, тут никаких проблемм!
← →
Defunct (2004-02-27 15:05) [19]MasterKolyan (27.02.04 14:49) [12]
Для того чтобы понять откуда берутся события, читаем классику про систему прерываний. И потом интерпретируем на многозадачную ОС.
Возбуждаются события 3-мя путями:
- аппаратно (юзер нажал на какую-то кнопку, такт системного таймера и т.п.)
- программно (программа "А", послала сообщение программе "Б")
- в результате какой-то ошибки (команда деление на 0).
Все эти события принимают вид сообщения виндовс, которое мы можем прочитать в полях Message. В программе есть цикл выборки сообщений видовс и далее обработка всех событий характерных для данной программы.
← →
Digitman (2004-02-27 15:06) [20]
> Win-сообщения - суррогат, призванный внести единообразие
> в различные способы вызовов методов (stdcall, pascal, ...).
как раз не суррогат, а идеол.концепция функционирования Win32-систем
и соглашения о вызовах здесь совершенно ни при чем - мы просто должны придерживаться декларированных тем или иным разработчиком языковых соглашений, коль скоро мы вынуждены использовать их софт в том или ином виде
← →
Никто (2004-02-27 15:07) [21]2 Digitman
>>вызывая метод, мы всего лишь вызываем метод
Не путайте процедурное программирование с ООП. Вызов метода в ООП - запрос к объекту, сообщение. И никак не иначе.
← →
MasterKolyan (2004-02-27 15:09) [22]Digitman © (27.02.04 14:55) [14]
procedure TTimer.WndProc(var Msg: TMessage);
begin
with Msg do
if Msg = WM_TIMER then
try
Timer; //возбуждение события
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);//а эта строка вообще непонятно зачем(ну это не важно)
end;
а msg тогда чо не событие разве(между прочим таймер - это стандартное событие, а как возбуждать событие на изменение байта памяти всё еще непонятно....
← →
Тимохов (2004-02-27 15:11) [23]
> а как возбуждать событие на изменение
> байта памяти всё еще непонятно...
Никак без дополнительных примочек.
← →
Никто (2004-02-27 15:11) [24]2 Digitman
Специально нашел: http://pmi.ulstu.ru/new_project/objects/lections.htm
Обратите внимание на п. 2. Это не про Win-сообщения. Это про то, что процедурные программисты привыкли называть вызов процедуры или функции.
← →
Digitman (2004-02-27 15:11) [25]
> Никто (27.02.04 15:07) [21]
а о каких методах в процед.прогр-нии вообще может идти речь ? Нет там никаких методов) .. Термин "метод класса" или "метод объекта" применим лишь в ООП
> Вызов метода в ООП - запрос к объекту, сообщение
Вызов метода в ООП - всего лишь вызов тем или иным способом подпрограммы, реализующей этот метод.
← →
Никто (2004-02-27 15:15) [26]2 Digitman
Я вроде о вызове методов в процедурном программировании и не говорил. Я только лишь просил "не путать".
← →
Digitman (2004-02-27 15:15) [27]
> Никто (27.02.04 15:11) [24]
> про то, что процедурные программисты привыкли называть вызов
> процедуры или функции.
ну а какая разница-то ? в ПП - вызов процедуры или ф-ции, в ООП - вызов процедурного или функционального метода) ... Те же яйца, но вид сбоку) ... как был вызов подпрограммы, так он им и остался, только что название изменилось
← →
Defunct (2004-02-27 15:16) [28]MasterKolyan (27.02.04 14:54) [13]
> так что же это получается программист должен ограничивать возможности своей проги в силу недостатка каких-то там событий, и не может даже добавить к стандартным какое-то своё чтобы снять ограничение....странно....
Все события обрабатываются диспетчером событий ОС, а в нашу программу попадают в виде сообщения. Программа с объектом Application автоматически принимает каждое событие и заносит его идентификатор в переменную Message. Далее мы вольны сами решить стоит нам обработать это событие или нет.
← →
Defunct (2004-02-27 15:22) [29]Никто (27.02.04 15:07) [21]
2 Digitman
>>вызывая метод, мы всего лишь вызываем метод
>Не путайте процедурное программирование с ООП. Вызов метода в ООП - запрос к объекту, сообщение. И никак не иначе.
Это какая-то чипуха. На ассеблере что вызов процедуры, что вызов метода выпоняется командой Call. Вызов метода не имеет никакого отношения к сообщениям ОС.
← →
Digitman (2004-02-27 15:23) [30]
> Никто (27.02.04 15:15) [26]
> 2 Digitman
> Я вроде о вызове методов в процедурном программировании
> и не говорил. Я только лишь просил "не путать".
ты упомянул о каких-то там "сообщениях"
я же говорю, что следствием возбуждения события является возможный вызов его обработчика, если он назначен ... вызов обработчика есть просто вызов некоего метода некоего объекта
а вот причинно-следственная связь ДО сего момента выглядит строго определенно : возбуждение объектом события с возможным последующем вызовом метода-обработчика есть следствие приема/обработки сообщения (или реакция на некий системный callback-вызов) и никак не наоборот
← →
Никто (2004-02-27 15:24) [31]Да, вот только вызвать private метод не получится, хоть он и "то же яйцо". Передача сообщений - это вызов только public методов и только внешними объектами. Для самого объекта это уже не собщение - это именно вызов собственного метода. И для этого объекта не важно, какой этот метод: public или private; важно, что это его собственный метод. Вызов метода одного объекта другим (внешним) объектом - посылка сообщения. Так уж оно в ООП называется. Термин такой. Не более и не менее.
P.S. Кому не нравится - может заменить слово "объект" на "экземпляр класса".
← →
MasterKolyan (2004-02-27 15:26) [32]Defunct © (27.02.04 15:16) [28]
значит всё-таки нельзя создать обработчик события на изменение ячейки памяти без использования других сообщений(их обработчиков)...
← →
Никто (2004-02-27 15:26) [33]Борьба терминологий...
← →
Тимохов (2004-02-27 15:29) [34]
> MasterKolyan (27.02.04 15:26) [32]
Это вам уже было сказано в [2]
← →
Anatoly Podgoretsky (2004-02-27 15:29) [35]А зачем нам путать, тут и место та для путаницы нет
Никто (27.02.04 14:58) [16]
2 Digitman
Читайте внимательнее: не "Win-сообщение", а "сообщение". Это разные вещи. Вызов метода - единственный способ общения с экемпляром класса. Вызывая метод, мы посылаем экземпляру класса сообщение. (Читайте об идеологии ООП). Win-сообщения - суррогат, призванный внести единообразие в различные способы вызовов методов (stdcall, pascal, ...).
← →
Digitman (2004-02-27 15:32) [36]
> Defunct © (27.02.04 15:22) [29]
> Это какая-то чипуха. На ассеблере что вызов процедуры, что
> вызов метода выпоняется командой Call. Вызов метода не имеет
> никакого отношения к сообщениям ОС.
а я разве говорил иначе ?!
и при чем здесь ассемблер как языковая среда ? call-инструкция - это далеко не ассемблер)
ну а уж коль ты о "ч ипухе", то как раз ты несешь несуразицу
> Программа с объектом Application автоматически принимает
> каждое событие и заносит его идентификатор в переменную
> Message
никакие "события" объект Application не принимает, он циклически ожидает и диспетчеризует Win- сообщения, параметры которых на момент диспетчеризации хранит во врем.структуре TMessage
а вот уже диспетчеризованные таким образом Win-сообщения могут обрабатываться той или иной оконной ф-цией, которая вполне может быть реализована в контексте того или иного VCL-объекта, который в свою очередь (как реакцией на обработку этого Win-сообщения) может возбуждать те или иные события VCL-объекта
← →
Digitman (2004-02-27 15:34) [37]
> Никто (27.02.04 15:24) [31]
о боже) ... припрел еще сюда и область видимости идентификатора в составе класса)) ... это-то здесь причем ?!
← →
Defunct (2004-02-27 15:36) [38]MasterKolyan (27.02.04 15:26) [32]
> значит всё-таки нельзя создать обработчик события на изменение ячейки памяти без использования других сообщений(их обработчиков)...
Можно, если включить отладочный режим. Т.е. наша программа долна быть отладчиком, тогда от процессора приходит ряд событий в т.ч. и событие записи по конкретному адресу памяти. Читайте документацию про трассировку и отладочные режимы x86.
← →
Никто (2004-02-27 15:37) [39]>>ты упомянул о каких-то там "сообщениях"
я упомянул, что в случае
property MyVariable: integer read m_iMyVariable write SetMyVariable;
SetMyVariable - метод, вызываемый при (попытке) изменения переменной (см. п. 1).
И еще сказал, что вызов метода называется посылкой сообщения.
В данном случае при попытке изменить MyVariable посылается сообщение SetMyVariable (с параметром, например, a_iNewValue), в обработчике которого можно обработать событие: изменение переменной.
Или я неясно сформулировал?
← →
MasterKolyan (2004-02-27 15:39) [40]Digitman © (27.02.04 15:32) [36]
никакие "события" объект Application не принимает, он циклически ожидает и диспетчеризует Win-сообщения, параметры которых на момент диспетчеризации хранит во врем.структуре TMessage
//
хм. а может этот Application и чего-нибудь моё может продиспетчеризовать....
Страницы: 1 2 3 4 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.015 c