powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / формы и generics
23 сообщений из 23, страница 1 из 1
формы и generics
    #39663775
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unit A:
Код: pascal
1.
2.
3.
4.
5.
6.
type
  TBaseForm = class(TForm)
  end;

  TBaseForm<T: TObject> = class(TBaseForm)
  end;


unit B:
Код: pascal
1.
2.
3.
4.
type
  TModelForm = class(TBaseForm<TModel>)
  
  end;


При открытии unit B в IDE ошибка. В runtime ошибки нет.
Нужен хороший путь обхода.
Сейчас используется баг в IDE:
Код: pascal
1.
2.
3.
4.
5.
{$include DesignerPatch.inc}
type
  TModelForm = class({$IFDEF DESIGNER_PATCH}TBaseForm<TModel>{$ELSE}TBaseForm{$ENDIF})
  
  end;


DesignerPatch.inc:
Код: pascal
1.
{$DEFINE DESIGNER_PATCH}



Разработчикам Delphi IDE на заметку: было бы правильно если бы дизайнер умел работать с такими формами, т.е. не смотрел на <...>, а смотрел только на имя класса.
...
Рейтинг: 0 / 0
формы и generics
    #39663781
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭкий вы оригинал.
В чём? :)
...
Рейтинг: 0 / 0
формы и generics
    #39663787
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeergreatЭкий вы оригинал.
В чём? :)И генерик формы и подпорки с мнимым дейфайном - это оригинально.

Неужто по простому нельзя было? :)
...
Рейтинг: 0 / 0
формы и generics
    #39663797
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatNickDeeпропущено...

В чём? :)И генерик формы и подпорки с мнимым дейфайном - это оригинально.

Неужто по простому нельзя было? :)

Генерик формы и фреймы - это не оригинально. Это удобно. Просто в IDE баг.
Погуглите: "delphi generic form designer" или "c# generic form designer".
...
Рейтинг: 0 / 0
формы и generics
    #39663807
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень хочется узнать, для чего все это
форма - это UI
зачем ей <> ?
а для классов дженерики работают норм
...
Рейтинг: 0 / 0
формы и generics
    #39663812
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin,

+1.

Но тут в гугль посылают. :)
...
Рейтинг: 0 / 0
формы и generics
    #39663871
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтото подобное репортили еще 6 лет назад .

Всем пофиг.
...
Рейтинг: 0 / 0
формы и generics
    #39663879
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinочень хочется узнать, для чего все это
форма - это UI
зачем ей <> ?
а для классов дженерики работают норм
У формы есть property Data. Оно должно возвращать наследника от TModel, в зависимости от того какой нужен.
Например:
Код: 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.
type
  {$M+}
  TModel = class
  public
    constructor Create; virtual;
  end;
  {$M-}

  TModelClass = class of TModel;

  TBaseForm = class(TForm)
  private
    FData: TModel;
  protected
    function GetDataClass: TModelClass; virtual; abstract;
  public
    constructor Create(...); virtual;
    property Data: TModel read FData;
  end;

  TBaseForm<T: TModel> = class(TBaseForm)
  private
    FData: T;
    function GetData: T;
  protected
    function GetDataClass: TModelClass; override;
  public
    property Data: T read GetData;
  end;

implementation

constructor TBaseForm.Create(...);
begin
  inherited Create(AOwner);
  FData := TModelClass.Create;
end;

function TBaseForm.GetData: T;
begin
  PPointer(@Result)^ := Pointer(inherited Data);
end;

function TBaseForm.GetDataClass: TModelClass;
begin
  Result := T;
end;


Внутри наследника от TBaseForm<TUser> будет свойство Data: TUser.
Внутри наследника от TBaseForm<TDoc> будет свойство Data: TDoc.
У каждго наслденика на форму накиданы свои компоненты.
Без генериков получается много одинакового кода.
...
Рейтинг: 0 / 0
формы и generics
    #39663880
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся...
Код: 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.
type
  {$M+}
  TModel = class
  public
    constructor Create; virtual;
  end;
  {$M-}

  TModelClass = class of TModel;

  TBaseForm = class(TForm)
  private
    FData: TModel;
  protected
    function GetDataClass: TModelClass; virtual; abstract;
  public
    constructor Create(...); virtual;
    property Data: TModel read FData;
  end;

  TBaseForm<T: TModel> = class(TBaseForm)
  private
    FData: T;
    function GetData: T;
  protected
    function GetDataClass: TModelClass; override;
  public
    property Data: T read GetData;
  end;

implementation

constructor TBaseForm.Create(...);
begin
  inherited Create(AOwner);
  FData := GetDataClass.Create; // тут
end;

function TBaseForm<T>.GetData: T; // тут
begin
  PPointer(@Result)^ := Pointer(inherited Data);
end;

function TBaseForm<T>.GetDataClass: TModelClass; // и тут
begin
  Result := T;
end;
...
Рейтинг: 0 / 0
формы и generics
    #39663881
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
короче, я так понял, что аффтар недавно узнал про генерики,
теперь очень хочется хоть куда-то их воткнуть.
Ну хоть куда-то
...
Рейтинг: 0 / 0
формы и generics
    #39663882
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NickDeeБез генериков получается много одинакового кода.

потому что архитектура изначально кривая и непродуманная
...
Рейтинг: 0 / 0
формы и generics
    #39663888
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это бессмысленно. это могло иметь смысл, если форма создавала бы динамически UI для Data
но этого нет и не будет
а формы будут СОВСЕМ разных типов. это же не наследование
тогда зачем одинаковым формам разные Data ?
короче, даже с т.з. сахара это имхо нелепица (
...
Рейтинг: 0 / 0
формы и generics
    #39663990
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я понял.
NickDeeУ формы есть property Data. Оно должно возвращать наследника от TModel, в зависимости от того какой нужен.
Автор просто не хочет делать такие декларации:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TUserForm = class(TBaseForm)
  protected
    function GetDataClass: TModelClass; override;
  end;

  function TUserForm.GetDataClass: TUserClass;
  begin
     Result := TUser;
  end;
...
Рейтинг: 0 / 0
формы и generics
    #39663997
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одному мне кажется, что смешивать модели и UI не очень хорошо ?
...
Рейтинг: 0 / 0
формы и generics
    #39664082
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,
Дело вкуса. Я использую интерфейсы для решения данной задачи :)
...
Рейтинг: 0 / 0
формы и generics
    #39664119
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Ну я понял.
NickDeeУ формы есть property Data. Оно должно возвращать наследника от TModel, в зависимости от того какой нужен.
Автор просто не хочет делать такие декларации:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TUserForm = class(TBaseForm)
  protected
    function GetDataClass: TModelClass; override;
  end;

  function TUserForm.GetDataClass: TUserClass;
  begin
     Result := TUser;
  end;



Чуть больше:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type
  TUserForm = class(TBaseForm)
  private
    function GetData: TUser;
  protected
    function GetDataClass: TModelClass; override;
  public
    property Data: TUser read GetData;
  end;

function TUserForm.GetData: TUser;
begin
  Result := TUser(inherited GetData);
end;

function TUserForm.GetDataClass: TModelClass;
begin
  Result := TUser;
end;
...
Рейтинг: 0 / 0
формы и generics
    #39664121
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiОдному мне кажется, что смешивать модели и UI не очень хорошо ?Смешивать - значит держать в одном классе ссылку на другой? Если это нехорошо, то как вообще ООП будет работать?
...
Рейтинг: 0 / 0
формы и generics
    #39664123
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не люблю школьников.
особенно пристарелых.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
формы и generics
    #39664129
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinэто бессмысленно. это могло иметь смысл, если форма создавала бы динамически UI для Data
но этого нет и не будет
а формы будут СОВСЕМ разных типов. это же не наследование
тогда зачем одинаковым формам разные Data ?
Вы не знаете как и что у меня создаётся.
...
Рейтинг: 0 / 0
формы и generics
    #39664255
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желание в какой-то мере понятное, НО (имхо) такой подход не стоит гемора ради того, чтобы не писать Form.Data as TUser
...
Рейтинг: 0 / 0
формы и generics
    #39664341
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, можно для форм сделать интерфейсы для доступа к данным, а в шаблонных классах данных реализовывать интерфейсы.

И по сути тогда не важно какого класса данные, главное, чтобы поддерживали нужный для формы интерфейс.
...
Рейтинг: 0 / 0
формы и generics
    #39664351
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отделяйте мух от от котлет.

зы: и я вас умоляю, ну не ежьте вы на ночь сырых помидоров... (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
формы и generics
    #39664450
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо свойства используйте дженерик функцию. Тогда не надо делать класс формы таким. Изначально форма это view. View по определению не может быть дженерик. Это the bad practics.
Либо сделайте класс дженерик и пусть ваша view его отдает. А он уже отдаст тип который заложили.

Кстати. По идее так будет работать.
TFormAAA = class(TFormGeneric<TUser>);
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / формы и generics
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]