Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.9.141] |
|
Страницы: (5) « Первая ... 2 3 [4] 5 все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Цитата SkAndriy @ Но есть одно но - не все поля почемуто обнуляются. Что в этом коде еще не соответствует? если выходить из того что у тебя идет обявления property Property3: Double index 2 read GetDataElement write FProperty3; То результатом выхода данных является то что возвращает GetDataElement а что ты там пересчитываешь это уже только ты знаешь. посмотри логику. в большей степени вероятности там и кроется то что параметры не обнуляется. И что ты этим написал? зачем ты переименовал свойство? разве я об этом писал? И где метод о котором я писал? Assigned(Value) применяется к ссылкам. ты не сможешь его применить к простому типу. У простых типов можно только сравнивать на значение. например в этом случае можно написать procedure SetMyEnum(Value : TMyEnumType); begin if Value <> FMyEnum then |
Сообщ.
#47
,
|
|
|
Цитата ViktorXP @ И что ты этим написал? зачем ты переименовал свойство? разве я об этом писал? И где метод о котором я писал? Я не понял этого. Можно конкретнее. Спасибо |
Сообщ.
#48
,
|
|
|
Если так, например для FMyOptions:
TMyComponent = class(TComponent) TDoChangeMyOptionsEvent = procedure(Sender : Tobject; Index : Integer) of Object; private FOnDoChangeMyOptions: TDoChangeMyOptionsEvent; publishin procedure OnDoChangeMyOptions(Sender : Tobject; Index : Integer); protected; property DoChangeMyOptions : TDoChangeMyOptionsEvent read FOnDoChangeMyOptions write FOnDoChangeMyOptions; ............ end; implementation procedure TMyComponent.OnDoChangeMyOptions(Sender : Tobject; Index : Integer); begin if Assigned (FOnDoChangeMyOptions) then FOnDoChangeMyOptions(Self); end; procedure TMyComponent.SetMyOptions(Value : Integer); begin if FMyOptions = Value then Exit; FMyOptions := Value; Property1 := 0; Property2 := 0; Property3 := 0; OnDoChangeMyOptions(Self, Value); end; А для TMyEnumType по аналогии. Или как то иначе. будет верно? Спасибо |
Сообщ.
#49
,
|
|
|
уже лучше только расстановка негласных правил не верна. да и секции размещения перепутаны.
Цитата SkAndriy @ переименовываем обратно в Onproperty DoChangeMyOptions : TDoChangeMyOptionsEvent read FOnDoChangeMyOptions write FOnDoChangeMyOptions; property OnChangeMyOptions : TOnChangeMyOptionsEvent read FOnChangeMyOptions write FOnChangeMyOptions; тогда метод Цитата SkAndriy @ соответственно в Doprocedure OnDoChangeMyOptions(Sender : Tobject; Index : Integer) procedure DoChangeMyOptions(Sender : Tobject; Index : Integer); для метода DoChangeMyOptions не нужен первый параметр Sender. он его и так знает. посему обявление можно подправить как: procedure DoChangeMyOptions(Index : Integer); а вот в теле метода у тебя ошибка FOnDoChangeMyOptions(Self); сама переменная FOnDoChangeMyOptions является типом TDoChangeMyOptionsEvent у которого два параметра. так почему ты передаеш только одно? посему дописываем второй параметр (+ предшествующие изминения) procedure TMyComponent.DoChangeMyOptions(Index : Integer); begin if Assigned (FDoChangeMyOptions) then FOnDoChangeMyOptions(Self, Index); end; также у тебя синтаксическая ошибка publishin. правильнее published а теперь о секциях размещения: само свойство ты спрятал в протекции. посему никто этого свойства не увидет кроме компонента который будет наследоватся от этого. А вот реакцию (DoChangeMyOptions) ты на оборот показал всем (даже дизайнеру свойств. хотя он этого и не оценит. так как он показывает только свойства) вывод: меняй местами. |
Сообщ.
#50
,
|
|
|
Вот код, но где-то ошибка, а где не могу понять.
Спасибо |
Сообщ.
#51
,
|
|
|
Вот код, но где-то ошибка, а где не могу понять.
Спасибо Прикреплённый файлUnit2.zip (1,15 Кбайт, скачиваний: 132) |
Сообщ.
#52
,
|
|
|
Цитата Но если мне не изменяет память то в 33 сообщении говорится об обратномprocedure Assign(Source: TPersistent); reintroduce; насчет Цитата leo говорил в 41 посте.inherited Assign (Source); ну и ошибка логическая procedure TMyComponent.SetMyOptions(Value : Integer); begin .... OnChangeMyOptions(Self, Value); end; посему вызов nil(self, value) приведет к ошибке. |
Сообщ.
#53
,
|
|
|
Спасибо. все предыдущие ошибки исправил, процедуру события тоже. Все вызывается. А если просто применить стандартное событие OnChange на что в этом компоненте оно будет реагировать?
|
Сообщ.
#54
,
|
|
|
И например, его прописать так:
property MyEnumProp: TMyEnumType read FMyEnum write SetMyEnum; procedure TMyComponent.SetMyEnum(Value: TMyEnumType); begin if(FMyEnum <> Value) then begin FMyEnum:=Value; Changed; end; end; procedure TMyComponent.Changed; begin if Assigned(FOnChange) then FOnChange(Self); end; На какие изменения или какие события я в таком случае могу обработать в realtime? Спасибо |
Сообщ.
#55
,
|
|
|
А что ты имеешь ввиду под словом стандартное? OnChange это просто название. тип TNotifeEvent это просто тип. это все ни к чему не привязано. а реагировать оно будет так как ты это напишешь.
пс. логика событий не зависит от имени. Добавлено Цитата SkAndriy @ На какие изменения или какие события я в таком случае могу обработать в realtime? так ты ведь сам написал if(FMyEnum <> Value) then begin FMyEnum:=Value; Changed; end; |
Сообщ.
#56
,
|
|
|
Тогда по логикне вещей получается если прописать процедуру onChanged в процедуре procedure TMyComponent.SetMyEnum(Value: TMyEnumType) в realtime она будет реагировать на изменения свойства MyEnumProp класса TMyEnumType? А как она должна быть и в каих секциях прописана в самом TMyComponent = class(TComponent)? Спасибо
|
Сообщ.
#57
,
|
|
|
Цитата SkAndriy @ private - доступны переменные/методы/свойства только самому компоненту и ни кому более. (для свойств не используется)в каих секциях прописана protected - доступны переменные/методы/свойства только компоненту и его потомкам public - достопны переменные/методы/свойства всем желающим. published - тоже что и public + свойства видимы в инспекторе (используется исключительно для свойств. на все другое компилятор выдает предупреждение) тебе определенно нужно книжку взять и почитать насчет ООП. |
Сообщ.
#58
,
|
|
|
Я это знаю, я имел ввиду иное:
достаточно прописать просто в published OnChange, а если ему дописать параметры, например OnChange(Sender:Objects; Index:Integer)? тогда надо объявлять как в предыдущем рассматриваемом случае? Спасибо |
Сообщ.
#59
,
|
|
|
Цитата SkAndriy @ тогда надо объявлять как в предыдущем рассматриваемом случае? Что ты под этом имеешь ввиду? если нужнен ли в таком случае метод Do..xxx.. то да. он нужен в любом случаи. |