|
Вопрос # 4 518/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Мой вопрос заключается в том что я динамически создаю кнопку на форме, после чего пытаюсь событию кнопки OnClick присвоить значение своей процедуры(чтоб исполнялась моя процедура).
Но к сожалению ничего не получается, я пробывал через указатели, но там надо использовать константы, что само по себе накладывает ограничения на присваивание указателю события, указателя процедуры. Напрямую, компилятор ругается, что разные типы.
Как реализовать пока не понимаю, если ктонибудь знает как пожалуйста помогите.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- procedure FormClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- procedure Mes();
-
- var
- Form1: TForm1;
- MyButton: TButton;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormClick(Sender: TObject);
- begin
- MyButton:=TButton.Create(Self);
- MyButton.Parent:=Form1;
- MyButton.Left:=15;
- MyButton.Top:=15;
-
- end;
-
- procedure Mes();
- Begin
- ShowMessage('Hello');
- End;
-
-
- end.
 |
Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 20 августа 2010, 10:47
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, SOA!
Ну, это же классика жанра.
Решение банальное и классическое.
Во первых, нужно объявлять не процедуру, а метод. Например метод формы
private
procedure Mes(Sender:TObject);
Во вторых, они должны иметь правильную сигнатуру(то есть набор параметров) - что и видно выше.
Реализацию записываем так
procedure TForm1.Mes(Sender:TObject);
begin
showmessage('hello');
end;
Ну и соответственно присваивание
MyButton.OnClick:=Mes;
Замечу, скобки там не нужны, так как мы присваиваем адрес процедуры, а не выполняем ее.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 20 августа 2010, 10:55
Оценка за ответ: 5
Комментарий к оценке: Спасибо
|
Ответ #2. Отвечает эксперт: min@y™
Обработчик события должен быть обязательно методом класса и его параметры должны совпадать с параметрами типа события.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- procedure FormClick(Sender: TObject);
- private
- procedure Mes(Sender: TObject);
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- MyButton: TButton;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormClick(Sender: TObject);
- begin
- MyButton:=TButton.Create(Self);
- MyButton.Parent:=Form1;
- MyButton.Left:=15;
- MyButton.Top:=15;
-
- end;
-
- procedure TForm1.Mes(Sender: TObject);
- Begin
- ShowMessage('Hello');
- End;
-
-
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 августа 2010, 10:59
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 21 августа 2010, 11:14; участников в обсуждении: 3.
|
SOA (статус: Посетитель), 20 августа 2010, 11:01 [#1]:
Unsatisfied forward or external declaration 'TForm1.Mes'
вот такая ошибка вылазит.
|
|
SOA (статус: Посетитель), 20 августа 2010, 11:04 [#2]:
Сорри в первый раз просто procedure TForm1.Mes(Sender: TObject);
неправильно прописал.
|
|
Егор (статус: 10-ый класс), 20 августа 2010, 17:52 [#3]:
мда... это вам не си, где объявляем функцию одной сигнатуры, а потом передаём её адрес туда, где требуется функция совсем другой сигнатуры. и всё компилируется! правда, компилятор чего-то там в варнингах пишет, но до этого никому никакого дела нету - работает же!
вот сейчас как раз такой проект и разгребаю...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 20 августа 2010, 18:26 [#4]:
Цитата (Егор):
это вам не си, где объявляем функцию одной сигнатуры, а потом передаём её адрес туда, где требуется функция совсем другой сигнатуры. и всё
вот только не объязательно работает, может так непредсказуемо падать...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Егор (статус: 10-ый класс), 20 августа 2010, 18:54 [#5]:
о! это да! такие красивые глюки...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
SOA (статус: Посетитель), 20 августа 2010, 21:18 [#6]:
Посоветуйте пожалуйста ктонибудь, если не трудно, какую нибудь хорошую по вашему мнению книжку, или методичку по написанию компонентов delphi, а то я этот вопрос совсем не знаю.
|
|
Вадим К (статус: Академик), 20 августа 2010, 23:21 [#7]:
ищите книгу "Ray Konopka - Developing custom Delphi components"
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SOA (статус: Посетитель), 21 августа 2010, 11:14 [#8]:
Спасибо.
|
31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|