Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.238.5.144] |
|
Сообщ.
#1
,
|
|
|
Доброе утро!
Необходимо создать метод до выполнения некоторой функции, например MyCalcFunction, в компоненте. Задача метода, если параметр IsOccurred есть True, то функция MyCalcFunction работает и проводит вычисления, а если False, то фукция возвращает False. Но данная конструкция не работает. Подскажите почему и где ошибка? Создал такую конструкцию, код ниже: TOnBeforeMyEvent = procedure(Sender : Tobject; IsOccurred : Boolean) of Object; private FEventIsOccurred : Boolean; FOnBeforeMyEvent : TOnBeforeMyEvent; public function MyCalcFunction(const A, B : Integer): Boolean; procedure DoBeforeMyEvent(Sender : TObject; IsOccurred : Boolean); published property OnBeforeMyEvent : TOnBeforeMyEvent read FOnBeforeMyEvent write FOnBeforeMyEvent; procedure TMyComponent.DoBeforeMyEvent(Sender : Tobject; Index : IsOccurred : Boolean); begin if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, IsOccurred); end; function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean; begin Result := False; DoBeforeMyEvent(self, FEventIsOccurred); if not FEventIsOccurred then Exit; if A > B then Result := True; end; код в программе: procedure TForm1.MyComponent1BeforeMyEvent(Sender: TObject; IsOccurred: Boolean); begin IsOccurred := True; // или False end; Если нужна для этого функция типа: TOnBeforeMyEvent = function(????????): Boolean of Object; Можно небольшой пример как правильно прописать метод как функцию. В интернете по данному вопросу ничего не нашел. Все только о процедурах-событиях. Спасибо. |
Сообщ.
#2
,
|
|
|
или TOnBeforeMyEvent = procedure(Sender : Tobject; var IsOccurred : Boolean) of Object; //!!!!!!!! var или TOnBeforeMyEvent = function(Sender : Tobject):Boolean of Object; PS: Когда ты, наконец за матчасть возьмешься ?! Элементарных вещей не знаешь, а берешься сразу за компонены, да еще и с TAboutForm |
Сообщ.
#3
,
|
|
|
1.
С TAboutForm я разобрался и работает прекрасно. Спасибо. 2. Матчасть тоже изучаю, но ведь форум создан тоже и для того, чтобы чему-то научиться у профессионалов. Зачем же так раздраженно отвечать. Я же не прошу писать за меня код, а только проверить код на ошибки. Спасибо, что их нашли и указали. Спасибо. |
Сообщ.
#4
,
|
|
|
Еще - если параметр IsOccurred используется только в этой функции, то незачем под него отводить спец.поле FEventIsOccurred - можно юзать просто локальную переменную
function TMyComponent.DoBeforeMyEvent:Boolean; begin Result:=true; if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result); end; function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean; begin if DoBeforeMyEvent then Result:=A > B else Result:=false; end; |
Сообщ.
#5
,
|
|
|
Кстати конструкции
или TOnBeforeMyEvent = procedure(Sender : Tobject; var IsOccurred : Boolean) of Object; //!!!!!!!! var или TOnBeforeMyEvent = function(Sender : Tobject):Boolean of Object; не дают желаемого результата решения задачи. Может еще кто-то подскажет в чем проблема? Спасибо. |
Сообщ.
#6
,
|
|
|
Цитата SkAndriy @ Может еще кто-то подскажет в чем проблема? В том, что в твоем варианте DoBeforeMyEvent ес-но также должно быть var IsOccurred : Boolean PS: Для этого матчасть и нужна, чтобы не наступать на одни и те же грабли по 100 раз, соотв-но не задавать одних и тех же вопросов в разных вариациях и не раздражать таким образом "мировую общественность" |
Сообщ.
#7
,
|
|
|
код компонента:
TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object; TMyComponent = class(TComponent) private FEventIsOccurred : Boolean; FOnBeforeMyEvent : TOnBeforeMyEvent; public function DoBeforeMyEvent(): Boolean; published property OnBeforeMyEvent : TOnBeforeMyEvent read FOnBeforeMyEvent write FOnBeforeMyEvent; function TMyComponent.DoBeforeMyEvent(): Boolean; begin Result := True; if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result); end; function TMyComponent.MyCalcFunction(const A, B : Integer): Boolean; begin if DoBeforeMyEvent then Result:=A > B else Result:=false; end; в программе: procedure TForm1.MyComponent1BeforeMyEvent(Sender: TObject; IsOccurred: Boolean); begin IsOccurred := True; // или False end; Событие не работает. В чем проблема? спасибо. |
Сообщ.
#8
,
|
|
|
В какой момент должно сработать событие ? Как вы создаете компонент и как назначаете событие ? Где код ?
|
Сообщ.
#9
,
|
|
|
Событие сработало. Спасибо.
|
Сообщ.
#10
,
|
|
|
Цитата SkAndriy @ TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object; "Масло масляное" - и function и var, достаточно чего-то одного... |
Сообщ.
#11
,
|
|
|
Вы считает, что и так правильно:
TOnBeforeMyEvent = function(Sender : TObject; var IsOccurred : Boolean): Boolean of Object; и так TOnBeforeMyEvent = function(Sender : TObject; IsOccurred : Boolean): Boolean of Object; Но, несколькими постами ранее мне было строго указано, что без var нельзя, это ошибка. И еще небольшой вопрос: как по умолчанию присвоить IsOccurred, например False? так код не срабатывает: TOnBeforeMyEvent = function(Sender : TObject; IsOccurred : Boolean=False): Boolean of Object; извините, решение нашел, изменив Result к False: function TMyComponent.DoBeforeMyEvent:Boolean; begin Result:=False; if Assigned (FOnBeforeMyEvent) then FOnBeforeMyEvent(Self, Result); end; Спасибо |
Сообщ.
#12
,
|
|
|
Цитата SkAndriy @ Но, несколькими постами ранее мне было строго указано, что без var нельзя, это ошибка "Смотрим в книгу, видим фигу" ? Где ты в #5 увидел "и так, и так" ?! В случае процедуры передается var-параметр, а в случае функции нужно просто возвращать Result = true или false и соотв-но никакой параметр IsOccurred в ней вообше не нужен. А делать и var, и function - это просто запутывать и "напрягать" пользователя, который будет писать обработчик, чесать репу "что тут к чему" и вспоминать тебя недобрым словом |
Сообщ.
#13
,
|
|
|
спасибо за ответ.
|