Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.04.04;
Скачать: CL | DM;

Вниз

Поймать OnClick в классе   Найти похожие ветки 

 
oleg1963lora   (2010-02-03 11:26) [0]

Еще один вопрос. Создал класс: на панели находятся ProgressBar, UpDown и ассоциированный с ним Edit. Нужно чтобы при нажатии UpDown значение Edit передавалось в progressBar.Position.
Как правильно объявить событие в классе?


 
Медвежонок Пятачок ©   (2010-02-03 12:04) [1]

событие - это свойство. и оно у тебя уже есть. это свойство апдауна.
тебе нужен обработчик (значение этого свойства)

хотя это и неправильно идеологически.
события - они для пользователей класса а не для разработчиков класса.


 
oleg1963lora   (2010-02-04 10:32) [2]


> хотя это и неправильно идеологически.
> события - они для пользователей класса а не для разработчиков
> класса.

С этим я согласен, но как же мне с этим быть? Я хочу иметь "черный ящик" с указанием координат и двух входных свойств (Как в электронике: сигнал на входе, другой на  выходе, а что там внутри-не ваше дело).


 
Медвежонок Пятачок ©   (2010-02-04 10:33) [3]

в чем вопрос-то?


 
Anatoly Podgoretsky ©   (2010-02-04 11:07) [4]


> Как правильно объявить событие в классе?

property OnMyClick: OnMyEvent ....


 
oleg1963lora   (2010-02-04 14:09) [5]

<
> Anatoly Podgoretsky ©   (04.02.10 11:07) [4]
>
> property OnMyClick: OnMyEvent ....

Видно я задал некорректный вопрос. Имется входной параметр целого типа,  на основании этого параметра, передается в ProgressBar.Position и Edit+UpDown. Нажимая кнопки Updown"a я изменяю значение которое получил на входе, а как передать значение из Edit.Text Position. По нажатию кнопки. Пишу обработчик:

procedure TComponent.UpDownClick(Sender:TObject);
begin
    ProgressBar.Position:=StrToInt(Edit.Text);
end;

Далее для события UpDown

    UpDown.OnClick:=....?

ЧТО? Как кнопке присвоить адрес обработчика?
У меня есть подозрение, что мне не хватает каких-то базовых понятий.


 
Anatoly Podgoretsky ©   (2010-02-04 14:23) [6]

> oleg1963lora  (04.02.2010 14:09:05)  [5]

Присвоить кнопки адрес обработчика очень просто.

   UpDown.OnClick := имя обработчика без параметров.


 
oleg1963lora   (2010-02-04 15:58) [7]

 protected
   procedure MyUpDownClick;
   ...................................
   ...................................
procedure TComponent1.MyUpDownClick;
begin
  ShowMessage("UpDownClick!");
end;

В конструкторе после создания компонентов пишу

1     MyUpDown.OnClick:=MyUpDownClick;
2     TUpDown(Sender).OnClick:=MyUpDownClick;
3     MyUpDown.OnClick:=MethodAddress(MyUpDownClick);
Ни один вариант не работает, хотя 3-й вариант вроде бы должен работать. Что за засада!


 
Сергей М. ©   (2010-02-04 16:02) [8]

protected
 procedure MyUpDownClick(Sender: TObject);


 
Медвежонок Пятачок ©   (2010-02-04 16:10) [9]

лучше так
procedure MyUpDownClick(Sender: TObject; Button: TUDBtnType);


 
oleg1963lora   (2010-02-04 16:15) [10]

вариант
procedure MyUpDownClick(Sender:TObject);
MyUpDown.OnClick:=MyUpDownClick(Sender);
тоже ничего не дает (((
Какие еще предложения?


 
Медвежонок Пятачок ©   (2010-02-04 16:16) [11]

Какие еще предложения?

есть предложение включить моск.


 
oleg1963lora   (2010-02-04 16:33) [12]


> Медвежонок Пятачок

Я понимаю, что задолбал вю эху. А у мозга главный рубильник скоро выключится - термопары уже горят ровным строем.:))


 
Сергей М. ©   (2010-02-04 16:48) [13]

В строке

MyUpDown.OnClick:= ИмяМетодаОбработчикаСобытия;

свойству OnClick объекта MyUpDown должно быть присвоено некое значение, равное ИмяМетодаОбработчикаСобытия

Вопрос к рубильнику:  а что вместо этого ты пытаешься ему скормить ?


 
Медвежонок Пятачок ©   (2010-02-04 17:10) [14]

все это конечно здорово, если бы не грабли которые уже лежат здесь в большом количестве.

напишешь ты свой чудо компонент.
в конструкторе повесишь на клик свой обработчик.
замечательно.
появляется другой программист, который будет пользоваться этим компонентом.
он его кидает на форму, дважды тыкает на спинэдит и попадает в новый пустой обработчик-метод который иде создаст в классе формы.
и привет твоей задумке.
при клике по спину будет работать обработчик, который ничего не знает про прогрессбар.


 
Юрий Зотов ©   (2010-02-04 19:15) [15]

> Медвежонок Пятачок ©   (04.02.10 17:10) [14]
Не-а.

> автор
Создайте фрейм и зарегистрируйте его, как компонент. Будет то же самое, но намного проще.


 
Ганя   (2010-02-04 19:32) [16]


> Медвежонок Пятачок ©   (04.02.10 17:10) [14]


> появляется другой программист, который будет пользоваться этим компонентом.


Учитывая приведенный код, весьма сомнительно. Так что  с этой стороны все в порядке)


 
Медвежонок Пятачок ©   (2010-02-04 21:10) [17]

"Другого" программиста даже не требуется.
Он сам однажды ткнет случайно в этот спин эдит и обработчик заточенный на прогрессбар слетит.


 
Плохиш ©   (2010-02-04 21:29) [18]


> oleg1963lora   (04.02.10 14:09) [5]


> У меня есть подозрение, что мне не хватает каких-то базовых
> понятий.

Только подозрение?
Это, что, прикол такой?


 
oleg1963lora   (2010-02-05 09:04) [19]


> Медвежонок Пятачок ©   (04.02.10 17:10) [14]
>
> появляется другой программист, который будет пользоваться
> этим компонентом.

Поясню на примере холодильника. У него нет даже выключателя! Только вилка. Воткнул - холодит, выдернул -... В моем случае мне нужен компонент имеющий на входе:
1. Координаты лев.верх. угла
2. Два входных параметра - опорный уровень и разброс параметра(в процентах);
На выходе  : выходной уровень.
Изменения полученных на входе параметров-в "черном ящике"(понятие радиотехники).


 
oleg1963lora   (2010-02-05 09:22) [20]

Сделал как посоветовали.

private
procedure ModLevelClick(Sender: TObject; Button: TUDBtnType);

constructor TComponent1.Create(AOwner: TComponent);
begin
 inherited;
    ModLevel:= TUpDown.Create(Self);
    ModLevel.OnClick:=ModLevelClick;
end;

procedure TComponent1.ModLevelClick(Sender: TObject; Button: TUDBtnType);
begin
  ShowMessage("UpDownClick!");
end;

Все работает.Почему раньше не получалось - однако утро господа. Вчера у меня точно пробки повылетали:)
Спасибо всем за помощь и терпение.Тему можно закрыть.


 
Сергей М. ©   (2010-02-05 09:24) [21]


> oleg1963lora   (05.02.10 09:04) [19]


> Поясню на примере холодильника


Этим холодильником будешь пользоваться только ты или кто-то другой, кто не ведает о твоих программных выкрутасах в конструкторе со свойствами хомплектующих холодильника ?


 
oleg1963lora   (2010-02-05 11:00) [22]


> Этим холодильником будешь пользоваться только ты

Пока только я, но желание разобраться остается. У меня самокритика не ржавеет, сам понимаю, что мое "творение" далеко от совершенства. Я сам бы задушил такого программера как я, увидь я это со стороны, но как улучшить пока не знаю. Желание написать лучше не ржавеет!:)


 
Медвежонок Пятачок ©   (2010-02-05 11:06) [23]

но как улучшить пока не знаю

TCustomUpDown = class(TWinControl)
...
procedure Click(Button: TUDBtnType); reintroduce; dynamic;
...

Вместо TUPDown пишем класс TMyUPDown в котором переопределяем виртуальный Click

в переопределенном клик сначала вошкаемся с прогрессбаром, затем вызываем унаследованный клик.
или наоборот.
сначала вызываем, затем вошкаемся с прогрессбаром.


 
oleg1963lora   (2010-02-05 11:47) [24]


> Медвежонок Пятачок ©   (05.02.10 11:06) [23]


> procedure Click(Button: TUDBtnType); reintroduce; dynamic;

Понял, не дурак.Буду переделывать. Спасибо


 
Сергей М. ©   (2010-02-05 11:52) [25]


> oleg1963lora   (05.02.10 11:47) [24]


+ к Медвежонок Пятачок ©   (05.02.10 11:06) [23]

Либо TFrame, о котором говорили большевики в [15]



Страницы: 1 вся ветка

Текущий архив: 2010.04.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
15-1263331825
Юрий
2010-01-13 00:30
2010.04.04
С днем рождения ! 13 января 2010 среда


2-1265023414
И. Павел
2010-02-01 14:23
2010.04.04
Как поменять столбцы местами?


15-1262483235
Германн
2010-01-03 04:47
2010.04.04
OnTimer или где?


2-1265019868
Unior
2010-02-01 13:24
2010.04.04
Как открыть запароленный *.mdb в Access?


11-1214986969
Nikfel
2008-07-02 12:22
2010.04.04
Как работать с компонентом TKolSAComboBoxEx.