| 
| 
 | Вопрос # 5 938/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Вопрос вот какой, создаю динамический массив компонентов и пытаюсь присвоить событию этих компонентов обработчик. В инете пишут что нужно чтобы процедура была методом класса, а не а не регулярной процедурой иначе будет (Incompatible types: 'method pointer and regular procedure'). И описывают в общих чертах что нужно создать пустой класс и прописать свою процедуру в методах и будет работать. Я вот пытаюсь сделать и не получается(( Подскажите пожалуйста, а еще лучше покажите как надо делать чтоб работало.
 Использую Delphi 7 если это имеет значение.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Button1: TButton;    ScrollBox1: TScrollBox;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; type  TnRC = class  procedure PrClick(Sender: TObject); end;var  Form1: TForm1;  RC: TnRC;implementation {$R *.dfm} procedure TnRC.PrClick(Sender: TObject);begin end; procedure TForm1.Button1Click(Sender: TObject);varlabpra:array of TLabel;i:integer;beginSetLength(labpra,10); for i:= low(labpra) to high(labpra) do begin  labpra[i]:= TLabel.Create(nil);  labpra[i].AutoSize:=false;  labpra[i].Font.Size:=10;  labpra[i].Width:=180;  labpra[i].Height:=20;  labpra[i].Left:=0;  labpra[i].Top:=labpra[i].Height*i;  labpra[i].Tag:=i;  labpra[i].Caption:=inttostr(i);   ScrollBox1.InsertControl(labpra[i]) end;end;end.
|  |   Вопрос задал: 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 (статус: Посетитель), 8 февраля 2012, 18:20 [#1]:Вадим К выдает (Undeclared identiffer:'MyButtonClick')
 |  
|   | Pest (статус: Посетитель), 8 февраля 2012, 18:46 [#2]:Вроде разобрался всем спасибо |  8 февраля 2012, 18:47: Статус вопроса изменён на решённый (изменил автор вопроса — Pest) 
|   | Вадим К (статус: Академик), 8 февраля 2012, 18:54 [#3]:Раз выдает, значит последовательность не верно выполнена. 4 поставили за то, что не смогли разобраться по простой инструкции?
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Pest (статус: Посетитель), 9 февраля 2012, 02:36 [#4]:Вадим К 4 поставил по тому что разобрался)))
 |  9 февраля 2012, 13:10: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А. 
|   | Вадим К (статус: Академик), 9 февраля 2012, 19:34 [#5]:Ничего не понятно в комментарии... Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |