Главная страница
    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.52 MB
Время: 0.036 c
1-1093342094
Илья
2004-08-24 14:08
2004.09.12
delphi & palm


3-1092839711
Uran
2004-08-18 18:35
2004.09.12
Проблеммы с кодировкой в файле DB


1-1093518682
mouse_web
2004-08-26 15:11
2004.09.12
Функции string


3-1092710262
Sirus
2004-08-17 06:37
2004.09.12
Соединение с Firebird тормозит на Windows XP...


1-1093507003
an-na2002
2004-08-26 11:56
2004.09.12
Изменение имени файла





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