|
Вопрос # 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);
- var
- labpra:array of TLabel;
- i:integer;
- begin
- SetLength(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]:
Ничего не понятно в комментарии...
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|