Прошу помощи в написании события OnSetText

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прошу помощи в написании события OnSetText

Сообщение ParAlexandr » 19.05.2016 12:00:07

Добрый день.
В принципе вопрос в теме. Не могу правильно написать обработку события OnSetText. Понимаю что вопрос для кого-то банальный, однако бьюсь уже не один день.

Вот что есть:

Код: Выделить всё
type
  { TForm3 }
.......................................
procedure SetText(Sender: TField; const AText: string);
procedure OpenPageControl;
.......................................

implementation

{$R *.lfm}
{ TForm3 }

procedure TForm3.SetText(Sender: TField; const AText: string);
begin
  try
    Sender.AsFloat := StrToFloat(AText);
  except
    ShowMessage('Введено неверное число');
    Abort;      // Запрещаем очистку ячейки и выход из неё
  end;
end;
.......................................

procedure TForm3.OpenPageControl;
var
c:integer;
begin
for c:=2 to 10 do
    begin
      Form3.DBGrid1.Columns[c].Field.OnSetText:=SetText;
end;
.......................................


При компиляции Lazarus выдает след ошибки:

unit3.pas(159,49) Error: Wrong number of parameters specified for call to "SetText"

unit3.pas(76,18) Error: Found declaration: SetText(TField;const AnsiString);

Код должен обрабатывать набранный текст пользователем в DBGrid. Если пользователь ввел число не правильно, выводится соответствующее сообщение с Абортом ).
Прошу помочь кто чем может... Или навести на мысль.
ParAlexandr
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.05.2016 11:57:41

Re: Прошу помощи в написании события OnSetText

Сообщение alexs » 19.05.2016 12:59:15

ParAlexandr писал(а):Form3.DBGrid1.Columns[c].Field.OnSetText:=@SetText;

А вот так?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Прошу помощи в написании события OnSetText

Сообщение ParAlexandr » 19.05.2016 13:13:33

Благодарю. Обработчик срабатывает. Почему-то нигде не нашел такой синтаксис.

Добавлено спустя 14 минут 52 секунды:
А @ что обозначает?
ParAlexandr
незнакомец
 
Сообщения: 2
Зарегистрирован: 19.05.2016 11:57:41

Re: Прошу помощи в написании события OnSetText

Сообщение Лекс Айрин » 19.05.2016 13:33:16

ParAlexandr писал(а):А @ что обозначает?


это разыменование ссылки.

Добавлено спустя 4 минуты 18 секунд:
Ой, наоборот((( использовать адрес переменной
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Прошу помощи в написании события OnSetText

Сообщение resident » 19.05.2016 16:35:43

ParAlexandr писал(а):Почему-то нигде не нашел такой синтаксис.

Потому что Delphi автоматически подставляла @, а в Лазарусе из коробки все настроено строже - приходится самому. Но это было сделано в Delphi не везде, поэтому в других местах там тоже обязательно использовалось @.

ParAlexandr писал(а):А @ что обозначает?

"А" - от слова "адрес" чего-то в общем случае.
Но сбоку TField объявлен процедурный тип со словом of object (Ваша TForm3.SetText совместима с таким шаблоном.):
Код: Выделить всё
TFieldSetTextEvent = procedure(Sender: TField; const aText: string) of object;

Переменные такого типа - указатели на методы, размером 8 байт, хранят сразу и ссылку на объект и адрес его метода.
Т.е. такой код покажет вам восьмерку:
Код: Выделить всё
ShowMessage(IntToStr(SizeOf(@SetText)));

Но это все от нас скрыто, под вывеской того же @.
Хотя чисто адрес будет 4 байта, например, у вас размер адреса переменной c:
Код: Выделить всё
ShowMessage(IntToStr(SizeOf(@c)));


з.ы. У меня 32-битный Лазарус, может на 64 битах и по другому :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru