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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.033 c
14-1093243248
Frolov Alexey
2004-08-23 10:40
2004.09.12
Просветите насчет железок для организации RAID дома


1-1093919119
race1
2004-08-31 06:25
2004.09.12
TLabel


1-1093518032
HydraMarat
2004-08-26 15:00
2004.09.12
Вставка строки в PChar


1-1092845927
Maxim____
2004-08-18 20:18
2004.09.12
RTE 204


14-1093101697
bender
2004-08-21 19:21
2004.09.12
Програмирование LPT порта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский