Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Вниз

Методы вне класса   Найти похожие ветки 

 
DieHard   (2003-08-20 15:44) [0]

Можно ли и, если можно, то как, объявить метод вне всякого класса. Вопрос возник из следующей задачи. Нужно, к примеру, назначить обработчики OnClick для кучи кнопок. Допустим, они выполняют одинаковые дейсвия. Естественно, можно назначить им всем соответствующий метод некоего объекта. А если нет объекта, доступного всем кнопкам? Конечно, можно его выдумать, вопрос в том, можно ли этого избежать.


 
KSergey   (2003-08-20 15:45) [1]

Странен ваш вопрос ;)
"Метод вне класса" есть функция. Или процедура. Вот и ответ.


 
pasha_golub   (2003-08-20 15:50) [2]

2KSergey
Не, чтобы быть обработчиком события надо быть методом класса, то есть procedure (Sender: TObject) of object;
2DieHard
Поконкретней, плз


 
Palladin   (2003-08-20 15:51) [3]

Ему надоть чтоб обрабтчик можно было назначить. В принципе наверно можно обмануть компилятор, хотя лень пробовать.


 
pasha_golub   (2003-08-20 15:56) [4]

Дык, сделай их методами формы и все, а всем твоим кнопкам напиши

Смотри, это?

type
TForm1 = class(TForm)
...
OnMyClick(Sender: TObject); //это твой метод, опиши его
...
end;

implementation

...
MyButton1.OnClick := OnMyClick;
MyButton2.OnClick := OnMyClick;
и т.д.
...


 
panov   (2003-08-20 15:56) [5]

A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the reserved word class. For example,

type

TFigure = class
public
class function Supports(Operation: string): Boolean; virtual;
class procedure GetInfo(var Info: TFigureInfo); virtual;
...
end;


The defining declaration of a class method must also begin with class. For example,

class procedure TFigure.GetInfo(var Info: TFigureInfo);

begin
...
end;


In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use Self to access fields, properties, and normal (object) methods, but you can use it to call constructors and other class methods.
A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.


 
KSergey   (2003-08-20 16:00) [6]

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


 
pasha_golub   (2003-08-20 16:00) [7]

2panov
Угу, и это тоже, только мне кажется для его кнопок это не то, ИМХО


 
ZrenBy   (2003-08-20 16:00) [8]

GrayWolf (14.01.03 09:19)

А что вы скажете на такой код (откопал в одном из форумов)?

procedure DoOnClick(AFake: TObject; Sender: TObject);
begin
ShowMessage(Sender.ClassName);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
LHandler: TNotifyEvent;
P: Pointer;
begin
P := @DoOnClick;
Move(P, LHandler, SizeOf(Pointer));

Button1.OnClick := LHandler;
end;


 
pasha_golub   (2003-08-20 16:03) [9]

Это то про что говорил Palladin, но это же геморрой, ИМХО


 
KSergey   (2003-08-20 16:08) [10]

> ZrenBy © (20.08.03 16:00)

Ух ты, работает!

Вот только не завидую я тому, кто будет потом в этих наворотах разбираться... ;)


 
Skier   (2003-08-20 16:09) [11]

>ZrenBy © (20.08.03 16:00) [8]
Как вариант - интересно !
Но думаю что без особой надобности им пользоваться не следует...
Лучше играть по правилам.


 
Palladin   (2003-08-20 16:11) [12]


> Лучше играть по правилам.

Угу, эт точно.


 
KSergey   (2003-08-20 16:13) [13]

Интересно, не дает обратиться к AFake, AV выкидывает... Я думал- там форма передастся...


 
Palladin   (2003-08-20 16:23) [14]

move не обязательно

procedure TForm1.FormCreate(Sender: TObject);
var
P: Pointer;
LHandler: TNotifyEvent absolute p;
begin
P := @DoOnClick;
Button1.OnClick := LHandler;
end;


> Интересно, не дает обратиться к AFake, AV выкидывает...
> Я думал- там форма передастся...

А кто ее передаст то?


 
pasha_golub   (2003-08-20 16:26) [15]

2Palladin
Xм, странно, а я думал на локальные переменные абсолют не действует, а оказалось можно. Видно перепутал с чем-то :-(


 
KSergey   (2003-08-20 16:31) [16]

Palladin © (20.08.03 16:23)
> Интересно, не дает обратиться к AFake, AV выкидывает...
> Я думал- там форма передастся...

А кто ее передаст то?


Да вот и я думаю - кто? Но компилятор же строит вызов, чего-то он туды пихает?
Впрочем мне видимо пора книжки внимательнее перечитать.


 
DieHard   (2003-08-20 16:41) [17]

Ладно, спасибо.
Мне просто казалось, что я когда-то такое делал. Скорее всего, померещилось :)


 
reonid   (2003-08-20 16:43) [18]

>KSergey © (20.08.03 16:31) [16]
>Но компилятор же строит вызов, чего-то он туды пихает?

Несомненно, пихает.
Мусор пихает, поскольку поле
TMethod(LHandler).Data не было инициализировано.

procedure TForm1.FormCreate(Sender: TObject);
var
LHandler: TNotifyEvent;
begin
TMethod(LHandler).Code := @DoOnClick;
TMethod(LHandler).Data := Self; // Вот что компилятор положит в AFake

Button1.OnClick := LHandler;
end;


 
KSergey   (2003-08-20 16:55) [19]

reonid © (20.08.03 16:43)

Спасибо!



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

Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
9-10536
Gritzan
2002-12-09 23:41
2003.09.04
Построить сферу на OpenGl вручную. не используя glu-товской библе


4-11013
Nick Denry
2003-07-05 20:49
2003.09.04
9x и wm_devicechange. в SDK написано -нет такой мессаги в 9x


3-10590
chimbion
2003-08-14 11:46
2003.09.04
Проблема с BDE+MSSQL


11-10661
Ал
2002-12-26 09:22
2003.09.04
Глюк KOLForm?


1-10740
Valeris
2003-08-19 16:23
2003.09.04
Текстовое поле для ввода айпишника???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский