Форум: "Начинающим";
Текущий архив: 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.112 c