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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2011, 11:11   #1
minamoto
Пользователь
 
Регистрация: 11.07.2011
Сообщений: 20
По умолчанию Как привязать функцию к классу?

Всем привет!

есть класс например

Код:
type
TSimple = class
name : String;
onPress : Function;
end;

function f1:String;

я хочу к этому классу подключить стороннюю функцию f1

если я делаю вот так:
Код:

var Simple : TSimple;
begin

  Simple := Tsimple.Create;
  Simple.name = 'simple';
  Simple.onPress = f1;

end;

function f1:String;
begin

Form1.Memo1.Lines.Add(name);

end;
то понятно, что в таком случае внутреннему методу onPress передается ссылка на внешний метод f1 и я не смогу увидеть свойство name класса Simple в этой функции.


Подскажите пожалуйста, как сделать, что бы можно было работать со свойствами в сторонней функции?

Просто планируется сделать универсальный класс, к которому будут подключаться различные функции с разными задачами. Пихать все функции в такой класс не выход, тут сразу отпадает вся универсальность.
minamoto вне форума Ответить с цитированием
Старый 21.08.2011, 13:29   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Функции, которые в том же модуле, что и класс, могут обращаться к private и protected полям.

Последний раз редактировалось Somebody; 21.08.2011 в 14:01. Причина: очепятка
Somebody вне форума Ответить с цитированием
Старый 21.08.2011, 13:43   #3
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

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

А делается это так:

Код:

type
TSomeFunction = function(Sender: TObject): String;

TSimple = class
name : String;
onPress : TSomeFunction;
end;

function f1(Sender: TObject): String;

var Simple : TSimple;
begin

  Simple := Tsimple.Create;
  Simple.name = 'simple';
  Simple.onPress = @f1;

end;

function f1(Sender: TObject):String;
begin
  Form1.Memo1.Lines.Add(Tsimple(Sender).name);
end;
mss вне форума Ответить с цитированием
Старый 21.08.2011, 13:47   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Tsimple(Sender).name);
а почему бы Sender'ом не сделать сразу TSimple?

ТС, вообще помоему стоит перепроектировать подход.
может вам наследование применить?(как пример TStream=>TMemoryStream,TStringStrea m,TFileStream,TSocketStream, итог, тут и абстракция, и возможность изменять функционал(ибо есть еще ZlibCompressionStream,ZlibDecompres sionStream)без проблем(интерфейс к классу то тот же))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.08.2011 в 13:53.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.08.2011, 15:04   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
почему бы Sender'ом не сделать сразу TSimple?
Потому что сегодня у ТС сендером выступает TSimple, а завтра ему приспичит из любого иного объекта любого иного класса вызывать эту самую f1)
А кода с TSimple-сендером он уже наплодил выше крыши).. И что, все теперь переделывать ?)
В Борланд, небось, тоже не дураки работали, коrда VCL и иже с ней писалась, а там на каждом шагу сендером выступает TObject)
mss вне форума Ответить с цитированием
Старый 21.08.2011, 15:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
тоже не дураки работали
порою в этом сомневаюсь.

да и там у них универсальный тип функции, а свой то можно и так сделать.
хотя тут ТС решать, так как TObject дает чуть больше универсальности.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.08.2011, 15:17   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Вот если вся иерархия пользовательских классов в приложени у ТС будет расти от TSimple-класса - вот тогда TSimple-сендер будет оправдан.
mss вне форума Ответить с цитированием
Старый 21.08.2011, 16:16   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

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

Если быть точнее. То есть такой язык программирования как ActionScript2.
Там сделано так, что любой созданный мувиклип имеет встроенные обработчики событий. К этим обработчикам событий можно прикреплять любые функции на выполнение.

Простой пример из ActionScript:
Код:

function f1(){trace(this.name)}
function f2(){trace(this.name)}
function f3(){trace(this.name)}

var button1 = _root.attachMovie('button','button1',1);
     button1.name = 'Я кнопка 1';
     button1.onPress = f1

var button2 = _root.attachMovie('button','button2',2);
     button2.name = 'Я кнопка 2';
     button2.onPress = f2;

var button3 = _root.attachMovie('button','button3',3);
     button3.name = 'Я кнопка 3';
     button3.onPress = f3;
Подскажите, как сделать подобно этому ^
В данном случае movieClip-ам button1,button2,button3 определяется обработчик событий на нажатие мышки onPress, а функция на выполнение f1,f2,f3 соответственно.

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

Мне нравится этот язык своей простотой, поэтому я стремлюсь дельфи приблизить к нему. Что бы без граблей подключать любые свойства и методы к определенному классу или хотя бы к Button, так же легко, как это сделано в actionscript.

Моя цель сделать отдельные компонент Unit, что бы подцеплять к своим работам как надстройку.

Последний раз редактировалось minamoto; 21.08.2011 в 18:10.
minamoto вне форума Ответить с цитированием
Старый 21.08.2011, 20:00   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вы скриптовый язык с компилируемым не путайте. А то небо к земле притянете ещё чего доброго.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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