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

Вниз

обработчик для динамически созданного компонента   Найти похожие ветки 

 
aser   (2003-11-05 13:58) [0]

привет всем. помогите разобраться.
есть mainForm, для ее onCreate делаю процедуру, в которой создется динамически формочка с edit и button для ввода пароля.

keyForm := TForm.Create(Application);
with keyForm do
begin
BorderStyle := bsDialog;
Position := poScreenCenter;
Width := 180;
Height := 80;
Caption := "Пароль:";
end;

keyEdit := TEdit.Create(self);
with keyEdit do
begin
Parent := keyForm;
Left := 10;
Top := 10;
end;

keyBtn := TButton.Create(self);
with keyBtn do
begin
Parent := keyForm;
Width := 20;
Left := 140;
Top := 10;
Caption := "ok";
// onClick :=
end;

как правильно прицепить на onClick кнопки свою процедуру для обработки ввода ??? Если отдельно обьявляю допустим procedure test и onClick := test; говорит несовместимые типы...


 
ZEE   (2003-11-05 14:00) [1]

объявляй procedure test(Sender: TObject);


 
KSergey   (2003-11-05 14:00) [2]

http://www.delphikingdom.com/helloworld/runtime_comp.htm

И все статьи из

http://www.delphikingdom.com/asp/section.asp?ID=16

к обязательному прочтению!!!!


 
aser   (2003-11-05 15:11) [3]

Sender ведь нужен только для методов, а по идее отдельной процедуре не нужОн...
иду статьи читать...


 
KSergey   (2003-11-05 15:13) [4]

Процедуре вообще - не нужон.
Однако обработчик может быть только определенного вида (типа).


 
ZEE   (2003-11-05 15:18) [5]


> aser (05.11.03 15:11) [3]
> Sender ведь нужен только для методов, а по идее отдельной
> процедуре не нужОн...

дык OnClick - эт ж метод формы...


 
KSergey   (2003-11-05 15:22) [6]

[5] ZEE © (05.11.03 15:18)
дык OnClick - эт ж метод формы...


Вовсе не обязательно формы. Однако обязательно метод объекта - это да. Причем определенным образом оформленный.

Впрочем, думаю товарисч все это ужо прочитал.


 
ZEE   (2003-11-05 15:27) [7]


> KSergey © (05.11.03 15:22) [6]
> Вовсе не обязательно формы. Однако обязательно метод объекта
> - это да. Причем определенным образом оформленный.

да, пардон, в этом случае метод не формы, а кнопки...


 
aser   (2003-11-05 17:05) [8]


> определенным образом оформленный.


прочитал, пошло... спасибо. но ...
обьявляю как в примере в private: procedure OnClickButton(Sender:Tobject);
описую в implementation
procedure TmainForm.OnClickButton(Sender:Tobject);
это как я понимаю метод формы - работает, TButton.OnClickButton(Sender:Tobject) не работает... пожалуйста еще пару слов на тему...


 
KSergey   (2003-11-06 07:54) [9]

> [7] ZEE © (05.11.03 15:27)
>
> > KSergey © (05.11.03 15:22) [6]
> > Вовсе не обязательно формы. Однако обязательно метод объекта
>
> > - это да. Причем определенным образом оформленный.
>
> да, пардон, в этом случае метод не формы, а кнопки...

Да почему кнопки?!! Хоть и формы. Хоть и любого другого объекта!

> TButton.OnClickButton(Sender:Tobject) не работает... пожалуйста
> еще пару слов на тему...

Что значит не работает? Как именно и что описывается? Ничего не понимаю.

Есть правда нездоровое подозрение, что пытаетесь написать где-то в коде

TButton.OnClickButton(Sender:Tobject);
begin
..
end;

Но это же сущий бред! Вы можете опеределять только методы своих классов (в данном случае TmainForm - ваш класс (наследник TForm). Изменить же TButton вы не в силах по определению, а вот пронаследовать и что-то иземенить в наследнике - сколько угодно (я не рассматриваю всякие там хитрости).


 
Юрий Зотов   (2003-11-06 08:08) [10]

> aser (05.11.03 17:05) [8]

Вам нужно написать метод ФОРМЫ, который будет обрабатывать событие КНОПКИ.

Когда у любого компонента происходит любое событие, он просто вызывает прицепленный к этому событию метод (если таковой имеется). Согласно принятому в Delphi механизму вызова, это должен быть ОБЯЗАТЕЛЬНО метод ОБЪЕКТА, а не просто процедура. Причем это может быть метод ЛЮБОГО обьекта, хоть формы, хоть еще какого угодно. Но раз уж мы в своей программе все равно должны написать класс формы, на которой лежит этот компонент, то самое простое - прицепить к его событию метод этой же самой формы. Что и делает Delphi, когда мы в Инспекторе Объектов дважды щелкаем по событию - но никто не запрещает нам сделать то же самое и вручную, в нашем коде.


 
aser   (2003-11-06 14:40) [11]

вроде доходит... значит, если правильно понимаю, делается так:

1. Создаем класс формы
в разделе type:
keyForm = class(TForm)
keyBtn: tButton;
kyEdit: tEdit;
procedure OnClickButton(Sender: Tobject);
end;

2. описываем метод для типа keyFrom:
в implementation:
procedure TkeyForm.OnClickButton(Sender:Tobject);
begin
...
...
end;

Дальше создаем форму и назначаем для onClick кнопки метод формы - OnClickButton.
Но тут у меня снова упс - когда создается форма
keyForm := TkeyForm.Create(Application) - ругается:

Project mytmpl.exe raised exception class EResNotFound with message "Resource TkeyForm not found". Process stopped. Use Step or Run to continue.
хелп...
или, если достал, - бросьте рабочий пример какой-нибудь попроще (форма+кнопка)...


 
KSergey   (2003-11-06 17:26) [12]

Ну дык нельзя просто так вот взять и состряпать класс от TForm и создавать его экземпляр. Надо строить формы в дизайнере.
Ну т.е. можно, конечно, но тогда не забывать, что дизайнер создает еще и ресурс для формы ("комментарий" {R *.res} (ну что-то такое, возможно ошибаюсь на память) в коде формы - это не просто так загибулина).


 
aser   (2003-11-10 19:21) [13]

вроде когда директиву отключал, ту же ошибку давало.
мне уже интересно просто. развиваю вопрос... :)
стряпаю класс кнопки.

type
tkeyBtn = class(tButton)
procedure keyBtnClick(Sender: TObject);
end;

implem...

procedure TkeyBtn.keyBtnClick(Sender: TObject);
begin
ShowMessage("asfsdafas");
end;

создаю форму с кнопкой. для кнопки
OnClick := keyBtnClick;

Урра... флаг мне. работает...
А вопрос такой - как передать параметр?
Вот так
procedure keyBtnClick(Sender: TObject, var myStr: string);

OnClick := keyBtnClick(Sender, dev_key);
дает ошибку любимую
[Error] main.pas(164): Incompatible types: "TNotifyEvent" and "procedure, untyped pointer or untyped parameter"
пожалуйста, что еще не так и как надо ?


 
Reindeer Moss Eater   (2003-11-10 19:25) [14]

type
TMyNotifyEvent = procedure(Sender:TObject; AParam : string) of Object;


 
Думкин   (2003-11-10 19:35) [15]

keyForm := TForm.CreateNew(....);

Это если без ресурсов.


 
aser   (2003-11-10 20:07) [16]

2 Reindeer Moss Eater
и что ?



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
1-65906
Serzh
2003-11-08 15:46
2003.11.20
Преобразование ASCII to ANSI


3-65759
Raduga
2003-10-31 09:11
2003.11.20
Тормоза при выборке из базы MSSql Server


3-65715
Kinder
2003-11-01 15:51
2003.11.20
БД без дополнительных компонентов


1-65901
mc_duck
2003-11-08 15:37
2003.11.20
Наследник TComponent.


1-65866
Jack
2003-11-09 14:34
2003.11.20
Возвращаясь к хинтам!





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