event на невизуальном классе

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

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

event на невизуальном классе

Сообщение skobanev » 26.12.2018 20:20:55

Добрый.

Например, есть класс
Код: Выделить всё
type
  TExample=class
    AINT: Integer;
  end;


Каким образом прикрутить либо на АINT, а желательно на TExample onchange event ?
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение Лекс Айрин » 26.12.2018 20:39:37

Видимо, так же как это сделано для TForm. Только учти, что все это изначально разнесено по разным местам.
Код: Выделить всё

{TNotifyEvent = procedure(Sender: TObject) of object;}// есть и другие типы, но различие только в параметрах, которые нужны
....
FOnChangeBounds: TNotifyEvent;
....
property OnChangeBounds: TNotifyEvent read FOnChangeBounds write FOnChangeBounds; 

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

Re: event на невизуальном классе

Сообщение skobanev » 26.12.2018 21:06:35

Чет Я еще больше запутался ((((
насколько я понял, что легче сделать так:
Код: Выделить всё
type
  TExample=class
private
    A_AINT: Integer;
public
property AINT : Integer read A_AINT write A_AINTWRITE
procedure A_AINTWRITE;
  end;

procedure TExample.A_AINTWRITE;
begin
   A_AINT := AINT;
<CODE...>
end;


Может коряво, но.....
Самое противное, что инфы нет (((
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение olegy123 » 26.12.2018 21:09:40

Событие или Callback?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: event на невизуальном классе

Сообщение skobanev » 26.12.2018 21:13:15

Принцип работы:
Есть класс заказов. Есть аттрибут фильтра. Если в аттрибут попадает инфа, значит читаем аттрибут и фильтруем по заданному сценарию. Просто если мне легче это отлавливать самописным кодом, как выше, то я дальше просто лезть не буду. Хотя для самообразования пойдет.
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение olegy123 » 26.12.2018 21:22:52

Callback^
Код: Выделить всё
Type
  TOnFilter = procedure() of object; // можно обозначить с  параметрами типа procedure(sender:TObject; param1,param2:Intereg) of object;

TExample=class
  private
   FOnFilter:TOnFilter; // --- обявляем ссылочную переменную на процедуру типа [b]TOnFilter[/b]

   function DoFilter();
  public
   OnFilter:TOnFilter read FOnFilter wite FOnFilter; //
          //  -- если поместим в published и объект будет виден в дизайнере то тогда это поле станет редактируемо в дизайнере, как типа TFom.OnCreate
  end;
 

...
  function TExample.DoFilter();
  begin
    if Assigned(FOnFilter) then // прjверям что FOnFilter<>nil
        FOnFilter();    // вызываем  Callback//  FOnFilter(Self,param1,param2) естественно.   

  endl
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: event на невизуальном классе

Сообщение skobanev » 26.12.2018 21:37:13

olegy123 , Огромное спасибо. Но я до сих пор не понял как отлавливать изменения аттрибута ?

Должно быть что то типа if Example.Changed then Example.Filter

Я просто с самописными объектами работаю всего пару месяцев. До Этого писал только используя процедуры и что есть в самом лазарусе. Пишу для себя, поэтому пишу набегами по необходимости. Решил рабочую базу посадить под Объекты. И Сразу начал ломать голову. Ибо описаний, как и примеров мало, да и половину я понять не могу.
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение Лекс Айрин » 26.12.2018 21:50:54

Процедуру A_AINTWRITE нужно кинуть в private она должна быть доступна только для проперти.


Код: Выделить всё
A_AINT := AINT;

Ты же собрался вешать событие... это делается только на объект/класс.

Назначение события надо будет сделать в конструкторе и, желательно, в деструкторе оставлять прежнее (особенно если ты будешь потом класс расширять)

skobanev писал(а):Чет Я еще больше запутался ((((


На самом деле не так уж сложно, только есть несколько особенностей. Событие это процедура, которая вызывается для реакции на сообщение. (вообще, советую посмотреть как это реализовано для стандартных компонент.)

TNotifyEvent = procedure(Sender: TObject) of object; это объявление процедуры как типа, чтобы ее можно было использовать.

FOnChangeBounds: TNotifyEvent; это определение переменной типа процедура

Сама проперти не должна вызывать проблем.

У тебя объявление класса можно сделать примерно так. Не гарантирую, правда, отсутствия ошибок.

Код: Выделить всё
// TNotifyEvent нет смысла объявлять повторно, т. к. она уже есть в коде библиотеки.
type
  TExample=class
private
    A_AINT: Integer;
    Procedure A_AINTWRITE(Sender: TObject);
public
   
    property AINT :TNotifyEvent read A_AINTWRITE write A_AINTWRITE;
end;

procedure TExample.A_AINTWRITE;
begin
  // A_AINT := AINT;
<CODE...>
end;


Не нужно даже в конструкторе ничего писать)))

Добавлено спустя 8 минут 56 секунд:
skobanev писал(а):Но я до сих пор не понял как отлавливать изменения аттрибута ?


Никак. Используй проперти и в процедуре за write делай все, что тебе нужно. Таким способом ты просто гарантируешь, что нужная тебе переменная изменена и ты отловил это изменение. Даже если введено тоже значение. Вот пример
Код: Выделить всё
property Position: TPosition read FPosition write SetPosition default poDesigned;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: event на невизуальном классе

Сообщение skobanev » 26.12.2018 22:13:27

Лекс Айрин. Огромное спасибо.

Код: Выделить всё
type
  TZakaziFilter = class
    private
      ZakazFilter_FilterType: Integer;
      procedure P_FilterType(AValue:Integer);
    public
      property FilterType: Integer read ZakazFilter_FilterType write P_FilterType;
  end;                                                                           

procedure TZakaziFilter.P_FilterType(AValue:Integer);
begin
  self.ZakazFilter_FilterType:=AValue;
  ShowMessage(self.FilterType.ToString);
end; 


Меня вполне устраивает под данные нужды.
Изменяя аттрибут, сразу начинается фильтрация....
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение Лекс Айрин » 26.12.2018 22:21:08

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

Re: event на невизуальном классе

Сообщение skobanev » 26.12.2018 22:35:38

Лекс Айрин Постараюсь. Чувствую я тут на долго зависну.

Добавлено спустя 40 минут 12 секунд:
Помогите пож. еще в одном деле.
есть вот такие описания:
Код: Выделить всё
type
  TKlient = class
    ID          : Integer;
  end;

  TJob = class(TCollectionItem)
  private
    Job_JobID       : Integer;
  public
    property JobID: Integer read Job_JobID write Job_JobID;
  end;

type
  TCurrentZakaz = class(TCollection)
  private
    Zakaz_ID            : Integer;
    Zakaz_Klient        : TKlient;

    function GetItem(AIndex: Integer): TJob;

  public
    property ID : Integer read Zakaz_ID write Zakaz_ID;

    property Items[AIndex: Integer]: TJob read GetItem; default;
    property Klient: TKlient read Zakaz_Klient write Zakaz_Klient;

  public
    constructor Create(Item_Class: TCollectionItemClass);

    function InsertNew : TJob;
    function Insert(AJob: TJob):TJob;

    procedure GetData(ZakazID: Integer);

  end;

type
  TZakazi = class(TList)
    Filter : TzakaziFilter;

    constructor Create;

    function GetItem(AIndex: Integer): TCurrentZakaz;
    function LoadMainData(Deleted: boolean): boolean;
  end; 


Вопрос таков: Нужно ли при Очищении объекта ( TList ) удалять рекурсивно все, начиная с последнего , или можно просто очистить родителя ?

Например у меня изменения в фильтрации таблицы. Мне чтобы заного заполнить объект можно просто сделать Zakazi.Clear или рекурсивно, начиная с самого последнего объекта все очищать (Free) ?
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение olegy123 » 27.12.2018 01:13:29

Free это деструктор объекта, так сам объект уничтожается, со всем списком.
Zakazi.Clear правильно! Смывает все в списке автоматом, сам объект живой. Рекурсивно можно, но будет дополнять Zakazi.Clear
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: event на невизуальном классе

Сообщение skobanev » 27.12.2018 10:26:29

Весь вопрос в том, что когда я сделаю ZAKAZI.Clear уничтожатся только ссылки а данные списка останутся ? или данные списка из памяти тоже уничтожатся ?
skobanev
новенький
 
Сообщения: 33
Зарегистрирован: 24.02.2016 23:55:01
Откуда: Ростов-на-Дону

Re: event на невизуальном классе

Сообщение olegy123 » 27.12.2018 15:06:44

skobanev писал(а):ZAKAZI.Clear уничтожатся только ссылки а данные списка останутся ?
уничтожатся только ссылки,данные списка останутся!!
есть TObjectList готорый может при удалении элемента удалять объект, также в случае Clear
TList не умеет удалять объекты, он о них не знает.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: event на невизуальном классе

Сообщение MylnikovDm » 14.01.2019 11:45:12

Нет смысла объявлять поле как property, если вы не используете функции для чтения или записи значений, при этом давая доступ к значению функции и для записи, и для чтения.
То есть, код типа:
Код: Выделить всё
type
  TMyClass = class
  private
    FData: integer;
  public
    property Data: integer read FData write FData;
  end;

можно написать, компилятор это пропустит, но особого смысла это не имеет.

Другое дело, если данное поле будет доступно снаружи только для чтения, либо когда используется функция, которая выполняет при чтении или записи дополнительные действия.
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru