Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2011, 22:37   #11
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

ваш класс TSimple не совсем верный

давайте возмем то что уже есть например TLabel

и включим в него пользовательскую процедуру и поставим ее на событие OnClick

Код:
TLabel2 = class(TLabel);
  TLabel = class(TLabel2)
    constructor Create(own: TComponent); override;
    procedure f1(Sender: TObject);
  end;

 {...}
 
constructor TLabel.Create(own: TComponent);
begin
  inherited Create(own);
  OnClick:=f1;
end;

procedure TLabel.f1(Sender: TObject);
begin
  ShowMessage('нажатие процедура F1');
end;
помимо обычного конструктора который изменяет класс "автоматичеки" при создании,
также можно написать отдельный метод, в ходе вызова котрого будет изменение событий и свойств класса

пример
Lesha вне форума Ответить с цитированием
Старый 24.08.2011, 16:08   #12
minamoto
Пользователь
 
Регистрация: 11.07.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Вы скриптовый язык с компилируемым не путайте. А то небо к земле притянете ещё чего доброго.
Я не путаю, я хочу к этому прийти, точнее научить свой класс хотя бы примерно так же работать.
minamoto вне форума Ответить с цитированием
Старый 24.08.2011, 17:25   #13
minamoto
Пользователь
 
Регистрация: 11.07.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Lesha Посмотреть сообщение
ваш класс TSimple не совсем верный

давайте возмем то что уже есть например TLabel

и включим в него пользовательскую процедуру и поставим ее на событие OnClick

Код:
TLabel2 = class(TLabel);
  TLabel = class(TLabel2)
    constructor Create(own: TComponent); override;
    procedure f1(Sender: TObject);
  end;

 {...}
 
constructor TLabel.Create(own: TComponent);
begin
  inherited Create(own);
  OnClick:=f1;
end;

procedure TLabel.f1(Sender: TObject);
begin
  ShowMessage('нажатие процедура F1');
end;
помимо обычного конструктора который изменяет класс "автоматичеки" при создании,
также можно написать отдельный метод, в ходе вызова котрого будет изменение событий и свойств класса

пример
Если я рправильно понял, то функцию f1 обязательно надо вставлять в класс, что не есть хорошо. Я от эхтого наобонрот хочу уйти.
minamoto вне форума Ответить с цитированием
Старый 24.08.2011, 17:28   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

помоему вам достаточно обычной событийной модели(какая есть у компонентов, обработчики событий)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2011, 22:12   #15
minamoto
Пользователь
 
Регистрация: 11.07.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
помоему вам достаточно обычной событийной модели(какая есть у компонентов, обработчики событий)
Это я знаю, а как увидеть поля вызвавшего в исполняемой функции, только аргументом?
minamoto вне форума Ответить с цитированием
Старый 25.08.2011, 07:54   #16
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

У Вас даже в примере прописано
Цитата:
Код:
function f3(){trace(this.name)}
, т.е. Вы передаёте "This" вот и получается, что надо передавать параметром(аргументом, как Вы сказали), выше mss привёл, как надо сделать. Если хочется ещё заколбасить посильнее, то гуглите "делегирование в дельфи" - можно будет написать класс-носитель классовых методов и в другие классы для обработки разного действа подставлять этих делегатов.
phomm вне форума Ответить с цитированием
Старый 25.08.2011, 12:51   #17
minamoto
Пользователь
 
Регистрация: 11.07.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
У Вас даже в примере прописано , т.е. Вы передаёте "This" вот и получается, что надо передавать параметром(аргументом, как Вы сказали), выше mss привёл, как надо сделать. Если хочется ещё заколбасить посильнее, то гуглите "делегирование в дельфи" - можно будет написать класс-носитель классовых методов и в другие классы для обработки разного действа подставлять этих делегатов.
Хорошо, изучу делегирование. Я уже сделал свой велосипед по вашим примерам. Почти так как я хотел. Спасибо вам огромное.

На счет примера, я никуда ничего не передаю. Trace(this.name) это вывод на экран сообщения. trace() - это зарезервированная функция вывода actionsript. this = self, когда создаешь объект. Только вот this в actionscript всегда присутствует в созданном объекте, а в дельфи self пропадает в других функциях текущего класса.

смысл функции f3 в том, что она видит свойства объекта. А в дельфи так сразу не получится сделать.
minamoto вне форума Ответить с цитированием
Старый 25.08.2011, 12:57   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а в дельфи self пропадает в других функциях текущего класса.
повторяю еще раз, кликните двойным по форме, и в обработчике появившемсся введите Self.
надеюсь это не сюрприз для вас.
имеем:
Self->объект, который зарегистрироваллся на событие
Sender->объект, который вызвал событие.
в Делфи просто принято иначе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 13:55   #19
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

а не проще ли разобрать Борландовские исходники и посмотреть, как там реализуется присвоение обработчика, например событию кнопки OnMouseDown? Там же куча параметров передается!
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 13:57   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Там же куча параметров передается!
какая куча?
function of object;
состоит из двух частей, указателя Self, и указателя Func.
и все.

тем более это поддерживается компилятором.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как привязать DLL Mrbober Visual C++ 1 25.04.2011 13:49
Как из класса B обратиться к классу A, владеющему классом B? Ferrum26 Общие вопросы Delphi 14 24.06.2010 09:46
Как узнать какому классу принадлежит объект? boris-blade Общие вопросы .NET 3 08.04.2010 01:08
как привязать время? Alexi Компоненты Delphi 2 12.04.2009 22:32
Как через свич раздать по классу Инет soktahan Свободное общение 4 16.11.2008 10:54