Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 518

/ вопрос решён /

Приветствую, уважаемые эксперты!
Мой вопрос заключается в том что я динамически создаю кнопку на форме, после чего пытаюсь событию кнопки OnClick присвоить значение своей процедуры(чтоб исполнялась моя процедура).
Но к сожалению ничего не получается, я пробывал через указатели, но там надо использовать константы, что само по себе накладывает ограничения на присваивание указателю события, указателя процедуры. Напрямую, компилятор ругается, что разные типы.
Как реализовать пока не понимаю, если ктонибудь знает как пожалуйста помогите.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ExtCtrls, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. procedure FormClick(Sender: TObject);
  12. private
  13. { Private declarations }
  14. public
  15. { Public declarations }
  16. end;
  17.  
  18. procedure Mes();
  19.  
  20. var
  21. Form1: TForm1;
  22. MyButton: TButton;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.FormClick(Sender: TObject);
  29. begin
  30. MyButton:=TButton.Create(Self);
  31. MyButton.Parent:=Form1;
  32. MyButton.Left:=15;
  33. MyButton.Top:=15;
  34.  
  35. end;
  36.  
  37. procedure Mes();
  38. Begin
  39. ShowMessage('Hello');
  40. End;
  41.  
  42.  
  43. end.


SOA Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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™

Обработчик события должен быть обязательно методом класса и его параметры должны совпадать с параметрами типа события.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ExtCtrls, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. procedure FormClick(Sender: TObject);
  12. private
  13. procedure Mes(Sender: TObject);
  14. public
  15. { Public declarations }
  16. end;
  17.  
  18. var
  19. Form1: TForm1;
  20. MyButton: TButton;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. procedure TForm1.FormClick(Sender: TObject);
  27. begin
  28. MyButton:=TButton.Create(Self);
  29. MyButton.Parent:=Form1;
  30. MyButton.Left:=15;
  31. MyButton.Top:=15;
  32.  
  33. end;
  34.  
  35. procedure TForm1.Mes(Sender: TObject);
  36. Begin
  37. ShowMessage('Hello');
  38. End;
  39.  
  40.  
  41. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 августа 2010, 10:59
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 21 августа 2010, 11:14; участников в обсуждении: 3.
SOA

SOA (статус: Посетитель), 20 августа 2010, 11:01 [#1]:

Unsatisfied forward or external declaration 'TForm1.Mes'

вот такая ошибка вылазит.
SOA

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

SOA (статус: Посетитель), 20 августа 2010, 21:18 [#6]:

Посоветуйте пожалуйста ктонибудь, если не трудно, какую нибудь хорошую по вашему мнению книжку, или методичку по написанию компонентов delphi, а то я этот вопрос совсем не знаю.
Вадим К

Вадим К (статус: Академик), 20 августа 2010, 23:21 [#7]:

ищите книгу "Ray Konopka - Developing custom Delphi components"
Галочка "подтверждения прочтения" - вселенское зло.
SOA

SOA (статус: Посетитель), 21 августа 2010, 11:14 [#8]:

Спасибо.

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.