О событиях
От: Аноним  
Дата: 04.11.05 16:40
Оценка:
Подскажите такую вещь


unit ExGrids;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Grids, Types, Math,
  Dialogs, Controls;


type TExGridCell = class;
     TOnSelectEvent = procedure(Sender: TObject; ACol, ARow: integer) of object;

  TExGridCell = class (TComponent)
  private
    FSelected: boolean;
    FOnSelect: TOnSelectEvent;
    procedure SetSelected(const Value: boolean);
  protected
    procedure DoSelect(ACol,ARow: integer); virtual;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    property OnSelect: TOnSelectEvent read FOnSelect write FOnSelect;
    property Selected: boolean read FSelected write SetSelected;
end;

type
  TExGrid = class (TCustomGrid)
  private
    FCells: TList;
    procedure SelectCell(Sender: TObject; ACol, ARow: integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
    procedure SelectCell(Sender: TObject; ACol, ARow: integer);
    property Cells[ACol, ARow: Integer]: TExGridCell read GetCells write SetCells;
  end;

implementation

constructor TExGrid.Create(AOwner: TComponent);
var i, Col, Row: integer;
    m: TMethod;
begin
  inherited Create(AOwner);
  FCells:=TList.Create;
  for i:=1 to RowCount*ColCount do
  begin
      FCells.Add(TExGridCell.Create(self));
      Cells[Col,Row].OnSelect:=SelectCell;
  end;
end;

destructor TExGrid.Destroy;
begin
  inherited Destroy;
end;


class procedure TExGrid.SelectCell(Sender: TObject; ACol, ARow: integer);
begin
  ShowMEssage('clicked on '+IntToStr(ACol)+'/'+IntToStr(ARow))  ;
end;


{ TExCell }

constructor TExGridCell.Create(AOwner: TComponent);
begin
  inherited;
  FSelected:=false;
  FText:='';
  FColor:=clWhite;
end;

destructor TExGridCell.Destroy;
begin
  inherited;
end;

procedure TExGridCell.DoSelect(ACol, ARow: integer);
begin
  if Assigned(FOnSelect) then OnSelect(Self) else ShowMessage('Not assigned');
end;

procedure TExGridCell.SetSelected(const Value: boolean);
begin
  FSelected:=Value;
  DoSelect(Col,Row)
end;

end.


Так вот в if Assigned(FOnSelect) then OnSelect(Self) else ShowMessage('Not assigned');
Assigned(FOnSelect) возвращает false

Прочитал статьи которые выложены на сайте по теме событий и аналогичные вопросы, но так и не нашел причину такой вот неисправности в коде, подскажи с примера. заранее благодарен
Re: О событиях
От: Аноним  
Дата: 04.11.05 16:43
Оценка:
Здравствуйте, Аноним, Вы писали:

и ещё забыл:

и когда делаю Cells[i,,j].OnSelect :=SelectCell то сразу после когда Assigned(Cells[i,,j].FOnSelect) возвращает true, а уже в момент вызова процедуры TExGridCell.DoSelect(ACol, ARow: integer); Assigned(Cells[i,,j].FOnSelect) = false
Re: О событиях
От: svd71 http://visualdesigner.fatal.ru/
Дата: 04.11.05 21:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите такую вещь


...
А>Так вот в if Assigned(FOnSelect) then OnSelect(Self) else ShowMessage('Not assigned');
А> Assigned(FOnSelect) возвращает false

А>Прочитал статьи которые выложены на сайте по теме событий и аналогичные вопросы, но так и не нашел причину такой вот неисправности в коде, подскажи с примера. заранее благодарен


Ну правильно! а счего она должна быть присвоена? Нормальные компоненты кладутся в дизайн-тайме на форму и в инспекторе объектов в события ПРИСВАИВАЮТСЯ методы. Далее когда начинает работать проект в ран-тайме, то :
1. происходит создание компонента (отработка коструктора и т.д.);
2. Загрузка значений параметров для свойств (событи — тоже свойство), то есть назначение методов для событий;
Это грубо говоря упрощеннай план работы компонента.
поэтому после создания метод присваивается свойству либо на этапе загрузки, либо ручками.

чудная функция Assigned сделана для аналогии как и сравнение с nil. только если как метод используется функция другого типа, то сравнение получается неудачным:
TEv = function(ff:integer): boolean of object;
...
if Ev(55) = nil then ..
компилятор будет ругаться.
Re[2]: О событиях
От: svd71 http://visualdesigner.fatal.ru/
Дата: 04.11.05 21:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>и ещё забыл:


А>и когда делаю Cells[i,,j].OnSelect :=SelectCell то сразу после когда Assigned(Cells[i,,j].FOnSelect) возвращает true, а уже в момент вызова процедуры TExGridCell.DoSelect(ACol, ARow: integer); Assigned(Cells[i,,j].FOnSelect) = false


О извиняюсь за предыдущий пост, плохо прочитал за один раз.
нужно содержимое методов для свойства property Cells[ACol, ARow: Integer]: TExGridCell read GetCells write SetCells;

В коде они не написаны и какие они из себя тоже непонятно. а весь вопрос сводится именно к ним (через свойство).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.