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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 938

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

Доброго времени суток, уважаемые эксперты!
Вопрос вот какой, создаю динамический массив компонентов и пытаюсь присвоить событию этих компонентов обработчик. В инете пишут что нужно чтобы процедура была методом класса, а не а не регулярной процедурой иначе будет (Incompatible types: 'method pointer and regular procedure'). И описывают в общих чертах что нужно создать пустой класс и прописать свою процедуру в методах и будет работать. Я вот пытаюсь сделать и не получается(( Подскажите пожалуйста, а еще лучше покажите как надо делать чтоб работало.
Использую Delphi 7 если это имеет значение.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. ScrollBox1: TScrollBox;
  13. procedure Button1Click(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19. type
  20. TnRC = class
  21. procedure PrClick(Sender: TObject);
  22. end;
  23. var
  24. Form1: TForm1;
  25. RC: TnRC;
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TnRC.PrClick(Sender: TObject);
  31. begin
  32.  
  33. end;
  34.  
  35. procedure TForm1.Button1Click(Sender: TObject);
  36. var
  37. labpra:array of TLabel;
  38. i:integer;
  39. begin
  40. SetLength(labpra,10);
  41. for i:= low(labpra) to high(labpra) do begin
  42. labpra[i]:= TLabel.Create(nil);
  43. labpra[i].AutoSize:=false;
  44. labpra[i].Font.Size:=10;
  45. labpra[i].Width:=180;
  46. labpra[i].Height:=20;
  47. labpra[i].Left:=0;
  48. labpra[i].Top:=labpra[i].Height*i;
  49. labpra[i].Tag:=i;
  50. labpra[i].Caption:=inttostr(i);
  51.  
  52. ScrollBox1.InsertControl(labpra[i])
  53. end;
  54. end;
  55. end.


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

Вопрос задал: Pest (статус: Посетитель)
Вопрос отправлен: 8 февраля 2012, 17:34
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Pest!
Не нужно создавать пустых классов и тому подобное. В своем коде найдите слово "private". Строкой выше вставьте новую строку

    procedure Button1Click(Sender: TObject);
    procedure MyButtonClick(Sender: TObject); // <<<< это она
  private
    { Private declarations }
Теперь жмем Ctrl+Shift+C и делфи создаст тело обработчика. Туда можно писать свой код.

Ну а в labpra[i].OnClick:= дописываем MyButtonClick; и готово.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 февраля 2012, 17:46
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: DNK

Здравствуйте, Pest!
Сгодится метод любого класса, в том числе и формы. Отмечу в чем ошибка, нужно указать не только сам метод, но и какому объекту он пренадлежит.

labpra[i].OnClick:=RC.PrClick;

"Напрямую" присваивать метод можно только внутри другого метода этого же класса. И нужно позаботится о создании и уничтожении этого объекта.

procedure TForm1.FormCreate(Sender: TObject);
begin
  RC := TnRC.Create;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  RC.Free;
end;

Ответ отправил: DNK (статус: Студент)
Время отправки: 8 февраля 2012, 18:15
Оценка за ответ: 4


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

Всего сообщений: 5; последнее сообщение — 9 февраля 2012, 19:34; участников в обсуждении: 2.
Pest

Pest (статус: Посетитель), 8 февраля 2012, 18:20 [#1]:

Вадим К
выдает (Undeclared identiffer:'MyButtonClick')
Pest

Pest (статус: Посетитель), 8 февраля 2012, 18:46 [#2]:

Вроде разобрался всем спасибо

8 февраля 2012, 18:47: Статус вопроса изменён на решённый (изменил автор вопроса — Pest)

Вадим К

Вадим К (статус: Академик), 8 февраля 2012, 18:54 [#3]:

Раз выдает, значит последовательность не верно выполнена.
4 поставили за то, что не смогли разобраться по простой инструкции?:)
Галочка "подтверждения прочтения" - вселенское зло.
Pest

Pest (статус: Посетитель), 9 февраля 2012, 02:36 [#4]:

Вадим К
4 поставил по тому что разобрался)))

9 февраля 2012, 13:10: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Вадим К

Вадим К (статус: Академик), 9 февраля 2012, 19:34 [#5]:

Ничего не понятно в комментарии...
Галочка "подтверждения прочтения" - вселенское зло.

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

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