sender as

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

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

Re: sender as

Сообщение Verx0Laz » 11.02.2016 01:01:32

А вот интересно, на сколько именно в данном практическом случае были оправданы эти "танцы в лазерном дыму"? Может, автору данного поста просто надо было прописать одну трёхстрочную процедурку в трёх ОнЧенжях?
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: sender as

Сообщение zub » 11.02.2016 01:08:20

Флейм есть флейм, насоветовали, теперь разгребаем. То что было нужно автору уже никому не интересно))

Кстати вот простой пример ущербности формы как основы для логики
есть у нас какойнить LoadDataFromInternet, он прописан в onClick на нескольких кнопках и на паре пунктов меню (кстати, как его заюзать дизайнером на нескольких формах?). В какойто момент соединение с инетом пропадает, догично временно задисаблить всё что имеет LoadDataFromInternet в onClick. Что будем делать?
Код: Выделить всё
Procrdure TmyForm.onInternetLost(...);
begin
  ...
  LoadButton1.disable;
  ...
  LoadButton10.disable;
  LoadMenuItem1.disable;
  ...
  LoadMenuItem10.disable;
  ...
end;

?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение stanilar » 11.02.2016 01:33:16

zub писал(а):Я уже сказал про onResize и прочую подобную пакость, которая бизнес логике ненужна

Нет, не нужна. Ее можно вынести в TMyMyForm.

zub писал(а):Если при этом mySuperBusinessUnit ничего не будет знать о TmyForm (т.е. форма и всё что связано с гуем не будет фигурировать в обоих uses`ах mySuperBusinessUnit) можно будет говорить о полном разделении.

Так если TmyForm унаследовать от TMyBiznessObject тоже можно будет сказать о разделении.
zub писал(а):Кстати как вы с контролами поступаете? утягиваете в консоль? Но если в консоли они не будут проинициализированы, то и tedit.text запросить нельзя...

Для консоли TMyEdit будет иметь другую реализацию, в которой можно будет и .text запросить.

zub писал(а):Не понял, подробнее что и где обломится?

Так, о чем это мы? Ах да... В потрохах вкл неважно, что конкретный экземпляр формы будет создавать, TEdit или TMyEdit, потому что реадер ищет или зарегестрированный класс, или наследник. Именно поэтому "хак" из первых постов возможен. Правдивость этого утверждения предлагаю проверить Вам, как более заинтересованному.

Добавлено спустя 10 минут:
zub писал(а):Что будем делать?

Ну и зачем ты код привел? Мне пришлось долго протирать свой хрустальный шар, но из того что мне понятно, следует такой ответ: В TButton надо определить пустой метод disable.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение Verx0Laz » 11.02.2016 01:51:48

И тут мы обнаруживаем себя внутри одной очень старой задачи :D

http://absite.ru/humor.php?pg=32
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: sender as

Сообщение zub » 11.02.2016 02:05:45

Нет, не нужна. Ее можно вынести в TMyMyForm.

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

Так если TmyForm унаследовать от TMyBiznessObject тоже можно будет сказать о разделении.

>>а каже тот факт что в дизайнере можно работать только с наследником TForm в качестве формы?
тогда и TMyBiznessObject придется унаследовать от TForm... Вы злоупотребляете наследованием, наследовать нужно вещи которые имею общие свойства и какието определенные свойства в наследниках нужно развить.
Мы же обсуждаем разделение бизнеса и гуя. т.е. это абсолютно разные вещи с разными потребностями. наследование тут ненадо, надо обертки.

Для консоли TMyEdit будет иметь другую реализацию, в которой можно будет и .text запросить.

Ох едтить... а говорите всё легко и просто. Так делать совсем нестоит, ибо это уже не дажа копипаста кода, а мокрые сны какието про скрещение ужа с ежом.
Я бы это понял если бы поднялась тема про организацию для LCL бакенда который работает в консоли (да, у меня тоже фантазия есть) но в свете простого разделения гуя от логики...

Так, о чем это мы? Ах да... В потрохах вкл неважно, что конкретный экземпляр формы будет создавать, TEdit или TMyEdit, потому что реадер ищет или зарегестрированный класс, или наследник. Именно поэтому "хак" из первых постов возможен. Правдивость этого утверждения предлагаю проверить Вам, как более заинтересованному.

Я уже проверил о чем отчитался на прошлой странице. обломов нет. работает и даже вроде разобрался почему работает.
В чем должен заключаться облом?

Ну и зачем ты код привел? Мне пришлось долго протирать свой хрустальный шар, но из того что мне понятно, следует такой ответ: В TButton надо определить пустой метод disable.

помогу с протиркой, я совсем незнаю LCL и грешным делом думал что метод .disable у контролов есть, оказалось что есть только свойство .Enabled
Код: Выделить всё
Procrdure TmyForm.onInternetLost(...);
begin
  ...
  LoadButton1.Enabled:=false;
  ...
  LoadButton10.Enabled:=false;
  LoadMenuItem1.Enabled:=false;
  ...
  LoadMenuItem10.Enabled:=false;
  ...
end;

но суть не в этом, суть в том что понадобилось запретить какоето действие. как задисаблить все связанные с ним контролы?
Юзая onЧетоТам никак(( головой вспомнить все связанные контролы и руками набросать процедуру подобную приведенной выше
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение stanilar » 11.02.2016 02:09:13

zub писал(а):Юзая onЧетоТам никак

Ну как-же никак, если в Вашем коде именно такое событие и написано?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение zub » 11.02.2016 02:11:44

Это ерунда не метод. Головой вспоминать приходится, а если потом какойнить контрол добавится?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение stanilar » 11.02.2016 02:17:23

zub писал(а): а если потом какойнить контрол добавится?

Вот именно об этом и речь. Если код предусматривает, что TForm имеет две разных реализации, то у Вас есть гарантия, что в обоих реализациях Вы не забудете о добавлении нового объекта. А вот если из формы дергать методы бизнес объекта, то может получится, что две реализации по разному работают с бизнес объектом.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение zub » 11.02.2016 02:24:23

Разделение в моем понимании выглядит примерно так:
формы, на них контролы, контролы связаны с экшенами, а экшены уже вызывают методы бизнес объекта.
остальное от лукавого и выдавание желаемого за действительное.

Добавление контрола никак не влияет на бизнеслогику, добавление логики влияет на контролы. Разделением и введением прокладки в виде экшенов все проблемы решаются
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение stanilar » 11.02.2016 02:33:31

zub писал(а):Разделением и введением прокладки в виде экшенов все проблемы решаются

Ну тогда Вам тем более ничто не мешает унаследовать TForm от TActionList, а события ОнЧтоТоТам переопределить как события TAction.

zub писал(а):Добавление контрола никак не влияет на бизнеслогику, добавление логики влияет на контролы.

Речь не совсем о взаимном влиянии, но ночером мне уже что-то сложно соображать.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

Сообщение zub » 11.02.2016 02:36:08

>>Ну тогда Вам тем более ничто не мешает унаследовать TForm от TActionList, а события ОнЧтоТоТам переопределить как события TAction.
:shock: действительно, пора спать
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: sender as

Сообщение sign » 11.02.2016 08:36:01

Kemet писал(а):
stanilar писал(а):Может написать класс-хелпер для TEdit?
Хелперы - ЗЛО. Их наличие говорит о том, что программист не использовал мозг при разработке проекта.

Вот у меня есть helper
Код: Выделить всё
  TIniPropStorageHelper = class helper for TIniPropStorage
  public
    procedure WriteColor(const Ident: string; Value: TColor);
    function  ReadColor(const Ident: string; DefaultValue: TColor): TColor;
    procedure WriteDate(const Ident: string; Value: TDateTime);
    function ReadDate(const Ident: string; DefaultValue: TDateTime): TDateTime;
  end;

Где тут зло?
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: sender as

Сообщение Лекс Айрин » 11.02.2016 10:26:36

zub писал(а): В какойто момент соединение с инетом пропадает, догично временно задисаблить всё что имеет LoadDataFromInternet в onClick. Что будем делать?


а почему не сделать по другому?

Код: Выделить всё
Var
     Online:boolean;

Procedure TmyForm.onInternetLost(...);
begin
...
Online:=false;
....
end;

LoadButton1.onRedraw(...)// могу ошибаться с использованием нужной процедуры...
LoadButton1.enable:=Online;


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

Re: sender as

Сообщение stanilar » 11.02.2016 17:17:07

sign писал(а):Где тут зло?

Ну тут у вас хелпер вместо обертки, поэтому сложно что возразить, кроме того что хелпер - возможность языка, а обертка - решение на уровне проектирования. Речь шла о том использовании хелпера, когда он используется для доступа к закрытым методам класса.

Добавлено спустя 52 минуты 51 секунду:
stanilar писал(а):хелпер вместо обертки

Скажу даже больше, в Вашем коде имеет смысл написать полноценного наследника, а не хелпер. Как вы будете расширять функционал в дальнейшем? Писать хелпер к хелперу?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: sender as

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

stanilar писал(а):Как вы будете расширять функционал в дальнейшем? Писать хелпер к хелперу?


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

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru