Форум: "Основная";
Текущий архив: 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.039 c