Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Константин   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.059 c
11-1221509060
tsugi
2008-09-16 00:04
2010.08.27
D2009


2-1270885260
roman2
2010-04-10 11:41
2010.08.27
Координаты точки


15-1271695731
Sergey Masloff
2010-04-19 20:48
2010.08.27
Мобильный без камеры нужен (известно же что тут лучший поисковик)


15-1265046351
Piter
2010-02-01 20:45
2010.08.27
Как вы относитесь к DB-Aware компонентам?


15-1265031893
KSergey
2010-02-01 16:44
2010.08.27
Разрешить локальный вход на контролер домена (RDP)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский