Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Назначение процедур для динамически создаваемых контролов   Найти похожие ветки 

 
Константин   (2010-02-08 22:45) [0]

Уважаемые мастера, запутался. Не получается назначить процедуру на событие 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
Понимая, что это несовместимые типы указатель метода и процедура, не хватает знаний, чтобы сделать правильно.

Подскажите, пожалуйста, как мне это разрулить.
Спасибо


 
И Павел   (2010-02-08 22:53) [1]

Создайте обработчик OnChange как всегда через инспектор объектов и посмотрите - как он выглядит.


 
Ega23 ©   (2010-02-09 01:11) [2]


> Понимая, что это несовместимые типы указатель метода и процедура,
>  не хватает знаний, чтобы сделать правильно.


Процедура - это процедура. Метод - это метод.
Вынеси объявление в класс:

TForm1 = class (TForm)
....
private
 procedure OnSomethingChange(Sender: TObject);
end;

...

ArrEdit[i, j].onChange:= OnSomethingChange;


 
12 ©   (2010-02-09 08:52) [3]

вариант 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;


 
Германн ©   (2010-02-09 09:16) [4]


> 12 ©   (09.02.10 08:52) [3]
>
> вариант 2
>

Перебор.


 
Ega23 ©   (2010-02-09 11:24) [5]


> Edit.OnClick := TNotifyEvent (Method);


Не уверен, что в данном случае приводить нужно.


 
12 ©   (2010-02-09 11:27) [6]

Возможно,
это по примеру на 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;


 
webpauk ©   (2010-02-09 14:38) [7]

ArrEdit[i, j].onChange - DoChange(Sender: Tobject);
ArrEdit[i, j].OnKeyUp - DoKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
и т.д.

объявление обработчика должно соответствовать соответствующему TnotifyEvent


 
Ega23 ©   (2010-02-09 14:40) [8]


> объявление обработчика должно соответствовать соответствующему
> TnotifyEvent


типу, а не TNotifyEvent"у


 
Константин   (2010-02-09 16:27) [9]

Спасибо всем откликнувшимся.
Да еще вчера для себя решил эту проблему (не знаю на сколько корректно).

var ChangeEdit: TNotifyEvent;
...
ChangeEdit:= Button1Click;
...
ArrEdit[i, j].onChange:= Button1Click;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
...
end;


Меня решение устраивает.
Еще раз всем спасибо.


 
{RASkov} ©   (2010-02-09 16:32) [10]

> [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 17:00) [11]

> {RASkov} ©   (09.02.10 16:32) [10]

Да, что то не получилось вчера. Видимо где-то накосячил.
Попробую так сделать, только аккуратно
:)


 
Leonid Troyanovsky ©   (2010-02-09 17:58) [12]


> Константин   (09.02.10 16:27) [9]

> Да еще вчера для себя решил эту проблему (не знаю на сколько
> корректно).

Для динамчески создаваемых Edit естественно перекрывать
(override) Change & DoExit. Т.е., и назначать ничего не надо.
Место вызова inherited - по вкусу.

--
Regards, LVT.


 
Константин   (2010-02-09 18:04) [13]

Многого из сообщения не "переварил":(
Где можно почитать?
Спасибо


 
Leonid Troyanovsky ©   (2010-02-09 18:44) [14]


> Константин   (09.02.10 18:04) [13]

> Многого из сообщения не "переварил":(
> Где можно почитать?

Зависит от того, что не переварено.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.116 c
2-1271611445
NGPOL
2010-04-18 21:24
2010.08.27
Ошибки при экспорте в Excel_1


15-1261482460
Piter
2009-12-22 14:47
2010.08.27
Win32/Kryptik троян подцепил


15-1267740121
Klopa
2010-03-05 01:02
2010.08.27
Скорость передачи по COM порту


4-1231416440
kolj
2009-01-08 15:07
2010.08.27
Стиль Windows Xp для нарисованой кнопки на Caption bar ?


2-1268605992
Дмитрий
2010-03-15 01:33
2010.08.27
отправка пакета ( TcpClient )