Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
172 / 62 / 11
Регистрация: 22.12.2015
Сообщений: 2,506
1

Как выделить класс-перехватчик в отдельный модуль?

19.10.2019, 16:00. Просмотров 1439. Ответов 5
Метки нет (Все метки)

Всем здравствуйте.

Если переопределённых свойств, методов стандартных компонентов накапливается много, держать их в одном модуле с основной программой становится неудобно. Хотелось бы иметь отдельный модуль с классом-перехватчиком.
Pascal
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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
{ TEdit }
type
    TEdit = class(StdCtrls.TEdit)
    public
        procedure Click; override;
    end;
{ TForm1 }
  TForm1 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Edit3: TEdit;
      Memo1: TMemo;
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.lfm}
{ TForm1 }
procedure TEdit.Click;
begin
  inherited;
  Form1.Memo1.Lines.Add('Клик по некоторому окну редактирования');
end;
 
end.
Пусть этот модуль будет называться EditEx.pas.
Как его подключить и как подключить основной модуль (Unit1) к нему, если конечно это возможно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2019, 16:00
Ответы с готовыми решениями:

Выделить отдельный класс двоичных чисел
Здравствуйте, нужна помощь, в программировании полный ноль, написал кое-как простенький...

Как добавить компоненту новое свойство используя класс-перехватчик?
Всем здравствуйте. Ознакомился с содержимым статьи...

Класс перехватчик, заполнить пустые ячейки грида строкой (при повторном нажатии - очистить как было)
Задание: при нажатии клавиши F11 все пустые ячейки Cells заполняются строкой из трех символов ###,...

Как выделить отдельный пункт меню жирным шрифтом
Добрый День Друзья! Не могу найти информацию, как сделать отдельный пункт меню в joomla...

5
879 / 582 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
19.10.2019, 20:27 2
Что значит "как выделить"? Как вы обычный выделяете? Точно так же как и обычный, никакой разницы.

Добавлено через 1 минуту
Лишь возможен конфликт в Uses - получится что и в StdCtrls и в вашем EditEx будут классы с одинаковым именем.
Вероятно оно будет чувствительно к порядку следования модулей в Uses.

Добавлено через 2 минуты
Добавил в перехватчик public-поле FMemo - оно оказалось доступно только если модуль EditEx указан после StdCtrls.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30669 / 20015 / 7830
Регистрация: 22.10.2011
Сообщений: 34,842
Записей в блоге: 6
19.10.2019, 22:23 3
Цитата Сообщение от jkrnd Посмотреть сообщение
если конечно это возможно
Это возможно, но не нужно. Потому что у тебя в классе-перехватчике идет явное обращение к одному из полей формы. То есть, этот перехватчик должен знать еще и о классе TForm1, и о его содержимом. Ну и на кой он такой нужен? А не будет Form1 - что будешь делать? Зачем выносить это в отдельный модуль, если оно гвоздями прибито к модулю текущему?
1
GoodWeather
20.10.2019, 00:56
  #4

Не по теме:

Ну я-то к TEdit сейчас приделывал public-поле FMemo, и если оно Assigned(), то что-то туда добавлять.
И при создании формы можно Edit1.FMemo := Memo1;.

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30669 / 20015 / 7830
Регистрация: 22.10.2011
Сообщений: 34,842
Записей в блоге: 6
20.10.2019, 01:20 5
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

В таком случае я бы сделал:
Pascal
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
unit MyEdit;
 
interface
uses StdCtrls;
 
type
  { TEdit }
  TEdit = class(StdCtrls.TEdit)
  public
    LogControl : TMemo; static; // одно поле для всех экземпляров, а не для каждого отдельное
  protected
    procedure Click; override;
  end;
 
implementation
 
{ TEdit }
 
procedure TEdit.Click;
begin
  inherited Click;
  if Assigned(LogControl) then
    LogControl.Lines.Add('Клик по окну редактирования: ' + Name);
end;  
 
end.
+
Pascal
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
  TEdit.LogControl := Memo1; // ну и обращаемся, соответственно...
end;
1
172 / 62 / 11
Регистрация: 22.12.2015
Сообщений: 2,506
20.10.2019, 06:26  [ТС] 6
Всем спасибо. У меня были проблемы с тем куда вставить Uses. Для основного модуля он в interface, для выделенного модуля класса - в inplementation. Иначе - конфликт. Понимаю что связывать выделенный класс-перехватчик с конкретным модулем незачем. Делаю это чисто для демонстрации.
Pascal
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
unit EditEx;
 
{$mode objfpc}{$H+}
 
interface
 
uses
    Classes, SysUtils, StdCtrls;
 
{ TEdit }
type
    TEdit = class(StdCtrls.TEdit)
    public
        procedure Click; override; 
    end;
 
implementation
uses Unit1;
procedure TEdit.Click;
begin
  inherited;
 
  Form1.Memo1.Lines.Add('Клик по некоторому окну редактирования');
end;
end.  
 
+
 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditEx;
type
{ TForm1 }
  TForm1 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Edit3: TEdit;
      Memo1: TMemo;
  private
 
  public
 
  end;
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
 
end.
если не трудно приведите пример на паскале как добавить своё свойство в этот класс-перехватчик.
Как переопределить событие с параметрами, например, OnKeyPress? Наверное это нужно выделить в отдельную тему?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2019, 06:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Класс перехватчик к TForm
Добрый день, добавляю к TForm доп строку namespace SLE { class TF : public Vcl::Forms::TForm...

Как введёному числу выделить отдельный регион памяти через функцию virtualAlloc?
Как введёному числу выделить отдельный регион памяти через функцию virtualAlloc?

Как правильно вывести код в отдельный модуль
У меня есть код public void getFahrenheit(String celsius) { SoapObject request = new...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.