![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Назначение процедур для динамически создаваемых контролов [D5, XP]
Константин © (2010-02-08 22:45:00)Уважаемые мастера, запутался. Не получается назначить процедуру на событие
onExitилиonChange.
Делаю примерно так:
...
ArrEdit: Array [0..5, 0..5] of TEdit;
В секции{private}
procedure DoSomething;
послеimplementation
procedure Form1.DoSomething;
begin
ShowMessage('Изменили содержимое Edit');
end;
...
for i:= 0 to 5 do
for j:= 0 to 5 do
begin
ArrEdit[i, j]:= TEdit.Create(Self);
ArrEdit[i, j].Parent:= Self;
ArrEdit[i, j].Height:= 12; ArrEdit[i, j].Width:= 30;
ArrEdit[i, j].Top:= ...; ArrEdit[i, j].Left:= ...;
//здесь хочу прописать процедуру
ArrEdit[i, j].onChange:= DoSomething;
end;
При компиляции получаю ошибку:
Incopatible types: method pointer and regular procedure
Понимая, что это несовместимые типы указатель метода и процедура, не хватает знаний, чтобы сделать правильно.
Подскажите, пожалуйста, как мне это разрулить.
Спасибо
Leonid Troyanovsky (2010-02-09 18:44:00) [1]
> Константин (09.02.10 18:04) [13]
> Многого из сообщения не "переварил":(
> Где можно почитать?
Зависит от того, что не переварено.
--
Regards, LVT.
Константин (2010-02-09 18:04:00) [2]Многого из сообщения не "переварил":(
Где можно почитать?
Спасибо
Leonid Troyanovsky (2010-02-09 17:58:00) [3]
> Константин (09.02.10 16:27) [9]
> Да еще вчера для себя решил эту проблему (не знаю на сколько
> корректно).
Для динамчески создаваемых Edit естественно перекрывать
(override) Change & DoExit. Т.е., и назначать ничего не надо.
Место вызова inherited - по вкусу.
--
Regards, LVT.
Константин (2010-02-09 17:00:00) [4]> {RASkov} © (09.02.10 16:32) [10]
Да, что то не получилось вчера. Видимо где-то накосячил.
Попробую так сделать, только аккуратно
:)
{RASkov} (2010-02-09 16:32:00) [5]> [9] Константин (09.02.10 16:27)
> (не знаю на сколько корректно).
В принципе все нормально, но как-то через ж... все сделано....
Почему сразу самому не прописать(объявить) в описании класса метод
type TForm1 = class(TForm)
......
procedure ChangeEdit(Sender: TObject);
end;
.....
ArrEdit[i, j].onChange:= ChangeEdit;
...
procedure TForm1.ChangeEdit(Sender: TObject);
begin
...
end;
Константин (2010-02-09 16:27:00) [6]Спасибо всем откликнувшимся.
Да еще вчера для себя решил эту проблему (не знаю на сколько корректно).
var ChangeEdit: TNotifyEvent;
...
ChangeEdit:= Button1Click;
...
ArrEdit[i, j].onChange:= Button1Click;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
...
end;
Меня решение устраивает.
Еще раз всем спасибо.
Ega23 (2010-02-09 14:40:00) [7]
> объявление обработчика должно соответствовать соответствующему
> TnotifyEvent
типу, а не TNotifyEvent'у
webpauk (2010-02-09 14:38:00) [8]ArrEdit[i, j].onChange - DoChange(Sender: Tobject);
ArrEdit[i, j].OnKeyUp - DoKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
и т.д.
объявление обработчика должно соответствовать соответствующему TnotifyEvent
12 (2010-02-09 11:27:00) [9]Возможно,
это по примеру на rsdn, где было написано для кнопки
procedure ButtonClick (Self : TButton; Sender : TButton);
begin
ShowMessageFmt ('Нажата кнопка %s', [Sender.Caption]);
ShowMessageFmt ('Self = %s', [Self.Name]);
end;
procedure AssignButtonClick (const Button : TButton);
var Method : TMethod;
begin
Method.Code := @ButtonClick;
Method.Data := Button;
Button.OnClick := TNotifyEvent (Method);
end;
Ega23 (2010-02-09 11:24:00) [10]
> Edit.OnClick := TNotifyEvent (Method);
Не уверен, что в данном случае приводить нужно.
Германн (2010-02-09 09:16:00) [11]
> 12 © (09.02.10 08:52) [3]
>
> вариант 2
>
Перебор.
12 (2010-02-09 08:52:00) [12]вариант 2
procedure EditKey (Self : TEdit; Sender : TEdit; var Key:char);
begin
ShowMessage(Key);
end;
procedure EditClick (Self : TEdit; Sender : TEdit);
begin
ShowMessage('êëèê');
end;
procedure AssignEditKey (const Edit : TEdit);
var
Method : TMethod;
begin
Method.Code := @EditKey;
Method.Data := Edit;
Edit.OnKeyPress := TKeyPressEvent (Method);
end;
procedure AssignEditClick (const Edit : TEdit);
var
Method : TMethod;
begin
Method.Code := @EditClick;
Method.Data := Edit;
Edit.OnClick := TNotifyEvent (Method);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
for i:=0 to ComponentCount-1 do
if (Components[i] is TEdit) then
begin
AssignEditKey(TEdit(Components[i]));
AssignEditClick(TEdit(Components[i]));
end;
end;
Ega23 (2010-02-09 01:11:00) [13]
> Понимая, что это несовместимые типы указатель метода и процедура,
> не хватает знаний, чтобы сделать правильно.
Процедура - это процедура. Метод - это метод.
Вынеси объявление в класс:
TForm1 = class (TForm)
....
private
procedure OnSomethingChange(Sender: TObject);
end;
...
ArrEdit[i, j].onChange:= OnSomethingChange;
И Павел (2010-02-08 22:53:00) [14]Создайте обработчик OnChange как всегда через инспектор объектов и посмотрите - как он выглядит.