Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать событие в родительский класс из дочернего 
:(
    Опции темы
Dimqin
Дата 2.2.2018, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.2.2018

Репутация: нет
Всего: нет



Создаю форму, создаю дочерний компонент.  В компоненте есть контролы. По нажатию контрола меняется некое значение. 
Далее в родительской форме по изменении значения должно меняться свойство компонента.

Т.е. мне необходимо отслеживать значение в дочернем компоненте, чтобы изменить что-то в родительском классе. 
Есть три пути, как это осуществить:
1. В родительском классе запускать таймер и считывать значение. Громоздко, но имеет право на существование.
2. Создать в родительском классе событие, возникающее при изменении значения в дочернем классе. 
3. Т.к. Источником изменения является событие в дочернем компоненте, то перенести событие на уровень выше.

Как осуществить алгоритм 2 или 3? Что тут лучше?

PM MAIL   Вверх
Gwire
Дата 2.2.2018, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Dimqin, я правильно понял, как это выглядит.
Код

TForm1 = class(TForm)
public
  ChildComp: TChildComp;
А где-то ранее:
Код

type
  TChildComp = class(TCustomControl)
  public
    Ctrl1: TControl;
    Ctrl2: TControl;
    Ctrl3: TControl;

Не совсем понятно с чем мы имеем дело, чтобы ответь как его лучше приготовить.
А вдруг это не просто рыба, а фуга - а мы тебе сейчас насоветуем

Это сообщение отредактировал(а) Gwire - 2.2.2018, 19:20
PM MAIL   Вверх
Dimqin
Дата 5.2.2018, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.2.2018

Репутация: нет
Всего: нет



Gwire, всё так.
PM MAIL   Вверх
Gwire
Дата 5.2.2018, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Проще реализовать вариант 2.
Код

{ TChildComp }

constructor TChildComp.Create(AOwner: TComponent);
begin
    inherited;
    Ctrl1:= TMemo.Create(Self);
    Ctrl2:= TPanel.Create(Self);
    Ctrl3:= TButton.Create(Self);
    Ctrl1.Parent := Self;    Ctrl1.SetBounds(   8, 8, 64, 64 );
    Ctrl2.Parent := Self;    Ctrl2.SetBounds(  80, 8, 64, 64 );
    Ctrl3.Parent := Self;    Ctrl3.SetBounds( 152, 8, 64, 64 );

    // вместо nil указать процедуры обработки событий
    Ctrl1.OnChange    := nil;
    Ctrl2.OnMouseMove := nil;
    Ctrl3.OnClick     := nil;
    // и др.
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
    ChildComp:= TChildComp.Create(Self);
    ChildComp.Parent:= Self;
    ChildComp.SetBounds( 8, 8, 224, 104 );
    ChildComp.Color := clCream;
end;
Здесь возникают события вполне конкретные.


Вариант 3 осуществить и просто и нет:
Код

  TChildComp = class(TCustomControl)
  protected
    . . .
    procedure WndProc(var Message: TMessage); override;
    . . .

procedure TChildComp.WndProc(var Message: TMessage);
begin
    inherited;

    case Message.Msg of
     WM_KEYDOWN: ;
     WM_LBUTTONUP: ;
     // и т.д.
    end;
end;
Хотя в этом случаи и будут приходить события адресованные только ChildComp, Ctrl1..Ctrl3, но здесь сложность заключается в том, что нет HWND кому адресован  Message. Но, если тебя устраивал таймер, то можно обновлять все значения при возникновении одного из событий.
Но я бы или допилил с HWND или использовал вар.2.

Это сообщение отредактировал(а) Gwire - 5.2.2018, 12:21
PM MAIL   Вверх
Dimqin
Дата 5.2.2018, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.2.2018

Репутация: нет
Всего: нет



Gwire, С таймером не так хорошо, т.к. я пишу маленький графический редактор. Предполагаю, что программа будет подтормаживать. Да и саму технологию создания событий и взаимодействия классов хочется освоить, ибо пригодится в дальнейшем.
PM MAIL   Вверх
Gwire
Дата 5.2.2018, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



У меня была похожая задача (редактор целого числа в котором можно, колесиком мыши, управлять любым разрядом).
Я для всех событий которые генерят Ctrl1 .. CtrlN (для всех нужных для задачи) назначил процедуры обработки реализованные в ChildComp.

Правда пришлось повозится с мыхой (и это отдельная история или Тема).

Это сообщение отредактировал(а) Gwire - 5.2.2018, 16:15
PM MAIL   Вверх
Dimqin
Дата 6.2.2018, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.2.2018

Репутация: нет
Всего: нет



Gwire, поразмышлял я на досуге. С созданием в родительском классе события есть сложности. События от объектов TControl гененрятся с некоторой частотой, определяемой системой. Искусственное событие должно тоже быть связано с некоторыми процедурами опроса состояния. Т.е. Надо создать некоторый виртуальный метод виртуального объекта TControl, а аргументом его сделать содержание переменной -  как старое значение стало отлично от нового, так сработала "кнопочка"... Короче, надо что-то подсунуть из системных запросов.. Остальные два из вышеупомянутых способов тоже прокатят, ...но хочется красоты и гармонии..
PM MAIL   Вверх
Gwire
Дата 7.2.2018, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Даже не представляю, что ты пытаешься приготовить, но прочитанное у меня воспалило такой рецепт (может подойдет):
Если все Ctrl1 .. CtrlN создаются в TChildComp.Create, то породи от их классов свои классы и расширь функционал.
Например:
Код

type
  TButtonExt = class(TButton)
  protected
    function ParentComp: TChildComp;
    procedure DoChangeValue(Code: Word; Old, New: Integer); overload;
    procedure DoChangeValue(Code: Word; Old, New: Double); overload;
    procedure DoChangeValue(Code: Word; Old, New: Boolean); overload;
    procedure DoChangeValue(Code: Word; Old, New: String); overload;
  end;

implementation

function TButtonExt.ParentComp: TChildComp;
begin
    Result := TChildComp(Owner);
end;

procedure TButtonExt.DoChangeValue(Code: Word; Old, New: Integer); begin ParentComp.CtrlChangeValue(Self, Code, Old, New) end;
procedure TButtonExt.DoChangeValue(Code: Word; Old, New: Double);  begin ParentComp.CtrlChangeValue(Self, Code, Old, New) end;
procedure TButtonExt.DoChangeValue(Code: Word; Old, New: Boolean); begin ParentComp.CtrlChangeValue(Self, Code, Old, New) end;
procedure TButtonExt.DoChangeValue(Code: Word; Old, New: String);  begin ParentComp.CtrlChangeValue(Self, Code, Old, New) end;
Когда меняешь значение вызывать DoChangeValue;

А в TChildComp реализовать методы CtrlChangeValue
Код

type
  TChildComp = class(TCustomControl)
  public
    Ctrl1: TButtonExt;
    Ctrl2: TMemoExt;
    Ctrl3: TPanelExt;
    procedure CtrlChangeValue(Sender: TControl; Code: Word; Old, New: Integer); overload;
    procedure CtrlChangeValue(Sender: TControl; Code: Word; Old, New: Double); overload;
    procedure CtrlChangeValue(Sender: TControl; Code: Word; Old, New: Boolean); overload;
    procedure CtrlChangeValue(Sender: TControl; Code: Word; Old, New: String); overload;
  end;
А там (в CtrlChangeValue) менять что тебе надо.

ПС: Если значение меняются "системой", то в TButtonExt реализую перехват события. Ну там типа:
Код
  protected
    procedure DblClick; override;
    procedure Resize; override;
    procedure WndProc(var Message: TMessage); override; // или в целом WndProc
  public
    procedure Click; override;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1302 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.