Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2008, 21:20   #1
tramvajman
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 10
По умолчанию Динамическое создание обработчика события

Создаю динамически форму, на ней кнопки...
Проблема, не могу создать для кнопок события....

Код:
unit NastrUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;

var
  NastrForm: TForm;
  btnOK: TButton;

implementation

procedure Create;
begin
  NastrForm:=TForm.Create(MainForm);
  NastrForm.Width:=300;
  NastrForm.Height:=210;
  NastrForm.Visible:=true;
  NastrForm.BorderStyle:=bsSingle;
  NastrForm.BorderIcons:=[];
  NastrForm.Caption:='Настройка';  
  btnOK:=TButton.Create(NastrForm);
  btnOK.Parent:=NastrForm;
  btnOK.Caption:='Применить';
  btnOK.Width:=75;
  btnOK.Height:=25;
  btnOK.Left:=35;
  btnOK.Top:=140;
  btnOK.OnClick:=????????????????????????????????????????????????
end;
tramvajman вне форума Ответить с цитированием
Старый 19.11.2008, 23:20   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

у TButton OnClick имеет тип (вроде ) TNotifyEvent у него приписка of object ну написано же of object, процедура (Sender: TObject) принадлежащяя объекту... так что.. вам нужен класс где будет описан обработчик procedure OnClick(Sender: TObject); и только потом вы его указываите этой кнопке...

p.s. подобные вещи так писать не рекоммендуется... вы уж определитесь то ли пишите юзая ООП или пишите без ООП
BOBAH13 вне форума Ответить с цитированием
Старый 20.11.2008, 02:09   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Я уже рассказывал простейший способ, как это решить.
1. Бросаете на форму кнопку.
2. Делаете по ней даблклик - открывается пустая процедура обработки клика.
3. Пишете код в этом обработчике.
4. Там, где вы напузырили 40 штук вопросительных знаков - прописываете ссылку на этот обработчик.
5. Убираете с формы теперь уже ненужную кнопку.
Все.
mihali4 вне форума Ответить с цитированием
Старый 24.11.2008, 00:39   #4
tramvajman
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 10
По умолчанию

А если формы нет совсем?
tramvajman вне форума Ответить с цитированием
Старый 24.11.2008, 03:11   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от tramvajman Посмотреть сообщение
А если формы нет совсем?
Тогда сами пишите правильный скелет обработчика, тот самый, который образуется автоматом при даблклике по кнопке на форме.
Собственно то, что я предложил, помогает избежать ошибок в написании именно скелета обработчика любого события.
mihali4 вне форума Ответить с цитированием
Старый 28.12.2008, 13:21   #6
zekx
Новичок
Джуниор
 
Регистрация: 28.12.2008
Сообщений: 1
По умолчанию

Есть форма,
Есть процедура

procedure TForm1.onClick(Sender: TObject);
begin
showmessage('www');
end;

Есть кнопка на форме Button1 по клику делается:

procedure TForm1.Button1Click(Sender: TObject);
var t:tbutton;
begin
t:=tbutton.Create(self);
t.Width:=50;
t.Height:=50;
t.Left:=100;
t.Top:=150;
t.Parent:=form1;
t.Caption:='222';
t.OnClick:=form1.onClick(sender); ВОТ ТУТ ПО ВАШИМ ЗАПИСЯМ ВСЕ ДОЛЖНО РАБОТАТЬ ! А САМИ ПРОБЫВАЛИ?
end;

А ВОТ ЭТО ЧИТАЛИ?
[Error] Unit1.pas(43): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
zekx вне форума Ответить с цитированием
Старый 28.12.2008, 13:36   #7
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

zekx, пишешь глупости и хочешь нормального результата? А написать так, как полагается не пытался? А именно
t.OnClick:=form1.onClick;
Почему делается так, а не иначе объяснять надо или все-таки талмуд почитаешь, прежде чем свое ры людям высказывать?
Баламут вне форума Ответить с цитированием
Старый 19.10.2010, 16:48   #8
Rus59Wolf
Новичок
Джуниор
 
Регистрация: 23.08.2010
Сообщений: 1
По умолчанию

вот вы не поверите но оно таки не работает. причем у "родной" кнопки вызов идет а у "наследника" нет...
with TControlClass(Form1.Panel1.Controls[i].ClassType).Create(self) do
begin
Parent := p;
Left := Form1.Panel1.Controls[i].Left;
Top := Form1.Panel1.Controls[i].Top;
OnClick:=button2.OnClick;
end;
Rus59Wolf вне форума Ответить с цитированием
Старый 20.10.2010, 10:41   #9
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

tramvajman, можно просто объявить класс, создать метод с такими же параметрами, как обработчик события (для OnClick - Sender: TObject), и присвоить этот метод обработчику события
Код:
TNewClass = class (TPersistent)
public
  procedure Proc1(Sender: TObject);
end;
...
var Obj: TNewClass;
...
procedure TNewClass.Proc1(Sender: TObject);
begin
if Sender is TButton then
    ShowMessage(TButton(Sender).Caption);
end;
...
But1.OnClick:=Obj.Proc1;
По сути, TNotifyEvent - это просто указатель, ему можно присвоить любой метод, принимающий TObject
WhiteSpirit вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое создание компонентов DOLBY Компоненты Delphi 10 17.10.2010 14:03
Динамическое создание формы Rifler Общие вопросы Delphi 6 11.09.2008 20:50
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
Динамическое создание фрейма s-force Общие вопросы Delphi 9 05.09.2007 16:56
Динамическое создание WebBrowser DragonLand Работа с сетью в Delphi 2 20.08.2007 21:47