Обработчики событий
Пытаюсь реализовать событие вида:
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;
когда пытается вернуть результат как строку...
Подскажите, пожалуйста, в чем я не прав?
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;
когда пытается вернуть результат как строку...
Подскажите, пожалуйста, в чем я не прав?
Комментарии
procedure TGridTextEventSV.DoEvent(Sender: TObject; Col, Row: Integer;
var Value: String);
begin
CallHandler([Sender, Col, Row, Value]);
Value := String(Handler.Params[3].Value);
end;
Value := String(Handler.Params[3].Value);
но не помогло...
В том же самом месте таже самая ошибка...
CallHandler([Sender, Col, Row, Value]);
когда пытается в процедуре
procedure TfsCustomEvent.CallHandler(Params: array of const);
выполнить:
FHandler.Params.Value := VarRecToVariant(Params); <-- при i = 3
Кто виноват и что делать!?
Просто в процедуру CallHandler не нужно передавать последний параметр, вот так:
procedure TGridTextEventSV.DoEvent(Sender: TObject; Col, Row: Integer;
var Value: String);
begin
CallHandler([Sender, Col, Row]);
Value := String(Handler.Params[3].Value);
end;
А если не указывать у Вас последний параметр, то будет работает..?
У меня только так и работает...