Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
1

Создание у формы события, основанного на событиях компонентов формы

15.11.2015, 01:29. Показов 4587. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.
Прошу подсказать решение проблемы:
Необходимо у формы создать новое событие, которое будет происходить если в одном из компонентов формы произошло заранее выбранное событие.
Пример на форме 50 шт. TEdit. (создаем динамически).
У формы должно быть создано новое событие OnChange, которое возникает если на любом из компонентов формы TEdit
возникло событие OnChange.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2015, 01:29
Ответы с готовыми решениями:

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

Динамическое создание формы и компонентов
Подскажите как динамически создать форму с Edit и Button и при нажатии на кнопку получить значение...

Создание в формы и компонентов на ней в Run-Time
Создаю форму в ран-тайме и создаю на ней 3 эдита и 2 кнопки, подскажите как сделать обработчик этих...

Написать процедуру обработки события OnCreate для формы, которая устанавливает для формы размер шрифта
Задание: 1.Создать приложение с формой. 2. Поместить на форму метку и кнопку. 3. Написать...

17
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
15.11.2015, 01:57 2
Цитата Сообщение от Egor_SES Посмотреть сообщение
У формы должно быть создано новое событие OnChange, которое возникает если на любом из компонентов формы TEdit
возникло событие OnChange.
Зачем и для чего? Обработчики событий OnChange компонентов лежащих на форме и так уже методы класса данной формы. Ей ли при этом не знать что у её компонента что-то изменилось.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
15.11.2015, 09:07 3
да. и при этом ничего не мешает всем едитам дать один общий обработчик

и 50 edit на форме - это однозначная заявка на переделку интерфейса
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
15.11.2015, 18:51  [ТС] 4
Ну например (если говорим о TEdit) для сохранения изменений в проекте при изменении любого TEdit.
Я понимаю, что это методы класса данной формы. Но как при возникновении одного из массива входных событий получить одно выходящее событие.
Если знаешь, подскажи, пожалуйста, как это сделать.
Присвоить динамически всем событиям OnChange TEdit-ов один обработчик не подходит.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
15.11.2015, 19:17 5
Ну как-то вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type
 
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure Change; override;
  end;
 
  TEditChangedEvent = procedure(Sender: TObject; Edit: TEdit) of object;
 
  TMyForm = class(TForm)
    FEditChanged: TEditChangedEvent;
  published
    property OnEditChanged: TEditChangedEvent read FEditChanged write FEditChanged;
  end;
...
 
  procedure TEdit.Change; 
  begin
    inherited;
    if Assigned(Owner) and (Owner is TMyForm) then
      if Assigned(TMyForm(Owner).OnEditChanged then
         TMyForm(Owner).OnEditChanged(Owner, Self);
  end;
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
17.11.2015, 00:02  [ТС] 6
mss,
спасибо за конкретный ответ.
Еще один вопрос:
Я правильно понимаю, что наследника формы необходимо также обязательно регистрировать?
Delphi
1
2
3
4
procedure Register;
begin
  RegisterComponents('MyComponents',[TMyForm]);
end;
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
17.11.2015, 00:29 7
Цитата Сообщение от Egor_SES Посмотреть сообщение
Я правильно понимаю, что наследника формы необходимо также обязательно регистрировать?
Не правильно.
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
17.11.2015, 00:39  [ТС] 8
не работает.
Создал модуль с потомком формы.
подключил к проекту.
Создал форму потомка, на ней три Edit.
Создал событие и написал обработчик.
Событие не возникает.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
17.11.2015, 00:58 9
Цитата Сообщение от Egor_SES Посмотреть сообщение
не работает.
Код показывай. И версию Дельфи скажи.
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
17.11.2015, 01:31  [ТС] 10
Версия XE5
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit MyForm;
 
interface
 
uses
  SysUtils, WinTypes, Messages, Classes, Controls, Graphics, Forms,
  Menus, StdCtrls;
 
type
 
TEdit = class(StdCtrls.TEdit)
  protected
    procedure Change; override;
  end;
 
TEditChangedEvent = procedure(Sender: TObject; Edit: TEdit) of object;
 
TMyForm = class(TForm)
  private
    FEditChanged: TEditChangedEvent;
  public
     {}
  published
    property OnEditChanged: TEditChangedEvent read FEditChanged write FEditChanged;
  end;
 
procedure Register;
 
implementation
 
procedure TEdit.Change;
  begin
    inherited;
    if Assigned(Owner) and (Owner is TMyForm) then
      if Assigned(TMyForm(Owner).OnEditChanged) then
         TMyForm(Owner).OnEditChanged(Owner, Self);
  end;
 
procedure Register;
begin
  RegisterComponents('MyComponents',[TMyForm]);
end;
 
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
unit Unit4;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MyForm, StdCtrls;
 
type
 
  TForm4 = class(TMyForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    procedure onEditChanged(Sender: TObject; Edit: TEdit);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form4: TForm4;
 
implementation
 
{$R *.dfm}
 
procedure TForm4.onEditChanged(Sender: TObject; Edit: TEdit);
begin
label1.Caption:=Edit.Text;
end;
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
17.11.2015, 10:03 11
Egor_SES, регистрация не обязательна

Код "подмены" класса TEdit следует интегрировать в юниты всех форм, где есть объекты TEdit, события которых требуется отслеживать
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
17.11.2015, 22:33  [ТС] 12
Исправил как было указано.
Все равно не работает.
Прошу подсказать, что не так.
Код ниже:

unit main;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, StdCtrls;

type

TEdit = class(StdCtrls.TEdit)
protected
procedure Change; override;
end;

TEditChangedEvent = procedure(Sender: TObject; Edit: TEdit) of object;

TMyForm = class(TForm)
private
FEditChanged: TEditChangedEvent;
public
{}
published
property OnEditChanged: TEditChangedEvent read FEditChanged write FEditChanged;
end;

TForm4 = class(TMyForm)
Label1: TLabel;
procedure onEditChanged(Sender: TObject; Edit: TEdit);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form4: TForm4;

implementation

{$R *.dfm}

procedure TEdit.Change;
begin
inherited;
if Assigned(Owner) and (Owner is TMyForm) then
if Assigned(TMyForm(Owner).OnEditChanged) then
TMyForm(Owner).OnEditChanged(Owner, Self);
end;

procedure TForm4.FormCreate(Sender: TObject);
var i:integer;
AEdit:TEdit;
begin
for i:=1 to 3 do
begin
AEdit:=TEdit.Create(Form4);
with AEdit do
begin
Parent:=Form4;
Left:=200;
top:=Height*(i-1);
Name:='Edit'+IntToStr(i);
end;
end;
end;

procedure TForm4.onEditChanged(Sender: TObject; Edit: TEdit);
begin
label1.Caption:='Rabotaet';
end;

end.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
17.11.2015, 22:41 13
Цитата Сообщение от Egor_SES Посмотреть сообщение
Все равно не работает
А где назначение обработчика события формы OnEditChanged ?
Нет его, потому и не работает.
0
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
17.11.2015, 22:48  [ТС] 14
В самом низу:

procedure TForm4.onEditChanged(Sender: TObject; Edit: TEdit);
begin
label1.Caption:='Rabotaet';
end;
0
Заблокирован
17.11.2015, 22:51 15
мне интересно, а что за объект будет обрабатывать событие OnEditChanged полученной формы? Ведь такой объект (с методом-обрабочиком) должен присутствовать, иначе городить коллбэк наружу из клааса формы не имеет никакого смысла.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
17.11.2015, 22:53 16
Цитата Сообщение от Egor_SES Посмотреть сообщение
В самом низу
В самом низу сам метод-обработчик.
А где он назначается свойству-событию OnEditChanged ?
Нигде.
1
0 / 0 / 0
Регистрация: 15.10.2015
Сообщений: 13
18.11.2015, 00:02  [ТС] 17
mss,
Спасибо за помощь.
Все заработало.
Остался чисто практический вопрос, касающийся правильности написания кода в классическом понимании:
Необходимо ли выносить создание класса TMyForm в отдельный модуль?
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
18.11.2015, 00:39 18
Цитата Сообщение от Egor_SES Посмотреть сообщение
Остался чисто практический вопрос, касающийся правильности написания кода в классическом понимании:
Необходимо ли выносить создание класса TMyForm в отдельный модуль?
Это не столь практический, сколь теоретический вопрос. Который должен решать архитектор проекта (если есть и тот и другой), а не программист.
Твоя программа работает? Значит код написан правильно.
0
18.11.2015, 00:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2015, 00:39
Помогаю со студенческими работами здесь

Динамическое создание компонентов и подписка их на события
Здравствуйте! Меня интересует вопрос: как можно создать что-нибудь по заготовке? Звучит туманно, но...

Цвет формы и компонентов
Привет. Цвет на трек барах и Page контроле не меняется сразу, а только если я кликну по каждому из...

Выравнивание компонентов по центру формы.
Form6.FormStyle:=fsStayOnTop; Form6.Width:=Screen.Width; Form6.Height:=Screen.Height; ...

Скрытие всех компонентов с формы
Приветствую. Как скрыть все компоненты с формы? Для каждого компонента прописывать visible := false...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru