Обработчики событий

отредактировано 01:41 Раздел: FastScript
Пытаюсь реализовать событие вида:
TGridTextEventSV = procedure(Sender: TObject; Col, Row: LongInt; var Value: String) of object;
Это событие отрисовки текста в компоненте TGridView.

Описываю событие как показано в примере:
TGridTextEventSV = class(TfsCustomEvent)
public
procedure DoEvent(Sender: TObject; Col, Row: LongInt; var Value: String);
function GetMethod: Pointer; override;
end;

Их реализацию делаю так:
procedure TGridTextEventSV.DoEvent(Sender: TObject; Col, Row: Integer;
var Value: String);
begin
CallHandler([Sender, Col, Row, Value]);
Value := String(Handler.Params[1].Value);
end;

function TGridTextEventSV.GetMethod: Pointer;
begin
Result := @TGridTextEventSV.DoEvent;
end;

В глобальный юнит добавляю сам компонент и его событие:
With fsGlobalUnit do begin
AddedBy := Self;
...
With AddClass(TGridViewSV, 'TCustomGridView') do begin
AddEvent('OnGetCellTextSV', TGridTextEventSV);
end;
...
AddedBy := nil;
end;

Вот кусок кода из самого скрипта:
=================
#language PascalScript
var
Grid: TGridViewSV;

procedure GetCellTextSV(Sender: TObject; Col, Row: Integer; var Value: String);
begin
Value := 'текст любой для проверки';
end;

begin
Grid := TGridViewSV.Create(Form);
...
Grid.OnGetCellTextSV := @GetCellTextSV;
end;
=================
В скрипте создаю грид, создаю его столбцы. Все ок. ;)
Но как пытаюсь подключить ему событие получаю ошибку:
Access violation... ;)
Дельфи останавливается в модуле unit fs_itools.pas в процедуре:
function VarRecToVariant(v: TVarRec): Variant;
когда пытается вернуть результат как строку...
Подскажите, пожалуйста, в чем я не прав? ;)

Комментарии

  • отредактировано 01:41
    Надо не [1], а [3]:

    procedure TGridTextEventSV.DoEvent(Sender: TObject; Col, Row: Integer;
    var Value: String);
    begin
    CallHandler([Sender, Col, Row, Value]);
    Value := String(Handler.Params[3].Value);
    end;
  • отредактировано 01:41
    Исправил на:
    Value := String(Handler.Params[3].Value);

    но не помогло... ;)
    В том же самом месте таже самая ошибка... ;)
  • отредактировано 01:41
    Хм... ;) после детальной трассировки обнаружил, что Access violation появляется еще на первой строке, на:
    CallHandler([Sender, Col, Row, Value]);

    когда пытается в процедуре
    procedure TfsCustomEvent.CallHandler(Params: array of const);
    выполнить:
    FHandler.Params.Value := VarRecToVariant(Params); <-- при i = 3

    Кто виноват и что делать!? ;)
  • отредактировано 01:41
    Все решилось намного проще... ;)
    Просто в процедуру CallHandler не нужно передавать последний параметр, вот так:

    procedure TGridTextEventSV.DoEvent(Sender: TObject; Col, Row: Integer;
    var Value: String);
    begin
    CallHandler([Sender, Col, Row]); ;)
    Value := String(Handler.Params[3].Value);
    end;
  • отредактировано 01:41
    Прежде чем писать ответ, я проверил у себя на простом примере - заглушке класса TGridViewSV. Все работает отлично, со всеми параметрами.
  • отредактировано 01:41
    Хм... интересно... ;)
    А если не указывать у Вас последний параметр, то будет работает..?

    У меня только так и работает... ;)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.