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

Вниз

Как методу класса присвоить процедуру?   Найти похожие ветки 

 
Ega23 ©   (2004-08-30 09:36) [0]

Есть следующий код:
unit AAAA
interface
uses ....

procedure A();

implementation

procedure A();
....
end;


Как мне процедуру A присвоить, например, для Btn.OnClick?


 
TUser ©   (2004-08-30 09:42) [1]

Лучше, чтобы А была методом к-нибудь класса, например TForm1. Тогда просто :=. Если надо именно так, то можно

var ne:TNotifyEvent;
begin
ne:=@A;
OnClick:=ne;
end;

PS. OnClick - это не метод.


 
Ega23 ©   (2004-08-30 09:51) [2]

TUser ©   (30.08.04 09:42) [1]

Дык в том-то и дело, что она не является методом класса. С методом все понятно, а вот как без него?


 
jack128 ©   (2004-08-30 09:54) [3]

Ega23 ©   (30.08.04 9:36)
если очень надо именно ПРОЦЕДУРУ, то

procedure Proc(Self: TObject; Sender: TObject);
begin
...
end;

var
 m: TMethod;
begin
 m.Code := @Proc;
 m.Data := nil;
 Button1.OnClick := TNotifyEvent(m);
end;

Только зачм такой геморой, если метод можно присвоить одной строкой Button1.OnClick := SameObject.MyClickHandler ??


 
Alx2 ©   (2004-08-30 09:55) [4]

"Насильственным" приведением типов. Только не забыть параметр Self учесть еще


 
Ega23 ©   (2004-08-30 09:57) [5]

Только зачм такой геморой, если метод можно присвоить одной строкой Button1.OnClick := SameObject.MyClickHandler ??

Форма динамически создаётся. Что-то типа:

function ShowSQLDebugMessages:Boolean;
var
aForm:TForm;

begin
Result:=False;
try
 Application.CreateForm(TForm, aForm);
 try
  With aForm do
   begin
    Caption:="SQL Transaction Log";
    BorderStyle:=bsDialog;
    Height:=500;
    Width:=750;
    Position:=poScreenCenter;
   end;
  With TMemo.Create(aForm) do
   begin
    Parent:=aForm;
    Align:=alTop;
    Height:=440;
    Clear;
    if FileExists(ExtractFilePath(Application.ExeName)+"SQLLog.log") then
     Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+"SQLLog.log");
   end;
  With TButton.Create(aForm) do
   begin
    Parent:=aForm;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=aForm.ClientHeight-30;
    Left:=aForm.ClientWidth-110;
    Caption:="OK";
    ModalResult:=mrOK;
   end;
  aForm.ShowModal;
 finally
  aForm.Free;
 end;
except on E:Exception do
 raise Exception.Create("ShowSQLDebugMessages "+E.Message);
end;
end;


 
jack128 ©   (2004-08-30 10:00) [6]

Ega23 ©   (30.08.04 9:57) [5]
Форма динамически создаётся. Что-то типа

и что из этого следует?


 
Ega23 ©   (2004-08-30 10:03) [7]

и что из этого следует?

А то, что на button не только ModalResult может быть навешен. При этом описания класса данной формы нет, всё в динакмике создаётся. Вот и хочу присвоить Button.OnClick некоторую процедуру.


 
jack128 ©   (2004-08-30 10:06) [8]

Ega23 ©   (30.08.04 10:03) [7]
нечего не понял. Какая разница, что присваивать метод или процедуру??

> А то, что на button не только ModalResult
причем тут модал результ? Он к OnClick не имеет никакого отнашения..


 
Ega23 ©   (2004-08-30 10:14) [9]

Так, попробую ещё раз. форма генерится динамически, на основании скрипта в БД. Контролы создаются - см.[5]. Есть несколько процедур:
procedure Proc1;
procedure Proc2;
procedure Proc3;
....
procedure ProcN;
В зависимости от значения в БД, для кнопки на OnClick присваиваются разные реакции, описанные в этих процедурах.


 
jack128 ©   (2004-08-30 10:16) [10]

Ega23 ©   (30.08.04 10:14) [9]
что мешает написать класс
TButtonClickHandlers = class
procedure Proc1;
procedure Proc2;
procedure Proc3;
....
procedure ProcN;
end;
и

> В зависимости от значения в БД, для кнопки на OnClick
> присваиваются разные реакции, описанные в этих
>
методах?


 
Ega23 ©   (2004-08-30 10:22) [11]

Класс написать ничего не мешает, вопрос был как раз в том, что можно ли это сделать БЕЗ написания класса.


 
pasha_golub ©   (2004-08-30 11:03) [12]

Ega23 ©   (30.08.04 10:22) [11]
Дык, а зачем? Сделать-то всегда можно, но, ИМХО, вариант jack128 ©    [10] самый оптимальный.


 
Ega23 ©   (2004-08-30 11:09) [13]

То, что он оптимальный, я догадываюсь. Тут уже дело на принцип пошло.


 
GuAV ©   (2004-08-30 11:11) [14]

jack128 ©   (30.08.04 10:16) [10]
+
а ещё можно не создавая экземпляр класса
class procedure Proc1;
да в прочем и так создавать его не обязательно, self то всё равно не нужен :)


 
Skyle ©   (2004-08-30 11:14) [15]


> [13] Ega23 ©   (30.08.04 11:09)

Эх, извращенцы мы все в душе...
procedure DoClick;
begin
 ShowMessage("Test");
end;

procedure TForm1.FormCreate(Sender: TObject);
var M : TMethod;
begin
 M.Code := @DoClick;
 Button1.OnClick := TNotifyEvent(M);
end;


 
Ega23 ©   (2004-08-30 11:15) [16]

О! То что надо!


 
pasha_golub ©   (2004-08-30 11:41) [17]

Ega23 ©   (30.08.04 11:15) [16]
Тебе тоже самое давным-давно сказали. ;0)

см. jack128 ©   (30.08.04 09:54) [3]


 
KSergey ©   (2004-08-30 12:14) [18]

> [16] Ega23 ©   (30.08.04 11:15)
> О! То что надо!

Не удержусь и тоже скажу
Это издевательство?? В свете jack128 ©   (30.08.04 09:54) [3]

А вообще я бы сделал вот как
Написать потомка TForm (не вызуального! просто класс определить!) В него и собрать все потенциально необходимые обработчики, может проверки там какие добавить, методы загрузки контролов из БД и т.п.
Ну и создавать уже экземпляр этого класса.
По-моему, это красивше, чем все эти махинации, и даже чем суррогат [10] jack128


 
Skyle ©   (2004-08-30 12:21) [19]


> [17] pasha_golub ©   (30.08.04 11:41)


> [18] KSergey ©   (30.08.04 12:14)


Блин... Сорри. Как-то пропустил...
Возможно не привык ещё к новой версии клиента.
В общем, я не специально... :-)


 
pasha_golub ©   (2004-08-30 12:34) [20]

Skyle ©   (30.08.04 12:21) [19]
Так, ты это, двуликий шо-ли? ;0)


 
KSergey ©   (2004-08-30 12:57) [21]

> [18] KSergey ©   (30.08.04 12:14)
> Написать потомка TForm (не вызуального! просто класс определить!)
> Ну и создавать уже экземпляр этого класса.

Немного подумав понял, что так не выйдет. Нельзя создать экземпляр формы, для котрой нет соотв. данных в ресурсах (из DFM). Ну тогда просто пустую форму создать, никому не мешает.
Ну либо переопределить метод загрузки содержимого формы при создании и грузить ее из БД - тоже вариант, к стати ;) (если это возможно; я не знаю где)


 
Skyle ©   (2004-08-30 13:04) [22]


> [20] pasha_golub ©   (30.08.04 12:34)

А чё, прикольно наверное отвечать самому себе на форуме..;-)

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

В любом случае, это развлечение чисто из любви к искусству. Нигде не использовал бы это всерьёз. По идеологическим соображениям ;-)


 
Ega23 ©   (2004-08-30 13:42) [23]

Блин, а я на [3] даже как-то внимания не обратил ....


 
Ega23 ©   (2004-08-30 13:44) [24]

Нельзя создать экземпляр формы, для котрой нет соотв. данных в ресурсах (из DFM).

А это почему????


 
KSergey ©   (2004-08-30 14:52) [25]

> [24] Ega23 ©   (30.08.04 13:44)

Так VCL устроена.
При создании формы она ищет соотв ресурс и из него загружает (создает) дочерние объекты.
Однако промежуточными - вполне могут быть и просто классы, без "визуальной" части, но тот класс, экземпляр которого создается, должен быть "визульным" (в exe должен быть соотв. ресурс)

PS
Надеюсь, я никого не обманываю, проверять лень, но что-то такое на памяти осталось.


 
GuAV ©   (2004-08-30 15:10) [26]


> Немного подумав понял, что так не выйдет. Нельзя создать
> экземпляр формы, для котрой нет соотв. данных в ресурсах
> (из DFM)

LOL. А я не думал а делал. Делается.
Более того нормальную форму с dfm создай createnew а не create, дык он её dfm не прочитает из ресурса.


 
KSergey ©   (2004-08-30 15:12) [27]

> [26] GuAV ©   (30.08.04 15:10)

Да, точно. Спасибо.
Ну я же помню, что не все чисто там было ;)


 
Ega23 ©   (2004-08-30 15:18) [28]

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


См. [5] - всё отлично создаётся. Собственно, сабж из-за этого и затевался.  :о)


 
Ega23 ©   (2004-08-30 15:18) [29]

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


См. [5] - всё отлично создаётся. Собственно, сабж из-за этого и затевался.  :о)


 
GuAV ©   (2004-08-30 16:38) [30]


>  что не все чисто там было ;)

Всё чисто. Если нет DFM, форма всё равно будет создана даже Create.



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

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

Наверх




Память: 0.55 MB
Время: 0.05 c
1-1093844218
Ega23
2004-08-30 09:36
2004.09.12
Как методу класса присвоить процедуру?


4-1091128756
parovoZZ
2004-07-29 23:19
2004.09.12
LoadImage


1-1093517056
Луарвик
2004-08-26 14:44
2004.09.12
Типизированые файлы:


1-1093858252
XAdmin
2004-08-30 13:30
2004.09.12
Видимиость пользоваетльского типа из дургого Unit


1-1093340762
shc
2004-08-24 13:46
2004.09.12
где найти TTreeControl