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

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

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

Ответить
ParAlexandr
незнакомец
Сообщения: 2
Зарегистрирован: 19.05.2016 10:57:41

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

Сообщение ParAlexandr »

Добрый день.
В принципе вопрос в теме. Не могу правильно написать обработку события 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. Если пользователь ввел число не правильно, выводится соответствующее сообщение с Абортом ).
Прошу помочь кто чем может... Или навести на мысль.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

А вот так?
ParAlexandr
незнакомец
Сообщения: 2
Зарегистрирован: 19.05.2016 10:57:41

Сообщение ParAlexandr »

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

Добавлено спустя 14 минут 52 секунды:
А @ что обозначает?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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

Добавлено спустя 4 минуты 18 секунд:
Ой, наоборот((( использовать адрес переменной
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

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 битах и по другому :)
Ответить