Здравствуйте, turbocode, Вы писали:
T>Не поможет, а на мобильниках такое вообще не взлетит.
А вот коллеги на sql.ru и мои собственнные глаза (смотрел на iPhone) говорят об обратном. Месье теоретик?
Там компилируется в JavaScript (sencha framework), а его много кто и без Delphi использует.
C>Нет смысла. В современных веб приложениях основная часть кода UI выполняется в браузере. C>Возможность накидывания контролов на формы тут не панацея.
Так финальное приложение и выполняется в браузере. Просто делать такое приложение на UniGUI на порядок быстрее.
S>>Вот пример, если я правильно тебя понял.
M>Я так понял, это что-то для разработчиков. Конечный вменяемый продукт есть?
Как я понял, это возможность писать приложение на дельфях как обычное нативное, и путем несложных манипуляций его можно заставить работать в браузере. Выглядит не хуже других дельфовых приложений, право на жизнь имеет, особенно для внутренних корпоративных проектов.
Хотя сам язык бы давно надо на помоечку. Зря они C++ Builder довеском сделали, был бы основным — имхо летело бы лучше. А Pascal — можно вторым, для формошлепшиков, которые C++ не осилили. Да и расширение — property — довольно удобно, им надо было напрячься и протащить его в стандарт C++
Здравствуйте, cjazz, Вы писали:
G>>http://unigui.com/
G>>Image: webapp.png
G>>Есть смысл использовать для web-приложений в шароваре?
C>Нет смысла. В современных веб приложениях основная часть кода UI выполняется в браузере. C>Возможность накидывания контролов на формы тут не панацея.
Так я так понял, что в этом то и идея — накидать контролов на форму, накидать обработчиков событий, и все это дело скомпилить в сборку-dll'ку, которая эти формы в бравзер выводит, и часть логики обработчиков выносится на сторону клиента/бравзера. Интересно, возможность компиляции в нативное приложение осталась или нет?
C>>Нет смысла. В современных веб приложениях основная часть кода UI выполняется в браузере. C>>Возможность накидывания контролов на формы тут не панацея.
W>Так финальное приложение и выполняется в браузере. Просто делать такое приложение на UniGUI на порядок быстрее.
Он видимо демки не смотрел. А я посмотрел. Выглядит аляповато, как и всё дельфовое, но право на жизнь имеет. Я только не понял, а нативное приложение можно из этого собрать, или нет?
Здравствуйте, icezone, Вы писали:
M>>А Pascal — можно вторым, для формошлепшиков, которые C++ не осилили.
I>А можно объяснить связь между Паскалем и формошлепаньем?
Батхерт написавшего что-то серьезное на Дельфи вижу я в твоем посте
А связь простая. Паскаль не предназначен и не приспособлен для написания чего-то сложного. В юз-кейсе — создать обработчик события контрола и в нем одной строчкой изменить состояние другого контрола — можно и на Паскале писать. Это, собственно, и есть формошлепство.
Что-то более сложное писать на Паскале — это адЪ. Не, если C++ не знаешь, то норм. Но если ты что-то писал на плюсах, а потом нуждажизнь заставила сесть за Дельфи — вот тут и понимаешь глубину своего падения
Здравствуйте, wamaco, Вы писали: C>>Нет смысла. В современных веб приложениях основная часть кода UI выполняется в браузере. C>>Возможность накидывания контролов на формы тут не панацея.
W>Так финальное приложение и выполняется в браузере. Просто делать такое приложение на UniGUI на порядок быстрее.
Быстрее, до тех пор пока не понадобится изменить клиентский код. Вообще забавная штука, для простых проектов пойдет.
C>Быстрее, до тех пор пока не понадобится изменить клиентский код. Вообще забавная штука, для простых проектов пойдет.
Можно тут по-подробнее... Зачем менять клиентский код?
Для этого есть специалист, который за денежку все поменяет на сервере.
Мы же тут деньги зарабатываем, а не предоставляем клиентский код менять!
Насчет "забавной штуки"... знаю проект, который тянет 600 одновременно работающих клиентов, пишущих и читающих БД.
Нет, т.к. Дельфи то что компилит в нэйтив и потому быстрее явы на андроид например.
Кроме того Дельфи и сам кросс-платформа и потому в одну кросс платформу вставлять другую
это какой-то театр абсурда.
Паскаль плохой — то из 1970 года что ли изречение? какая-то чушь, дельфийская версия просто, мощно, удобно, быстро.
Не понятно о каких таких сложных задачах речь идет, БПФ и DSP и 3D на нем все Ок... компилятор на нем еще 7 летиями
назад как курсовик написан.. что за такие сложны езадачи никак ни в какую не пишушщиеся ну прям ни в какую на Паскале...
Их просто нет, потому тот оратор и не назвал имен, а ограничился обезличенными обвинениями в адрес великого Паскаля
Здравствуйте, Marty, Вы писали:
M>А связь простая. Паскаль не предназначен и не приспособлен для написания чего-то сложного. В юз-кейсе — создать обработчик события контрола и в нем одной строчкой изменить состояние другого контрола — можно и на Паскале писать. Это, собственно, и есть формошлепство.
А что не так-то с Паскалем?
Ну кроме того, что пальцам больно набирать begin/end и когнитивного искажения "если МНЕ неудобно смотреть на begin/end, то всем неудобно".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, wamaco, Вы писали: C>>Быстрее, до тех пор пока не понадобится изменить клиентский код. Вообще забавная штука, для простых проектов пойдет. W>Можно тут по-подробнее... Зачем менять клиентский код?
Вот пример. Только что нашел у них баг: в окне которое открывается на Show Source Files , после перехода по табам отваливается прокрутка текста колесом мыши. Это в Сафари, а в Хроме все норм. Сколько времени займет поиск и исправление?
Скорее всего намного больше, чем время сэкономленное на "накидывании контролов".
W>Насчет "забавной штуки"... знаю проект, который тянет 600 одновременно работающих клиентов, пишущих и читающих БД.
Интересно, насколько команда Delphi программистов обходится дешевле в сравнении с .NET командой?
M>Что-то более сложное писать на Паскале — это адЪ. Не, если C++ не знаешь, то норм. Но если ты что-то писал на плюсах, а потом нуждажизнь заставила сесть за Дельфи — вот тут и понимаешь глубину своего падения
Угу, почему-то сишные программы тащут мегатонны всяких DLL и фреймворков за собой, в отличие от нативного кода, генерируемого в Delphi.
Здравствуйте, T4r4sB, Вы писали:
M>>А связь простая. Паскаль не предназначен и не приспособлен для написания чего-то сложного. В юз-кейсе — создать обработчик события контрола и в нем одной строчкой изменить состояние другого контрола — можно и на Паскале писать. Это, собственно, и есть формошлепство.
TB>А что не так-то с Паскалем? TB>Ну кроме того, что пальцам больно набирать begin/end и когнитивного искажения "если МНЕ неудобно смотреть на begin/end, то всем неудобно".
Ты еще then/else забыл
Еще я никак не могу запмнить, где там надо ставить ';', а где не надо.
Здравствуйте, T4r4sB, Вы писали:
M>>Ну и вообще, языковые средства крайне убоги
TB>Да что не так-то?
Никогда не пойму почему Delphi вызывает у некоторых такую попоболь. Не нравится, не пользуйся. Но нет, обязательно при каждом упоминании Delphi вылезет кто-то со своим ценным мнением.
Здравствуйте, Kerk, Вы писали:
K>Никогда не пойму почему Delphi вызывает у некоторых такую попоболь. Не нравится, не пользуйся. Но нет, обязательно при каждом упоминании Delphi вылезет кто-то со своим ценным мнением.
Да это с тех времён, когда на Дельфи за 5 минут делали программы с интерфейсом без утечек памяти, в то время, как сишно-крестовое сообщество представляло собой сборище кульных мамкиных какиров с пубертатной психологией, среди которых было круто как можно сильнее задолбать себя вознёй с АПИ, вознёй с управлением памятью. При этом эти какиры были уверены, что Дельфи всей этой возни не умеет.
А уж про то, что на С++ можно использовать деструкторы, не делать грубые касты, и тоже уберечь себя от кучи проблем, те какиры не знали и знать не желали, это же "путь неосилятора".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Marty, Вы писали:
M>Хотя сам язык бы давно надо на помоечку. Зря они C++ Builder довеском сделали, был бы основным — имхо летело бы лучше. А Pascal — можно вторым, для формошлепшиков, которые C++ не осилили. Да и расширение — property — довольно удобно, им надо было напрячься и протащить его в стандарт C++
Да не в языке дело. Какая разница, какой пиджак оденет дедушка-пенсионер: вельветовый или парусиновый? Он всё равно останется дедушкой-пенсионером. Так и формошлёпить — можно хоть на Visual Basic, но удобнее-то от этого не становится. Пока проект мал — разницы не чувствуешь, а затем начинается сбор граблей, некоторым из которых лет эдак десять, а то и пятнадцать... Ключевая проблема, что после ухода Хейлсберга никому этот Delphi уже не нужен был в менеджменте компании. Поэтому и не было развития, поэтому и стал он дедушкой. Хоть и подтянули его малость в Эмбаркадеро ребята, но тоже кончился у них интерес.
Здравствуйте, marcopolo, Вы писали:
M>Угу, почему-то сишные программы тащут мегатонны всяких DLL и фреймворков за собой, в отличие от нативного кода, генерируемого в Delphi.
А не приходилось ли многоуважаемому дону жонглировать с порядком установки компонент в палитру Delphi, чтобы открыть проект без ошибок в DFM? Или обращаться с двумя разными проектами, которые ожидали две разные версии одного и того же компонента (и с другим работать не могли)? Ну и рантайм-пакеты — суть те же DLL, их можно статически втянуть, раздувая EXE, либо точно так же тащить за собой, как те самые сишечки
В общем, у Delphi все те же проблемы, что у сишечки, только в профиль.
Здравствуйте, Mr.Delphist, Вы писали:
MD>А не приходилось ли многоуважаемому дону жонглировать с порядком установки компонент в палитру Delphi, чтобы открыть проект без ошибок в DFM?
Было что-то подобное. Но к конечному продукут это не имеет отношения.
\\Или обращаться с двумя разными проектами, которые ожидали две разные версии одного и того же компонента (и с другим работать не могли)?
Проблему с левыми компонентами я иногда решал созданием их в рунтайме.
Ну и рантайм-пакеты — суть те же DLL, их можно статически втянуть, раздувая EXE, либо точно так же тащить за собой, как те самые сишечки
MD>Хоть и подтянули его малость в Эмбаркадеро ребята, но тоже кончился у них интерес.
Главная их ошибка в том что они начали городить какой то там костыльный и бажный FireMonkey параллельно к VCL, вместо того что бы отвязать VCL от WinAPI и сделать ему кроссплатформенный рендеринг.
И получился бы такой себе продвинутый и приятный в использовании аналог QT но на базе VCL.
Здравствуйте, rean, Вы писали:
R>Но не проще ли эти промежуточные стадии выкинуть и сразу использовать HTML и Ajax?
Нет. Для более-менее серьёзной системы любое переписывание это адские затраты. Не только на саму разработку/тестирование, но и на внедрение в первую очередь. Так что финансово это интересный вариант.
Здравствуйте, turbocode, Вы писали:
T>Главная их ошибка в том что они начали городить какой то там костыльный и бажный FireMonkey параллельно к VCL, вместо того что бы отвязать VCL от WinAPI и сделать ему кроссплатформенный рендеринг.
FireMonkey был изначально 3rd-party, как тот же Indy, так что — чему удивляться
Насчёт костыльности — согласен полностью. Этим страдают все "всемогуторы", и даже бережно пестуемый сейчас Xamarin — не исключение.
T>И получился бы такой себе продвинутый и приятный в использовании аналог QT но на базе VCL.
Не получился бы. Там слишком сильно на Win32 API всё завязано, проще всё с нуля.
Здравствуйте, Marty, Вы писали:
M>Что-то более сложное писать на Паскале — это адЪ. Не, если C++ не знаешь, то норм. Но если ты что-то писал на плюсах, а потом нуждажизнь заставила сесть за Дельфи — вот тут и понимаешь глубину своего падения
M>>Что-то более сложное писать на Паскале — это адЪ. Не, если C++ не знаешь, то норм. Но если ты что-то писал на плюсах, а потом нуждажизнь заставила сесть за Дельфи — вот тут и понимаешь глубину своего падения
T>Извини, братка, это бред.
Хочу посмотреть на вашу реализацию какого-нибудь контейнера из stl
ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
Здравствуйте, cjazz, Вы писали:
C>Вот пример. Только что нашел у них баг: в окне которое открывается на Show Source Files , после перехода по табам отваливается прокрутка текста колесом мыши. Это в Сафари, а в Хроме все норм. Сколько времени займет поиск и исправление? C>Скорее всего намного больше, чем время сэкономленное на "накидывании контролов".
У них поддержка отличная, напиши, быстро поправят.
Версия пока 1-ая, дальше лучше будет!
Но подход и реализация супер!
Но Дельфи сам делает под мобильники! Самомлично делал! Все работает! Много разных компонент, на разные размеры укладывается на ура.
Нафига тут еще что-то кроме самого Дельфи?!?!
L>Но Дельфи сам делает под мобильники! Самомлично делал! Все работает! Много разных компонент, на разные размеры укладывается на ура. L>Нафига тут еще что-то кроме самого Дельфи?!?!
Так Вы делали нативные приложения видимо, а UniGUI позволяет разрабатывать WEB приложения! Это другое!
Здравствуйте, Marty, Вы писали:
M>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
Здравствуйте, Marty, Вы писали:
M>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
Ага. Уже почти лет 10 как прикрутили. Вот заметил закономерность. Хейтеры делфи нихрена про делфи не знают как правило.
Здравствуйте, Marty, Вы писали:
M>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
Ок, но ждём ответную реализацию на C++ образца начала 90-х годов.
Здравствуйте, wamaco, Вы писали:
W>Здравствуйте, loginx, Вы писали:
L>>Но Дельфи сам делает под мобильники! Самомлично делал! Все работает! Много разных компонент, на разные размеры укладывается на ура. L>>Нафига тут еще что-то кроме самого Дельфи?!?!
W>Так Вы делали нативные приложения видимо, а UniGUI позволяет разрабатывать WEB приложения! Это другое!
А разве html + css + JS + скажем фреймворки разные, тот же бутсрап разеве не позволяют делать Web приложения?
Ну и редактор формошлем в тутошней терминолокии, например адобовский ДримВивер...
Нафига еще тут еще какой-то юнигуи нужен? и так инструментов переизбыток! Уже инструментов больше чем заказчиков
Здравствуйте, gangastyle, Вы писали:
G>Есть смысл использовать для web-приложений в шароваре?
Я может чего то не понимаю, но в примере же sencha/extjs чистой воды, причем здесь Delphi?
Сделали обертку над потихоньку устаревающей технологией и предложили юзать разработчикам?
Здравствуйте, rkcsoft, Вы писали:
M>>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
R>Ок, но ждём ответную реализацию на C++ образца начала 90-х годов.
Дамы — вперед В смысле — только после васвашей реализации.
И не надо про начало 90ых мне тут заливать. Первые Дельфи (1.0 которые, и 2.0) еще можно отнести к началу 90ых, они для Win3.1 были. C++ Builder 1.0, который был бастардом, вышел в комплекте к Дельфи 3.0, билдер в3.0 — Дельфи 5, шестой билдер — дельфи 7. Это 2002ой год, какое тут начало 90ых?
В шестом билдере и мапы и вектора и прочий stl уже вовсю был
M>>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
K>Ага. Уже почти лет 10 как прикрутили. Вот заметил закономерность. Хейтеры делфи нихрена про делфи не знают как правило.
10 лет как? Ого, прогресс. Шаблоны, на минуточку, еще в Borland C++ 3.1 (от 1992 года) были (а в языке и в реализации Страуструпа и раньше). Любители Дельфи такие любители
Давай еще сравним Дельфи 2017 и C++ 2017?
А по поводу незнания — я дельфи по-любительски кушал начиная с версии 1, потом профессионально работал пару лет на дельфи 7. Тогда же понемногу подсадил коллег на билдер, и ты не поверишь, но они мне потом говорили, что на билдере можно решать такие задачи, которые на дельфи были в разряде нереализуемых
Так что кушать Дельфи еще раз не охота. Если C++ у них сейчас не довеском идет, как раньше, то, в принципе, можно глянуть. Но пока лень и не вижу смысла
Здравствуйте, Marty, Вы писали:
M>И не надо про начало 90ых мне тут заливать. Первые Дельфи (1.0 которые, и 2.0) еще можно отнести к началу 90ых, они для Win3.1 были. C++ Builder 1.0, который был бастардом, вышел в комплекте к Дельфи 3.0, билдер в3.0 — Дельфи 5, шестой билдер — дельфи 7. Это 2002ой год, какое тут начало 90ых?
В 2017м году-то тебе все это зачем? Ты в 2002 году не смог сдать курсовик на делфи и с тех пор не можешь этого забыть? Это многое бы объясняло.
M>>ЗЫ Слышал краем уха, вроде к последним дельфям прикрутили какое-то подобие шаблонов. Можно и с их помощью. Но интереснее посмотреть на классический Дельфи (5-7)
M>Пользователю софта на ваши шаблоны глубоко на**.
Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
M>>И не надо про начало 90ых мне тут заливать. Первые Дельфи (1.0 которые, и 2.0) еще можно отнести к началу 90ых, они для Win3.1 были. C++ Builder 1.0, который был бастардом, вышел в комплекте к Дельфи 3.0, билдер в3.0 — Дельфи 5, шестой билдер — дельфи 7. Это 2002ой год, какое тут начало 90ых?
K>В 2017м году-то тебе все это зачем? Ты в 2002 году не смог сдать курсовик на делфи и с тех пор не можешь этого забыть? Это многое бы объясняло.
Дельфидрочер?
У нас в вузе был только хардкор, а на дельфях я делал иногда халтуры да пару лет сопровождал один национальный бизнес
Здравствуйте, Marty, Вы писали:
M>>>И не надо про начало 90ых мне тут заливать. Первые Дельфи (1.0 которые, и 2.0) еще можно отнести к началу 90ых, они для Win3.1 были. C++ Builder 1.0, который был бастардом, вышел в комплекте к Дельфи 3.0, билдер в3.0 — Дельфи 5, шестой билдер — дельфи 7. Это 2002ой год, какое тут начало 90ых?
K>>В 2017м году-то тебе все это зачем? Ты в 2002 году не смог сдать курсовик на делфи и с тех пор не можешь этого забыть? Это многое бы объясняло.
M>Дельфидрочер?
Ты? Возможно. Не готов ставить тебе диагноз по интернету. От чего у тебя такая дичайшая попоболь-то? Объясни. Девушка ушла к дельфисту?
P.S. Для таких как ты тут есть специальный раздел. "Священные войны" называется. Не засирай форум.
M>Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
Имхо шаблоны и переопределения операторов только усложняют чтение кода, когда в проект нужно вносить изменения пару раз в год.
Здравствуйте, ukraineyalta, Вы писали:
M>>Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
U>Имхо шаблоны и переопределения операторов только усложняют чтение кода, когда в проект нужно вносить изменения пару раз в год.
Ты погоди, упоротый нам сейчас еще расскажет с аргументами, что скорость релиза новых фич зависит от скорости печати кода на клавиатуре.
M>>Еще я никак не могу запмнить, где там надо ставить ';', а где не надо.
TB>Я в С++ не могу запомнить. Ставлю ; везде, все смеются над моим кодом, хотя он компилится.
Правильно ставишm. Семиколоном кода не испортишь (только не ставь его сразу после for или if)
Смеются — дураки наверно. Пробовал им пальцы показывать? Тоже смеются?
M>>Ну и вообще, языковые средства крайне убоги
TB>Да что не так-то?
Здравствуйте, Marty, Вы писали:
M>Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
Коллега, вы что-то путаете. Быстрее считается в нашем новом мире php да JavaScript. Ну, или, си решетка, но уж никак не си плас плас.
M>>>Ну и вообще, языковые средства крайне убоги
TB>>Да что не так-то?
K>Никогда не пойму почему Delphi вызывает у некоторых такую попоболь. Не нравится, не пользуйся. Но нет, обязательно при каждом упоминании Delphi вылезет кто-то со своим ценным мнением.
Никак не пойму, почему в любом обсуждении любого вопроса в середине обсуждения кто-то вылезает со своим ценным мнением
K>>Никогда не пойму почему Delphi вызывает у некоторых такую попоболь. Не нравится, не пользуйся. Но нет, обязательно при каждом упоминании Delphi вылезет кто-то со своим ценным мнением.
TB>Да это с тех времён, когда на Дельфи за 5 минут делали программы с интерфейсом без утечек памяти, в то время, как сишно-крестовое сообщество представляло собой сборище кульных мамкиных какиров с пубертатной психологией, среди которых было круто как можно сильнее задолбать себя вознёй с АПИ, вознёй с управлением памятью. При этом эти какиры были уверены, что Дельфи всей этой возни не умеет. TB>А уж про то, что на С++ можно использовать деструкторы, не делать грубые касты, и тоже уберечь себя от кучи проблем, те какиры не знали и знать не желали, это же "путь неосилятора".
Здравствуйте, Marty, Вы писали:
M>Никак не пойму, почему в любом обсуждении любого вопроса в середине обсуждения кто-то вылезает со своим ценным мнением
Здравствуйте, Mr.Delphist, Вы писали:
M>>Угу, почему-то сишные программы тащут мегатонны всяких DLL и фреймворков за собой, в отличие от нативного кода, генерируемого в Delphi.
MD>А не приходилось ли многоуважаемому дону жонглировать с порядком установки компонент в палитру Delphi, чтобы открыть проект без ошибок в DFM? Или обращаться с двумя разными проектами, которые ожидали две разные версии одного и того же компонента (и с другим работать не могли)? Ну и рантайм-пакеты — суть те же DLL, их можно статически втянуть, раздувая EXE, либо точно так же тащить за собой, как те самые сишечки
MD>В общем, у Delphi все те же проблемы, что у сишечки, только в профиль.
Ага, спасибо. Я вот все помнил, что от билдера там по-любому тыщетонные по тем временам .bpl надо было за собой таскать, вроде не было варианта статически линковать, с дельфями казалось вроде, что при статической линковке можно было сэкономить, но тоже пухло выходило. Так что да, про мегатонны фреймворков без дельфи в отличие от нативного кода, генерируемого в Delphi, это враки
Здравствуйте, marcopolo, Вы писали:
MD>>А не приходилось ли многоуважаемому дону жонглировать с порядком установки компонент в палитру Delphi, чтобы открыть проект без ошибок в DFM?
M>Было что-то подобное. Но к конечному продукут это не имеет отношения.
Зато имеет непосредственное отношение к процессу разработки
M>\\Или обращаться с двумя разными проектами, которые ожидали две разные версии одного и того же компонента (и с другим работать не могли)?
M>Проблему с левыми компонентами я иногда решал созданием их в рунтайме.
Костыль? Или велосипедуницикл?
M>Ну и рантайм-пакеты — суть те же DLL, их можно статически втянуть, раздувая EXE, либо точно так же тащить за собой, как те самые сишечки
Те же самые сишечки ничего не раздувают и не тянут за собой. Да, понимаю, по нынешним временам это даже как-то не солидно
Здравствуйте, turbocode, Вы писали:
MD>>Хоть и подтянули его малость в Эмбаркадеро ребята, но тоже кончился у них интерес. T>Главная их ошибка в том что они начали городить какой то там костыльный и бажный FireMonkey параллельно к VCL, вместо того что бы отвязать VCL от WinAPI и сделать ему кроссплатформенный рендеринг. T>И получился бы такой себе продвинутый и приятный в использовании аналог QT но на базе VCL.
Путь Qt спорен. КуТешные приложения выглядят неродными на всех платформах
T>>И получился бы такой себе продвинутый и приятный в использовании аналог QT но на базе VCL. MD>Не получился бы. Там слишком сильно на Win32 API всё завязано, проще всё с нуля.
wxWidgets на каждой платформе завязан на нативное апи. И UI на нем на каждой платформе выглядит и работает, как родное
Здравствуйте, wamaco, Вы писали:
C>>Интересно, насколько команда Delphi программистов обходится дешевле в сравнении с .NET командой?
W>Разумеется команда Delphi дешевле, т.к. Delphi не в тренде! W>Вот такой вот парадокс, а на выходе иногда даже качественнее продукты получаются!
Здравствуйте, Marty, Вы писали:
C>>>Интересно, насколько команда Delphi программистов обходится дешевле в сравнении с .NET командой?
W>>Разумеется команда Delphi дешевле, т.к. Delphi не в тренде! W>>Вот такой вот парадокс, а на выходе иногда даже качественнее продукты получаются!
M>А иногда не получаются
был у нас случай на работе, заказали разработку, прибежали люди, стали про новые технологии рассказывать,
Java и C# втирать для реализации, все бы хорошо, но они СПЕЦЫ и ОЧЕНЬ востребованые, зарплата 200 тыщ.каждому!
Нашли Delphi программиста (двух), т.к. Delphi не в тренде, то и зарплата у них 65 тыщ.!
Сделали все в лучшем виде! Начальство довольно! да и не знает оно, что популярно, а что нет, оно только деньги платит!
Здравствуйте, loginx, Вы писали:
L>Нет, т.к. Дельфи то что компилит в нэйтив и потому быстрее явы на андроид например. L>Кроме того Дельфи и сам кросс-платформа и потому в одну кросс платформу вставлять другую L>это какой-то театр абсурда.
L>Паскаль плохой — то из 1970 года что ли изречение? какая-то чушь, дельфийская версия просто, мощно, удобно, быстро.
Пока ты не попробовал C++
L>Не понятно о каких таких сложных задачах речь идет, БПФ и DSP и 3D на нем все Ок... компилятор на нем еще 7 летиями L>назад как курсовик написан.. что за такие сложны езадачи никак ни в какую не пишушщиеся ну прям ни в какую на Паскале... L>Их просто нет, потому тот оратор и не назвал имен, а ограничился обезличенными обвинениями в адрес великого Паскаля
Тот оратор — это кто?
Великий Паскаль — это кто? Блез Паскаль? Или недоязык, который лег в основу ObjectPascal?
То, что компилятор написан как курсовик — это в плюс идет?
Сложные задачи ты все обозначил, остались простые: префиксное дерево (trie), совместимое по интерфейсу с std::map. Аналог std::map найди самостоятельно в библиотеке великих дельфей
K>>>В 2017м году-то тебе все это зачем? Ты в 2002 году не смог сдать курсовик на делфи и с тех пор не можешь этого забыть? Это многое бы объясняло.
M>>Дельфидрочер?
K>Ты? Возможно. Не готов ставить тебе диагноз по интернету. От чего у тебя такая дичайшая попоболь-то? Объясни. Девушка ушла к дельфисту?
Не готов? Смотри выше, я там выделил, как ты мне диагноз поставил Про попоболь не понял, а то, что у тебя были проблемы с курсачами и девушками — тут даже к фрейду не ходи
K>P.S. Для таких как ты тут есть специальный раздел. "Священные войны" называется. Не засирай форум.
M>>>Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
U>>Имхо шаблоны и переопределения операторов только усложняют чтение кода, когда в проект нужно вносить изменения пару раз в год.
K>Ты погоди, упоротый нам сейчас еще расскажет с аргументами, что скорость релиза новых фич зависит от скорости печати кода на клавиатуре.
Упоротый — это видимо я?
Ты еще в десны с украинцемялта стукнись, а то скучно
M>>Зато пользователю не насрать на скорость выпуска новых фич. Если все новые фичи сводятся к паре новых бесполезных кнопок в интерфейсе, то тут дельфи рулит. Если пользователю нужен новый функционал, то ему на шаблоны точно так же насрать, но он его получит гораздо быстрее, если разработчик умеет C++
R>Коллега, вы что-то путаете. Быстрее считается в нашем новом мире php да JavaScript. Ну, или, си решетка, но уж никак не си плас плас.
хз, хз, что у вас за новый да лучший мир
но вы что-то подменяете. Вы перечитайте то что выше, в том числе и своё сообщение, а после мы с вами подискутируем
M>wxWidgets на каждой платформе завязан на нативное апи. И UI на нем на каждой платформе выглядит и работает, как родное
В этом подходе есть один существенный недостаток, тебе нужно немного поправить поведение контрола под себя и ты в этот момент понимаешь что твой код перестает быть кроссплатформенным потому что в каждой платформе это нововведение делается разными способами.
W>был у нас случай на работе, заказали разработку, прибежали люди, стали про новые технологии рассказывать, W>Java и C# втирать для реализации, все бы хорошо, но они СПЕЦЫ и ОЧЕНЬ востребованые, зарплата 200 тыщ.каждому! W>Нашли Delphi программиста (двух), т.к. Delphi не в тренде, то и зарплата у них 65 тыщ.! W>Сделали все в лучшем виде! Начальство довольно! да и не знает оно, что популярно, а что нет, оно только деньги платит! W>
Я рад и за вас и за ваше начальство. Обсудим вопрос через пять, а лучше через десять лет. Хорошо?
M>Путь Qt спорен. КуТешные приложения выглядят неродными на всех платформах
Сейчас это не актуально, потому что GUI давно перестали стандартизировать и каждый делает себе GUI в программе как ему удобно по стилю "а я так вижу".
M>Ага, спасибо. Я вот все помнил, что от билдера там по-любому тыщетонные по тем временам .bpl надо было за собой таскать, вроде не было варианта статически линковать, с дельфями казалось вроде, что при статической линковке можно было сэкономить, но тоже пухло выходило. Так что да, про мегатонны фреймворков без дельфи в отличие от нативного кода, генерируемого в Delphi, это враки
Была в билдере статическая линковка, можно было полностью создать автономное приложение не зависящее от Borland Runtime.
Здравствуйте, turbocode, Вы писали:
M>>wxWidgets на каждой платформе завязан на нативное апи. И UI на нем на каждой платформе выглядит и работает, как родное T>В этом подходе есть один существенный недостаток, тебе нужно немного поправить поведение контрола под себя и ты в этот момент понимаешь что твой код перестает быть кроссплатформенным потому что в каждой платформе это нововведение делается разными способами.
Если ты пишешь адоб фотошоп или еще что-то такое, то да.
Если ты пишешь приложение для всех, такого быть не должно
У меня такое было в 96ом году на дельфи 1 поседний раз
Здравствуйте, turbocode, Вы писали:
M>>Путь Qt спорен. КуТешные приложения выглядят неродными на всех платформах T>Сейчас это не актуально, потому что GUI давно перестали стандартизировать и каждый делает себе GUI в программе как ему удобно по стилю "а я так вижу".
Здравствуйте, turbocode, Вы писали:
M>>Ага, спасибо. Я вот все помнил, что от билдера там по-любому тыщетонные по тем временам .bpl надо было за собой таскать, вроде не было варианта статически линковать, с дельфями казалось вроде, что при статической линковке можно было сэкономить, но тоже пухло выходило. Так что да, про мегатонны фреймворков без дельфи в отличие от нативного кода, генерируемого в Delphi, это враки
T>Была в билдере статическая линковка, можно было полностью создать автономное приложение не зависящее от Borland Runtime.
Здравствуйте, Marty, Вы писали:
M>Я рад и за вас и за ваше начальство. Обсудим вопрос через пять, а лучше через десять лет. Хорошо?
Хорошо! Вот только ПО это, никому через 10 лет не нужно будет! написанное хоть на Delphi, хоть на Java, и т.д.
Но, сегодня дешевле на Delphi!
Разница на лицо!
Хотя сам буду заказчику на C# делать, потому как оплата больше будет! Мне выгоднее!
Вот такая ситуация...
T>>В этом подходе есть один существенный недостаток, тебе нужно немного поправить поведение контрола под себя и ты в этот момент понимаешь что твой код перестает быть кроссплатформенным потому что в каждой платформе это нововведение делается разными способами. M>Если ты пишешь адоб фотошоп или еще что-то такое, то да. M>Если ты пишешь приложение для всех, такого быть не должно
Поверь такое всегда случается, если ты хочешь сделать свою работу качественно, а не на #####ись.
M>>Я рад и за вас и за ваше начальство. Обсудим вопрос через пять, а лучше через десять лет. Хорошо?
W>Хорошо! Вот только ПО это, никому через 10 лет не нужно будет! написанное хоть на Delphi, хоть на Java, и т.д. W>Но, сегодня дешевле на Delphi! W>Разница на лицо! W>Хотя сам буду заказчику на C# делать, потому как оплата больше будет! Мне выгоднее! W>Вот такая ситуация...
А я разве не о том же самом говорил? Быстренько барахло налабать, пока есть спрос — это — Дельфи. Проект с большим сроком жизни — это не дельфи
Здравствуйте, turbocode, Вы писали:
T>>>В этом подходе есть один существенный недостаток, тебе нужно немного поправить поведение контрола под себя и ты в этот момент понимаешь что твой код перестает быть кроссплатформенным потому что в каждой платформе это нововведение делается разными способами. M>>Если ты пишешь адоб фотошоп или еще что-то такое, то да. M>>Если ты пишешь приложение для всех, такого быть не должно
T>Поверь такое всегда случается, если ты хочешь сделать свою работу качественно, а не на #####ись.
Кванторы перепутал, всегда и иногда это немного разное
T>>Поверь такое всегда случается, если ты хочешь сделать свою работу качественно, а не на #####ись. M>Кванторы перепутал, всегда и иногда это немного разное
Поверь что всегда это всегда.
Поэтому и писалось такое большое количество компонентов для Delphi&Builder потому что даже стандартные были далеки от идеала и всегда нужно было что то добавить.
Здравствуйте, turbocode, Вы писали:
T>Поэтому и писалось такое большое количество компонентов для Delphi&Builder потому что даже стандартные были далеки от идеала и всегда нужно было что то добавить.
Здравствуйте, Marty, Вы писали:
M>А я разве не о том же самом говорил? Быстренько барахло налабать, пока есть спрос — это — Дельфи. Проект с большим сроком жизни — это не дельфи
Большой срок это насколько я понимаю — срок дольше жизни операционной системы?
T>>Поэтому и писалось такое большое количество компонентов для Delphi&Builder потому что даже стандартные были далеки от идеала и всегда нужно было что то добавить. U>Но сейчас-то от этого ушли.
M>>А я разве не о том же самом говорил? Быстренько барахло налабать, пока есть спрос — это — Дельфи. Проект с большим сроком жизни — это не дельфи
U>Большой срок это насколько я понимаю — срок дольше жизни операционной системы?
Когда-то изучал Delphi и мне понравилась большая библиотека компонентов, и простота создания форм.
Но...
Но ведь писать код было невозможно. Во времена Java+Eclipse, редактор Delphi не позволял даже базовые вещи рефакторить, как то переименование локальной переменной, функции, проперти. Я помню все эти безумные button154 и textarea5. Единожды создав, уже фиг чо переименуешь. Что-то поменялось?
Здравствуйте, sharez, Вы писали:
S>Единожды создав, уже фиг чо переименуешь. Что-то поменялось?
И не говори — у меня все приложения так и называются Project1, Project2...
Юзеры жалуются, что не понимают в чем отличие Button1 от Button2, но я им хелп подробный составил.
p.s. в целом, тема скатилась в холивар, причем основная причина — плохое знание предмета спора.
для меня единственный недостаток Delphi — компилятор не поддерживает автоматическую векторизацию,
поэтому тяжелые вычисления приходится писать на C++ или на ASM
Здравствуйте, sharez, Вы писали:
S>Но ведь писать код было невозможно. Во времена Java+Eclipse, редактор Delphi не позволял даже базовые вещи рефакторить, как то переименование локальной переменной, функции, проперти. Я помню все эти безумные button154 и textarea5. Единожды создав, уже фиг чо переименуешь. Что-то поменялось?
И зачем создавать такие безумные названия? Agile-стайл тогда не был популярен, я всегда называю переменные осмысленно, чтобы не заниматься рефакторингом. Опять же есть поиск и замена в участке текста.
Здравствуйте, SabaiSabai, Вы писали:
SS>И зачем создавать такие безумные названия? Agile-стайл тогда не был популярен, я всегда называю переменные осмысленно, чтобы не заниматься рефакторингом. Опять же есть поиск и замена в участке текста.
Чтобы не заниматься рефакторингом, нужно... не получится так. Даже аргументировать лень. Да постоянно хочется сменить название на более вменяемое.
Поиск-замена настолько примитивный способ, что не подойдёт в ряде случаев.
Судя потому, что полыхнуть полыхнуло, а прямо на мой вопрос никто не ответил, делаю вывод, что рефакторинг ИДЕ Делфи так и не поддерживает
Здравствуйте, sharez, Вы писали:
S>Чтобы не заниматься рефакторингом, нужно... не получится так. Даже аргументировать лень. Да постоянно хочется сменить название на более вменяемое. S>Поиск-замена настолько примитивный способ, что не подойдёт в ряде случаев.
Кому как. Лично мне более удобны более примтивные инструменты, они не зависят от криворукой реализации рукожопых индусов и стабильны и их не нужно изучать каждые полгода. У меня такой подход в целом по жизни, не только к ПРГ.
Здравствуйте, marcopolo, Вы писали:
M>Здравствуйте, sharez, Вы писали:
S>>Чтобы не заниматься рефакторингом, нужно... не получится так. Даже аргументировать лень. Да постоянно хочется сменить название на более вменяемое. S>>Поиск-замена настолько примитивный способ, что не подойдёт в ряде случаев.
M>Кому как. Лично мне более удобны более примтивные инструменты, они не зависят от криворукой реализации рукожопых индусов и стабильны и их не нужно изучать каждые полгода. У меня такой подход в целом по жизни, не только к ПРГ.
Чо там изучать-то. Курсор на идентификатор, F2, Enter. В языках со строгой типизацией всё работает со 100% надежностью. В Java и C# давно уж пользуются благами цивилизации, и только пользователи Delphi до сих пор не видят необходимости туалета в доме.
Здравствуйте, sharez, Вы писали:
S>Чо там изучать-то. Курсор на идентификатор, F2, Enter. В языках со строгой типизацией всё работает со 100% надежностью. В Java и C# давно уж пользуются благами цивилизации, и только пользователи Delphi до сих пор не видят необходимости туалета в доме.
Здравствуйте, sharez, Вы писали:
S>делаю вывод, что рефакторинг ИДЕ Делфи так и не поддерживает
Поддерживает очень давно.
Твой коллега ушел в закат, может ты хоть объяснишь, почему ты с делфи никак не связан (ну а иначе почему ты нихрена о делфи не знаешь), но тем не менее у тебя из-за делфи такая сильная попоболь? Почему тебе не пофиг, дружок?
Здравствуйте, gangastyle, Вы писали:
G>Есть смысл использовать для web-приложений в шароваре?
Резонерский ответ звучит так: зависит от того, что вы планируете делать.
В целом, концепция у ребят очень напоминает ASP.Net Web Forms. Я не знаю, смогли ли они избежать проблем, которые были присущи технологии от MS — для этого нужно куда более глубокое погружение...
Но если в 2-х словах, Web Forms — были попыткой притянуть в Web методологии разработки как на Desktop, причем в серверном коде.
В частности они хотели чтобы программист мог:
используя редактор форм, визуально накидать компоненты (в том числе от сторонних поставщиков)
добавить свой кастомный код в виде обработчиков событий от этих компонент.
Т.е. чтобы он писал на C#/VB не особо заморачиваясь особенностями Web, и не задумываясь о сложностях клиент-серверной разработки.
Ради этого пришлось создать весьма сложный цикл обработки запросов. Т.е. после того, как пользователь на вашей форме нажал кнопку (или сделал что-то, что требовало обоработки на сервере), и запрос приходил на сервер, происходило просто куча всего:
строилась заново вся строаница со всеми компонентами
восстанавливалось состояние компонентов (внешние свойства, внутреннее состояние, ...)
"накатывалось" новое состояние (изменения из формы)
компоненты начинали менять свое внутреннее состояние и генерировать события (например, нажатие кнопки или смена текста в поле ввода). Собственно ради этого всё и затевалось, т.к. в этот момент у разработчика есть готовая форма со всеми состояниями и он может работать с ней, как с обычной десктопной.
после того как все события отработали (и поменяли состояние контролов) происходит 2 вещи: все контролы снова сохраняют свое текущее состояние и генерируют html для отпраки на клиент (идет рендеринг).
Собственно, эта модель и продила весь ворох проблем, который был у Web Forms
громоздкий и не сильно поддающийся оптимизации жизненный цикл страницы (откровенно говоря, не все разработчики его хорошо понимали, т.к. на каждом этапе свои ограничения).
затраты на сохранение/восстановление состояния контролов. Один из способов — сохранение всего состояния внутри самой передаваемой страницы, в скрытом поле (пресловутый ViewState) порождал огромные тяжеловесные страницы (особенно когда число компоенентов начинало превосходить "пару полей и 2 кнопки")
сложность кастомизации и верстки. Несмотря на то, что в Web Forms можно было смешивать верстку на HTML и серверные контролы, делать это зачастую было очень не просто: каждый контрол мог иметь свои особенности рендеринга HTML, которые нужно было учитывать, были определнные правила именования и задания ID (чтобы страницу корректно восстановить!), ну и еще куча нюансов.
вопрос поддержки клиентского кода. Это отдельная боль, т.к. нужно очень хорошо понимать, что именно сгенерированно на странице, что можно делать, а что нельзя. Да просто — как найти нужный тэг — уже вопрос.
Честно говоря, очень быстро стало понятно, что идея "сделать модель разработки как в Desktop, но для Web" — провалилась. И разработчики вместо использования своего имевшегося опыта в настольной (или web, но для других платформ) были вынуждены изучать особенности Web Forms, а затем бороться с ними.
Возможно разработчики этого фреймворка учли неудачный опыт Microsoft, и описанные мною проблемы (или их аналоги) здесь отсутствуют.
Понять это по их примерам практически не реально — там нет никаких сложных форм, там только демонстрация отдельных контролов
Если же нет (т.е. не смогли избежать тех же проблем), то я бы скзал что единственный резон использования данного фреймворка — создание небольших "на скорую руку" приложений для какого-то из имеющихся заказчиков.
Т.е. когда своих готовых Web разработчиков нет, изучать ни времени, ни желани — тоже нет. а заказчик просит.
МР>В целом, концепция у ребят очень напоминает ASP.Net Web Forms.
Я так понял что там всё заделали на JavaScript+Ajax никаких ASP.Net Web Forms там и близко нету.
Но как они организовали обработку на серверной стороне неясно (я так понимаю что это ложится тяжелым грузом на разработчика потому что ему придется самому выискивать в HTML где там что хранится и малейшее изменение HTML разметки может нарушить работу такого веб-приложения)
Здравствуйте, Kerk, Вы писали:
K>Твой коллега ушел в закат, может ты хоть объяснишь, почему ты с делфи никак не связан (ну а иначе почему ты нихрена о делфи не знаешь), но тем не менее у тебя из-за делфи такая сильная попоболь? Почему тебе не пофиг, дружок?
Никакой попоболи. Интерес абсолютно теоретический, ибо уже много лет я занимаюсь вебом, Delphi там совсем нерилейтед. А вот Java — очень даже, и с рефакторингом у него всё в шоколаде было даже в те времена, когда многие делфисты и знать не знали слова "рефакторинг".
А вот ваши коллеги в соседней ветке доказывают мне, что рефакторинг нинужен. Надо всем рассказать благую весть
P. S.: расслабьтесь, я просто полюбопытствовать зашел и пошутить. Не могу пройти мимо любителей Delphi или Gimp. Впрочем, на Delphi я сам пописывал (но продать не смог), и ведь когда-то особых альтернатив по удобству и функционалу не было. Так же как и Gimp когда-то был так же неюзабелен, как и Photoshop (теперь неюзабелен только Gimp).
Здравствуйте, Михаил Романов, Вы писали:
МР>затраты на сохранение/восстановление состояния контролов. Один из способов — сохранение всего состояния внутри самой передаваемой страницы, в скрытом поле (пресловутый ViewState) порождал огромные тяжеловесные страницы (особенно когда число компоенентов начинало превосходить "пару полей и 2 кнопки")
Но ведь древний RDS обеспечивает хорошую скорость отклика. Почему нельзя выполнять приложение на сервере, и содержимое окна программы передавать аналогично тому, как работает RDS?
>Но ведь древний RDS обеспечивает хорошую скорость отклика. Почему нельзя выполнять приложение на сервере, и содержимое окна программы передавать аналогично тому, как работает RDS?
Потому что с RDS одновременно работает максимум 10 человек, тогда как с веб-сайтом могут работать сотни тысяч одновременно.
Здравствуйте, turbocode, Вы писали:
МР>>В целом, концепция у ребят очень напоминает ASP.Net Web Forms.
T>Я так понял что там всё заделали на JavaScript+Ajax никаких ASP.Net Web Forms там и близко нету. T>Но как они организовали обработку на серверной стороне неясно (я так понимаю что это ложится тяжелым грузом на разработчика потому что ему придется самому выискивать в HTML где там что хранится и малейшее изменение HTML разметки может нарушить работу такого веб-приложения)
Там все гораздо КРУЧЕ!
Используется https://www.sencha.com/products/extjs/#overview
Кстати, эту контору (SENCHA) сейчас покупает Embarcadero и UniGUI будет
включен в Delphi...
так что вот такие дела, друзья...
Здравствуйте, rfillipenko, Вы писали:
МР>>затраты на сохранение/восстановление состояния контролов. Один из способов — сохранение всего состояния внутри самой передаваемой страницы, в скрытом поле (пресловутый ViewState) порождал огромные тяжеловесные страницы (особенно когда число компоенентов начинало превосходить "пару полей и 2 кнопки")
R>Но ведь древний RDS обеспечивает хорошую скорость отклика. Почему нельзя выполнять приложение на сервере, и содержимое окна программы передавать аналогично тому, как работает RDS?
Здравствуйте, sharez, Вы писали:
K>>Твой коллега ушел в закат, может ты хоть объяснишь, почему ты с делфи никак не связан (ну а иначе почему ты нихрена о делфи не знаешь), но тем не менее у тебя из-за делфи такая сильная попоболь? Почему тебе не пофиг, дружок?
S>Никакой попоболи. Интерес абсолютно теоретический, ибо уже много лет я занимаюсь вебом, Delphi там совсем нерилейтед. А вот Java — очень даже, и с рефакторингом у него всё в шоколаде было даже в те времена, когда многие делфисты и знать не знали слова "рефакторинг".
Ну а в Delphi, например, анонимные функции появились когда "многие джависты и знать не знали такого слова", лет на 5 раньше.
Это бесконечный холивар. Да и бессмысленный
Я и сам на делфи уже не пишу, но не понимаю этого хейтерства. Детство какое-то.
---
Вспомнилась история.
Есть у меня знакомый, в прошлом фанатик C++. Холиварил всегда и со всеми. В сторону Делфи у него был любимый аргумент, что в Делфи нет множественного наследования и это отстой (вообще тогда это был очень распространенный аргумент в холиварах).
В те годы дотнет только появлялся и приехал к нам пропагандист мелкософта рассказать про новые технологии, про C#. И в какой-то момент уже после выступления этот товарищ встал и гордо спросил про множественное наследование. Мелкософтовец ответил: "В C# множественного наследования нет, да и не нужно оно никому на самом деле". Я лицо товарища до сих пор помню Но ничего, проглотил. Пишет до сих пор на C# и Java.
Вы заметили, кстати, что сейчас никто не говорит, что в Делфи нет множественного наследования? Как-то действительно оказалось оно никому не нужно, был прав мелкософтовец
Уровень холиваров упал. Нынче делфи обвиняют не в отсутствии множественного наследования (что правда), а в отсутствии вещей, которые в Делфи лет 10 уже как есть.
Здравствуйте, Kerk, Вы писали: K>Уровень холиваров упал. Нынче делфи обвиняют не в отсутствии множественного наследования (что правда), а в отсутствии вещей, которые в Делфи лет 10 уже как есть.
Да можно, не объектами правда, а интерфейсами.
Здравствуйте, AWSVladimir, Вы писали:
K>>Уровень холиваров упал. Нынче делфи обвиняют не в отсутствии множественного наследования (что правда), а в отсутствии вещей, которые в Делфи лет 10 уже как есть. AWS>Да можно, не объектами правда, а интерфейсами.
Множественное наследование интерфейсов, а не классов, нынче по сути мейнстрим. Но 15 лет назад сишники про это не знали и очень смешно холиварили
W>Там все гораздо КРУЧЕ! W>Используется https://www.sencha.com/products/extjs/#overview
Это фронтенд, про сервер-сайд ничего не пишут.
W>Кстати, эту контору (SENCHA) сейчас покупает Embarcadero и UniGUI будет
Писали что "Компания Embarcadero Technologies продана компании Idera"
Там уже не поймешь кто кого продал и кто кого купил.
Здравствуйте, turbocode, Вы писали:
W>>Кстати, эту контору (SENCHA) сейчас покупает Embarcadero и UniGUI будет T>Писали что "Компания Embarcadero Technologies продана компании Idera" T>Там уже не поймешь кто кого продал и кто кого купил.
Здравствуйте, wamaco, Вы писали:
W>>>Там все гораздо КРУЧЕ! W>>>Используется https://www.sencha.com/products/extjs/#overview T>>Это фронтенд, про сервер-сайд ничего не пишут.
W>Так сервер сайд это программа на Delphi, она все и делает, обращается к БД и т.д. W>Сервер должен быть на Windows
Не знаю конкретно про эту либу, но вообще Delphi может и под линукс компилить.
Здравствуйте, turbocode, Вы писали:
W>>Так сервер сайд это программа на Delphi, она все и делает, обращается к БД и т.д. W>>Сервер должен быть на Windows
T>То есть на каждого посетителя сайта будет на сервере запускаться программа на Delphi?
А как по-твоему работают сайты? Ну вот RSDN, например?
Здравствуйте, turbocode, Вы писали:
T>>>То есть на каждого посетителя сайта будет на сервере запускаться программа на Delphi? K>>А как по-твоему работают сайты? Ну вот RSDN, например?
T>Вебсервер обрабатывает HTTP-запросы но он не хранит состояние сайта, а только принял, обработал и отдал назад.
Веб-сервера поддерживают сессии с незапамятных времен.
У них, в общем, на сайте примерно так и написано
In general each uniGUI application is a standard Delphi executable powered with specialized modules which all together turn the application into a full featured web server. Among these modules we can count Session Manager, Web HTTP Server, ISAPI Handler, Cache Eraser and Server Module. These modules cooperate to create sessions, handle Ajax calls, create web UI and manage session lifetime.
K>Веб-сервера поддерживают сессии с незапамятных времен. K>У них, в общем, на сайте примерно так и написано K>
K>In general each uniGUI application is a standard Delphi executable powered with specialized modules which all together turn the application into a full featured web server. Among these modules we can count Session Manager, Web HTTP Server, ISAPI Handler, Cache Eraser and Server Module. These modules cooperate to create sessions, handle Ajax calls, create web UI and manage session lifetime.
Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.
Здравствуйте, turbocode, Вы писали:
]
T>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.
T>>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей. W>они из коробки ISAPI
Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше?
Здравствуйте, turbocode, Вы писали:
T>>>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей. W>>они из коробки ISAPI
T>Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше?
И ничего. Этот uniGUI — это отдельная от VCL визуальная библиотека. Ну почитай ты сайт, елки-палки. Я тоже этой штукой ни разу не пользовался, но за полторы минуты сайты посмотрел.
T>>Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше? K>И ничего. Этот uniGUI — это отдельная от VCL визуальная библиотека.
Это еще ужаснее чем я думал: потому что создавать одно и тоже приложение с разными наборами визуальных библиотек это самое худшее что может быть.
T>>В смысле сам? Кто то на PHP, кто на ASP.NET сидит. Но это ж никакие не приложения на Delphi. I>Это были твои слова. Теперь осталось объяснить разницу между интерпретатором PHP и приложением на Delphi.
Мне неизвестен принцип того как приложения на Delphi будут работать в вебе. Если ты знаешь то расскажи, вместо того чтобы здесь газировать лужи тупыми вопросами.
Здравствуйте, turbocode, Вы писали:
T>Это еще ужаснее чем я думал: потому что создавать одно и тоже приложение с разными наборами визуальных библиотек это самое худшее что может быть.
Почему ты упорно отказываешься читать описание и выдумываешь проблемы?
Технология предлагает единый GUI для веба и десктопа. Бекэнд делаешь на delphi, а фронтэнд генерируется на js.
Я примерно так реализовал просмотр отчетов в одной программе, когда попросили сделать удаленный доступ, только фронтэнд сделал руками.
На Indy сделал сервер с генерацией отчетов и авторизацией. При удаленном просмотре человек использует браузер,
а на десктопе все отображается через приложение с EmbeddedWB.
Здравствуйте, turbocode, Вы писали:
T>Мне неизвестен принцип того как приложения на Delphi будут работать в вебе. Если ты знаешь то расскажи, вместо того чтобы здесь газировать лужи тупыми вопросами.
Я с тебя угораю — как работает ты не знаешь, но мнение имеешь.
Ок, приложения на Delphi будут работать точно так же как и приложения на C++, PHP, Perl,...
а еще ведь Node.js есть, он тебе точно мозг взорвет
Может с чего-нибудь попроще начнем? Например, как любой бекэнд общается с вебсервером?
Или — зачем веб приложению внешний вебсервер?
I>Технология предлагает единый GUI для веба и десктопа.
Это ж разные наборы VCL, где ты видишь единость? Ну да визуально они похожи но от этого ни холодно ни жарко, потому что морду для приложения нужно делать дважды: одну для десктопа, а другую для веба.
I>Бекэнд делаешь на delphi,
Есть языки и получше для бекенда чем Delphi.
I>а фронтэнд генерируется на js.
Где генерируются (на фронте или на бекенде)? Чем генерируются? На основании чего генерируются?
Здравствуйте, turbocode, Вы писали:
T>Это ж разные наборы VCL, где ты видишь единость?
Это замена для стандартного VCL.
T>Есть языки и получше для бекенда чем Delphi.
Об этом можно спорить бесконечно. Зависит от поставленной задачи.
T>Где генерируются (на фронте или на бекенде)? Чем генерируются? На основании чего генерируются?
Я подробностей реализации не знаю, но полагаю что этот набор VCL генерирует html/js фронтэнд. Т.е. вместо формы будут html страница.
В некоторых случаях — это удобно. Но не во всех.
Почему? Ты же сам спросил как delphi может взаимодействовать с вебсервером...
Под Apache модули делаются через FastCGI, под IIS на ISAPI. На любом языке.
Можно и сам сервер сделать на Delphi с блекджеком и ...
Здравствуйте, turbocode, Вы писали: МР>>В целом, концепция у ребят очень напоминает ASP.Net Web Forms. T>Я так понял что там всё заделали на JavaScript+Ajax никаких ASP.Net Web Forms там и близко нету.
Не знаю. По тому, что я увидел, выглядит похоже:
Разработчик создает обычную форму, в обычном редакторе Delphi. Разница только в том, что используются специальные компоненты
Пишет код, выглядящий как код работы с локальной формой.
Т.е. всяко должен быть механизм создания этой самой формы, приема изменений от клиента, передачи результата на клиент (причем, т.к. поддерживается динамическое создание компонент передвать надо не только данные, но и разметку в каком-то виде).
Большой разницы с ASP.Net я не вижу.
Правда, сейчас посмотрел документацию, там пишут вот такое:
Each time a user opens a new instance of the Web application, the server creates a new session. A session will remain active until the user logs out, closes the browser/tab, or it times out. Each session keeps a complete state of the running Web application so that uniGUI sessions are called stateful. You can consider each session as a private copy of your Web application, which co-exists with other sessions in the server address space but is isolated from all others.
Т.е. им нет нужды заботиться о сохранении состояния, у них сессия (которая включает все переменные среды, а также все открытые в текущий момент формы) — всегда находится в памяти.
С другой стороны, как это будет масштабироваться — я плохо представляю.
У большинства (если не у всех) известных мне веб-решений время жизни 99% объектов равно времени обработки запроса, а здесь даже в руководстве разработчика есть специальный пункт посвященный экономии ресурсов и создании их on demand. T>Но как они организовали обработку на серверной стороне неясно (я так понимаю что это ложится тяжелым грузом на разработчика потому что ему придется самому выискивать в HTML где там что хранится и малейшее изменение HTML разметки может нарушить работу такого веб-приложения)
Там всё достаточно интересно, на самом деле.
Судя по всему они реализовали нечто вроде RDP.
По крайней мере открытие формы ведет к загрузке следующих данных с сервера:
Это, видимо, аналог разметки
_rsov_(O1D,10); O3F8=new Ext.panel.Panel({id:"O3F8_id",itemId:"5",bodyBorder:false,header:false,border:false,bodyBorder:false,layout:"absolute",title:"Fish Facts",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__BBB72767EDA6DFE6A95E21BE.ico",closable:true,style:"border:none;",uniFMask:{beforeclose:true},width:1717,height:481,x:0,y:0});O3F8.nm="O3F8";_cdo_("O3F8_C",O3F8,null,MainForm);O6F.add(O3F8); O400=new Ext.panel.Panel({id:"O400_id",border:false,bodyBorder:false,layout:"absolute",border:false,style:"border:none;",width:1715,height:481,x:0,y:0});O400.nm="O400";_cdo_("UniDatabaseFishFacts");UniDatabaseFishFacts.ajxS=AjaxSuccess;UniDatabaseFishFacts.ajxF=AjaxFailure;UniDatabaseFishFacts.form=O8;O400.rootObj=true;UniDatabaseFishFacts.appRoot="/demo/desktop/mdemo.dll/";_cdo_("FramePanel",O400,null,UniDatabaseFishFacts); O408=new Ext.form.Label({id:"O408_id",cls:"x-unilabel",text:"Category",x:8,y:5});O408.nm="O408";_cdo_("UniLabel1",O408,null,UniDatabaseFishFacts);O400.add(O408); O40C=new Ext.form.Label({id:"O40C_id",cls:"x-unilabel",text:"Common Name",x:8,y:44});O40C.nm="O40C";_cdo_("UniLabel2",O40C,null,UniDatabaseFishFacts);O400.add(O40C); O410=new Ext.form.Label({id:"O410_id",cls:"x-unilabel",text:"Length (cm)",x:8,y:85});O410.nm="O410";_cdo_("UniLabel3",O410,null,UniDatabaseFishFacts);O400.add(O410); O414=new Ext.form.Label({id:"O414_id",cls:"x-unilabel",text:"Length (In)",x:8,y:127});O414.nm="O414";_cdo_("UniLabel4",O414,null,UniDatabaseFishFacts);O400.add(O414); O418=new Ext.form.Label({id:"O418_id",cls:"x-unilabel",text:"Picture",x:173,y:5});O418.nm="O418";_cdo_("UniLabel5",O418,null,UniDatabaseFishFacts);O400.add(O418); O41C=new Ext.form.Label({id:"O41C_id",cls:"x-unilabel",text:"Notes",x:575,y:5});O41C.nm="O41C";_cdo_("UniLabel6",O41C,null,UniDatabaseFishFacts);O400.add(O41C); O420=new Ext.Component({id:"O420_id",html:"\x3Cimg src='/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__21858F79576234F27860D0B9.png' alt='UniDBImage1' width='270' height='162' hspace='0' vspace='0'\x3E",style:"background: none;clip:rect(0px,277px,162px,0px);",width:277,height:162,x:173,y:22});O420.nm="O420";_cdo_("UniDBImage1",O420,null,UniDatabaseFishFacts);O400.add(O420); O424=new Ext.form.field.Text({id:"O424_id",trackBlurChange:true,maxLength:15,enforceMaxLength:true,value:"Triggerfish",name:"O424",enableKeyEvents:true,width:159,height:21,x:8,y:20});O424.nm="O424";_cdo_("UniDBEdit1",O424,null,UniDatabaseFishFacts);O400.add(O424); O428=new Ext.form.field.Text({id:"O428_id",trackBlurChange:true,maxLength:30,enforceMaxLength:true,value:"Clown Triggerfish",name:"O428",enableKeyEvents:true,width:159,height:21,x:8,y:60});O428.nm="O428";_cdo_("UniDBEdit2",O428,null,UniDatabaseFishFacts);O400.add(O428); O42C=new Ext.form.field.Text({id:"O42C_id",trackBlurChange:true,value:"50",name:"O42C",enableKeyEvents:true,fieldStyle:"text-align:right;background-color:#C1E0FF;background-image:none;",width:159,height:21,x:8,y:101});O42C.nm="O42C";_cdo_("UniDBEdit3",O42C,null,UniDatabaseFishFacts);O400.add(O42C); O430=new Ext.form.field.Text({id:"O430_id",trackBlurChange:true,value:"19.6850393700787",name:"O430",enableKeyEvents:true,fieldStyle:"text-align:right;",width:159,height:21,x:8,y:142});O430.nm="O430";_cdo_("UniDBEdit4",O430,null,UniDatabaseFishFacts);O400.add(O430); O434=new Ext.container.Container({id:"O434_id",border:false,layout:"absolute",style:"border:none;",width:270,height:25,x:178,y:190});O434.nm="O434";_cdo_("UniDBNavigator1",O434,null,UniDatabaseFishFacts); O43C=new Ext.button.Button({id:"O43C_id",disabled:true,icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__B176963BE18EA589930533A3.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:0,y:0});O43C.nm="O43C";_cdo_("uni_dbn_FIRST",O43C,null,MainForm);O434.add(O43C); O440=new Ext.button.Button({id:"O440_id",disabled:true,icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__63B080C285DCE118E98D53F5.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:27,y:0});O440.nm="O440";_cdo_("uni_dbn_PRIOR",O440,null,MainForm);O434.add(O440); O444=new Ext.button.Button({id:"O444_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__17B3F33D151B57F62CCF3E2D.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:54,y:0});O444.nm="O444";_cdo_("uni_dbn_NEXT",O444,null,MainForm);O434.add(O444); O448=new Ext.button.Button({id:"O448_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__453D57B97251D77AB78F23F1.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:81,y:0});O448.nm="O448";_cdo_("uni_dbn_LAST",O448,null,MainForm);O434.add(O448); O44C=new Ext.button.Button({id:"O44C_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__C54023110DE0CCCFD320E30C.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:108,y:0});O44C.nm="O44C";_cdo_("uni_dbn_INSERT",O44C,null,MainForm);O434.add(O44C); O450=new Ext.button.Button({id:"O450_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__9D6B72164DCF4B41EB3AB138.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:135,y:0});O450.nm="O450";_cdo_("uni_dbn_DELETE",O450,null,MainForm);O434.add(O450); O454=new Ext.button.Button({id:"O454_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__FD3EE3324C3E355B497D0DB6.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:162,y:0});O454.nm="O454";_cdo_("uni_dbn_EDIT",O454,null,MainForm);O434.add(O454); O458=new Ext.button.Button({id:"O458_id",disabled:true,icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__E52FCDA7287642EE0DA60524.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:189,y:0});O458.nm="O458";_cdo_("uni_dbn_POST",O458,null,MainForm);O434.add(O458); O45C=new Ext.button.Button({id:"O45C_id",disabled:true,icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__42514CD6C2AD61A404FEA406.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:216,y:0});O45C.nm="O45C";_cdo_("uni_dbn_CANCEL",O45C,null,MainForm);O434.add(O45C); O460=new Ext.button.Button({id:"O460_id",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__377DA7BA83A8B696BB26540F.png",iconCls:"x-uni-btn-icon-notext",width:27,height:25,x:243,y:0});O460.nm="O460";_cdo_("uni_dbn_REFRESH",O460,null,MainForm);O434.add(O460); O464=new Ext.button.Button({id:"O464_id",hidden:true,width:27,height:25,x:270,y:0});O464.nm="O464";_cdo_("uni_dbn_APPLYUPDATES",O464,null,MainForm);O434.add(O464); O468=new Ext.button.Button({id:"O468_id",hidden:true,width:27,height:25,x:297,y:0});O468.nm="O468";_cdo_("uni_dbn_CANCELUPDATES",O468,null,MainForm);O434.add(O468);O400.add(O434); O46C=new Ext.form.field.Number({id:"O46C_id",trackBlurChange:true,allowExponential:false,decimalPrecision:2,decimalSeparator:",",hideTrigger:true,keyNavEnabled:false,step:1,name:"O46C",enableKeyEvents:true,fieldStyle:"text-align:right;",width:159,x:8,y:169});O46C.nm="O46C";_cdo_("UniDBNumberEdit1",O46C,null,UniDatabaseFishFacts);O400.add(O46C); O474=new Ext.data.Store({fields:[],storeId:"O474_id",remoteSort:true,remoteGroup:true,pageSize:25,proxy:{type:"ajax",url:"/demo/desktop/mdemo.dll/HandleEvent?IsEvent=1&Obj=O470&Evt=data&"+_S_ID,reader:{type:"json"},timeout:60000}}); O47B=new Ext.selection.CellModel({}); O487=new Ext.toolbar.Paging({id:"O487_id",store:O474}); O4C2=new Object({}); O470=new Ext.grid.Panel({id:"O470_id",store:O474,columns:[],columnLines:true,bodyBorder:true,border:true,selModel:O47B,bbar:O487,loadDataMask:O4C2,enableColumnMove:false,viewConfig:{preserveScrollOnRefresh:true,markDirty:false,loadMask:false},plugins:[Ext.create("Ext.grid.plugin.CellEditing",{pluginId:"uniGridEditor",clicksToEdit:2})],width:1715,height:217,x:0,y:264});O470.nm="O470";_cdo_("UniDBGrid1",O470,null,UniDatabaseFishFacts);O474.nm="O474";_cdo_("UniDBGrid1",O474,"store",UniDatabaseFishFacts);O474.grid=O470;O474.dbgrid=true; O475= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O474&Evt=load&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O474,e:"load"});});O475.nm="O475";O474.on("load",O475); O476= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O474&Evt=prefetch&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O474,e:"prefetch"});});O476.nm="O476";O474.on("prefetch",O476); O477=new Ext.form.field.Hidden({name:"O477",enableKeyEvents:true});O477.nm="O477";O47B.nm="O47B";_cdo_("UniDBGrid1",O47B,"cellModel",UniDatabaseFishFacts); O47C=new Ext.selection.RowModel({});O47C.nm="O47C";_cdo_("UniDBGrid1",O47C,"rowModel",UniDatabaseFishFacts); O47D=new Ext.selection.CheckboxModel({});O47D.nm="O47D";_cdo_("UniDBGrid1",O47D,"checkboxModel",UniDatabaseFishFacts);O47B.grid=O470;O47C.grid=O470;O477.grid=O470;O470.hidField=O477; O47E= (function(P0,P1){_src_(O477,xlatRow(P1),P1.column.dataIndex,null,P1.record,true);_ae_(P1);return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=edit&VR="+_o2s_(P1.newValues, P1.originalValues)+"&V="+_xl_(P1.value)+"&O="+_xl_(P1.originalValue)+"&R="+xlatRow(P1)+"&C="+P1.column.dataIndex+"&RN="+_getrno_(P1.record)+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"edit"});});O47E.nm="O47E";O470.on("edit",O47E); O47F= (function(P0,P1){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=canceledit&R="+P1.rowIdx+"&C="+P1.column.dataIndex+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"canceledit"});});O47F.nm="O47F";O470.on("canceledit",O47F); O480= (function(P0,P1){if(!_ce_(P1))return(false);if(!_src_(O477,xlatRow(P1),P1.column.dataIndex,null,P1.record,true))return(false);return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=beforeedit&V="+_xl_(P1.value)+"&O="+_xl_(P1.originalValue)+"&R="+xlatRow(P1)+"&C="+P1.column.dataIndex+"&RN="+_getrno_(P1.record)+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"beforeedit"});});O480.nm="O480";O470.on("beforeedit",O480,O470,{delay:1}); O481= (function(P0,P1,P2,P3){_cge_(P0);_src_(O477,xlatRecRow(P2,P1),_gcdi_(P0,P3),null,P1);if(_ccell_(P0))return;return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O47B&Evt=select&This="+P0.nm+"&rr="+xlatRecRow(P2,P1)+"&cc="+P3+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O47B,e:"select"});});O481.nm="O481";O47B.on("select",O481); O482= (function(P0,P1){_src_(O477,null,null,false,P1);return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O47C&Evt=selectionchange&This="+P0.nm+"&sels="+P1.length+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O47C,e:"selectionchange"});});O482.nm="O482";O47C.on("selectionchange",O482); O483= (function(P0,P1){_src_(O477,null,null,false,P1);return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O47D&Evt=selectionchange&This="+P0.nm+"&sels="+P1.length+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O47D,e:"selectionchange"});});O483.nm="O483";O47D.on("selectionchange",O483);O470.on("columnresize",function(ct,c,w){if(c.fedit)c.fedit.setWidth(w-10)}); O484= (function(P0,P1,P2,P3){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=columnmove&OldIndex="+P2+"&NewIndex="+P3+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"columnmove"});});O484.nm="O484";O470.on("columnmove",O484); O485= (function(P0,P1){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=columnhide&col="+P1.dataIndex+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"columnhide"});});O485.nm="O485";O470.on("columnhide",O485); O486= (function(P0,P1){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=columnshow&col="+P1.dataIndex+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"columnshow"});});O486.nm="O486";O470.on("columnshow",O486);O487.nm="O487";_cdo_("UniDBGrid1",O487,"pagingBar",UniDatabaseFishFacts);O400.add(O470);O400.add(O477); O48F=new Ext.data.Store({proxy:{type:"ajax",url:"/demo/desktop/mdemo.dll/HandleEvent?IsEvent=1&Obj=O48F&Evt=data&"+_S_ID,reader:{type:"json"},timeout:60000},storeId:"O48F_id",fields:["id","val"],data:[["0","Clown Triggerfish"],["1","Red Emperor"],["2","French Grunt"]]}); O48B=new Ext.form.field.ComboBox({id:"O48B_id",displayField:"val",valueField:"val",trackBlurChange:true,queryMode:"local",minChars:1,value:"Clown Triggerfish",editable:true,store:O48F,name:"O48B",enableKeyEvents:true,width:159,x:8,y:197});O48B.nm="O48B";_cdo_("UniDBComboBox1",O48B,null,UniDatabaseFishFacts);O48F.nm="O48F";_cdo_("UniDBComboBox1",O48F,"store",UniDatabaseFishFacts); O490= (function(){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O48F&Evt=data&"+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O48F,e:"data"});});O490.nm="O490";O48F.on("data",O490); O491= (function(){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O48B&Evt=select&"+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O48B,e:"select"});});O491.nm="O491";O48B.on("select",O491);O400.add(O48B); O492=new Ext.form.Label({id:"O492_id",cls:"x-unilabel",text:"Clown Triggerfish",style:"text-align:center;font:bold 13px Tahoma;color:#000080",x:8,y:225});O492.nm="O492";_cdo_("UniDBText1",O492,null,UniDatabaseFishFacts);O400.add(O492); O496=new Ext.form.field.HtmlEditor({id:"O496_id",trackBlurChange:true,value:"Also known as the big spotted triggerfish. Inhabits outer reef areas and feeds upon crustaceans and mollusks by crushing them with powerful teeth. They are voracious eaters, and divers report seeing the clown triggerfish devour beds of pearl oysters.\n\nDo not eat this fish. According to an 1878 account, \"the poisonous flesh acts primarily upon the nervous tissue of the stomach, occasioning violent spasms of that organ, and shortly afterwards all the muscles of the body. The frame becomes rocked with spasms, the tongue thickened, the eye fixed, the breathing laborious, and the patient expires in a paroxysm of extreme suffering.\"\n\nNot edible.\n\nRange is Indo-Pacific and East Africa to Somoa.\n",name:"O496",enableKeyEvents:true,fieldStyle:"background-color:#DFDFDF;background-image:none;",width:1105,height:236,x:592,y:22});O496.nm="O496";_cdo_("UniDBMemo1",O496,null,UniDatabaseFishFacts);O496.on("change",_hed_);O400.add(O496); O49A=new Ext.button.Button({id:"O49A_id",text:"Append",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__DBDF85F0E7052583C2E49CC0.png",iconCls:"x-uni-btn-icon-left",width:75,height:25,x:178,y:221});O49A.nm="O49A";_cdo_("UniBitBtn1",O49A,null,UniDatabaseFishFacts);O400.add(O49A); O49E=new Ext.button.Button({id:"O49E_id",text:"Edit Picture",icon:"/demo/desktop/mdemo.dll/cache/mdemo_dll/res/__4DEF4D6E570CC8FFA4FC0D1D.png",iconCls:"x-uni-btn-icon-left",width:100,height:25,x:259,y:221});O49E.nm="O49E";_cdo_("UniBitBtn2",O49E,null,UniDatabaseFishFacts);O400.add(O49E); O4A2=new Ext.form.FieldSet({id:"O4A2_id",layout:"fit",bodyBorder:false,title:"Category",width:130,height:241,x:456,y:17});O4A2.nm="O4A2";_cdo_("UniDBRadioGroup1",O4A2,null,UniDatabaseFishFacts); O4AA=new Ext.form.RadioGroup({id:"O4AA_id",items:[{boxLabel:"1) Triggerfish",name:"O4AA",itemId:"0",checked:true,inputValue:"0"},{boxLabel:"2) Snapper",name:"O4AA",itemId:"1",inputValue:"1"},{boxLabel:"3) Wrasse",name:"O4AA",itemId:"2",inputValue:"2"},{boxLabel:"4) Angelfish",name:"O4AA",itemId:"3",inputValue:"3"},{boxLabel:"5) Cod",name:"O4AA",itemId:"4",inputValue:"4"},{boxLabel:"6) Scorpionfish",name:"O4AA",itemId:"5",inputValue:"5"},{boxLabel:"7) Shark",name:"O4AA",itemId:"6",inputValue:"6"},{boxLabel:"8) Ray",name:"O4AA",itemId:"7",inputValue:"7"},{boxLabel:"9) Grouper",name:"O4AA",itemId:"8",inputValue:"8"},{boxLabel:"10) Cyprinidae",name:"O4AA",itemId:"9",inputValue:"9"}],columns:1,vertical:true,name:"O4AA",enableKeyEvents:true});O4AA.nm="O4AA";_cdo_("UniDBRadioGroup1",O4AA,"radioGroup",UniDatabaseFishFacts);O4A2.add(O4AA);O400.add(O4A2); O4AE=new Object({});O4AE.nm="O4AE";_cdo_("UniFileUpload1",O4AE,null,UniDatabaseFishFacts);_sfv_(O4AA,0,{O4AA:0});O3F8.add(O400);O6F.setActiveTab("5"); O4AF= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O3F8&Evt=beforeclose&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O3F8,e:"beforeclose"});});O4AF.nm="O4AF";O3F8.on("beforeclose",O4AF);O3F8.retfalse.beforeclose=1;O408.Id1="O6F_id";O408.Id2="O3F8_id";O40C.Id1="O6F_id";O40C.Id2="O3F8_id";O410.Id1="O6F_id";O410.Id2="O3F8_id";O414.Id1="O6F_id";O414.Id2="O3F8_id";O418.Id1="O6F_id";O418.Id2="O3F8_id";O41C.Id1="O6F_id";O41C.Id2="O3F8_id";O420.Id1="O6F_id";O420.Id2="O3F8_id";O424.stateValue="0100000000000000010000001C00000001000000";O424.Id1="O6F_id";O424.Id2="O3F8_id"; O4B0= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O424&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O424,e:"edited"});});O4B0.nm="O4B0";O424.on("edited",O4B0);O428.stateValue="0100000000000000010000001C00000001000000";O428.Id1="O6F_id";O428.Id2="O3F8_id"; O4B1= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O428&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O428,e:"edited"});});O4B1.nm="O4B1";O428.on("edited",O4B1);O42C.stateValue="0100000000000000010000001C00000001000000";O42C.Id1="O6F_id";O42C.Id2="O3F8_id"; O4B2= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O42C&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O42C,e:"edited"});});O4B2.nm="O4B2";O42C.on("edited",O4B2);O430.stateValue="0100000000000000010000001C00000001000000";O430.Id1="O6F_id";O430.Id2="O3F8_id"; O4B3= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O430&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O430,e:"edited"});});O4B3.nm="O4B3";O430.on("edited",O4B3);O43C.Id1="O6F_id";O43C.Id2="O3F8_id"; O4B4= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O43C&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O43C,e:"click"});});O4B4.nm="O4B4";O43C.on("click",O4B4);O440.Id1="O6F_id";O440.Id2="O3F8_id"; O4B5= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O440&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O440,e:"click"});});O4B5.nm="O4B5";O440.on("click",O4B5);O444.Id1="O6F_id";O444.Id2="O3F8_id"; O4B6= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O444&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O444,e:"click"});});O4B6.nm="O4B6";O444.on("click",O4B6);O448.Id1="O6F_id";O448.Id2="O3F8_id"; O4B7= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O448&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O448,e:"click"});});O4B7.nm="O4B7";O448.on("click",O4B7);O44C.Id1="O6F_id";O44C.Id2="O3F8_id"; O4B8= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O44C&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O44C,e:"click"});});O4B8.nm="O4B8";O44C.on("click",O4B8);O450.Id1="O6F_id";O450.Id2="O3F8_id"; O4B9= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O450&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O450,e:"click"});});O4B9.nm="O4B9";O450.on("click",O4B9);O454.Id1="O6F_id";O454.Id2="O3F8_id"; O4BA= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O454&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O454,e:"click"});});O4BA.nm="O4BA";O454.on("click",O4BA);O458.Id1="O6F_id";O458.Id2="O3F8_id"; O4BB= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O458&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O458,e:"click"});});O4BB.nm="O4BB";O458.on("click",O4BB);O45C.Id1="O6F_id";O45C.Id2="O3F8_id"; O4BC= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O45C&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O45C,e:"click"});});O4BC.nm="O4BC";O45C.on("click",O4BC);O460.Id1="O6F_id";O460.Id2="O3F8_id"; O4BD= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O460&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O460,e:"click"});});O4BD.nm="O4BD";O460.on("click",O4BD);O464.Id1="O6F_id";O464.Id2="O3F8_id"; O4BE= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O464&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O464,e:"click"});});O4BE.nm="O4BE";O464.on("click",O4BE);O468.Id1="O6F_id";O468.Id2="O3F8_id"; O4BF= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O468&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O468,e:"click"});});O4BF.nm="O4BF";O468.on("click",O4BF);O434.Id1="O6F_id";O434.Id2="O3F8_id";_sfv_(O46C,0,50);O46C.stateValue="0100000000000000010000001C00000001000000";O46C.Id1="O6F_id";O46C.Id2="O3F8_id"; O4C0= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O46C&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O46C,e:"edited"});});O4C0.nm="O4C0";O46C.on("edited",O4C0);O470.Id1="O6F_id";O470.Id2="O3F8_id";_fixmultis_(O470); O4C1= (function(P0,P1,P2){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O470&Evt=columnresize&ColumnIndex="+P1.dataIndex+"&NewSize="+P2+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O470,e:"columnresize"});});O4C1.nm="O4C1";O470.on("columnresize",O4C1);O4C2.nm="O4C2";O4C2.uniMask={ldMask:true,maskMsg:"Loading data...",maskWaitData:false,maskUseMsg:true,maskAttribs:{color:"#FFFFFF",opacity:0.5}};O4C2.uniMask.targetObj=O470; O4C3=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"0",renderer:_rndcll_,rdonly:false,text:"Species No",align:"right",cf:"#.#######",ct:"float",width:81,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C3.nm="O4C3";O4C3.editor.focusDisabled=true; O4C4=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"1",renderer:_rndcll_,rdonly:false,text:"Category",width:94,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C4.nm="O4C4";O4C4.editor.focusDisabled=true; O4C5=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"2",renderer:_rndcll_,rdonly:false,text:"Common Name",width:184,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C5.nm="O4C5";O4C5.editor.focusDisabled=true; O4C6=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"3",renderer:_rndcll_,rdonly:false,text:"Species Name",width:163,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C6.nm="O4C6";O4C6.editor.focusDisabled=true; O4C7=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"4",renderer:_rndcll_,rdonly:false,text:"Length (cm)",align:"right",cf:"#.#######",ct:"float",width:94,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C7.nm="O4C7";O4C7.editor.focusDisabled=true; O4C8=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"5",renderer:_rndcll_,rdonly:false,text:"Length (In)",align:"right",cf:"#.#######",ct:"float",width:82,attr:"{ft:'11px Tahoma'}",editor:{xtype:"textfield",fieldStyle:"font:11px Tahoma;color:#000000"}});O4C8.nm="O4C8";O4C8.editor.focusDisabled=true; O4C9=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"6",renderer:_rndcll_,rdonly:false,text:"Notes",width:256,attr:"{ft:'11px Tahoma'}",unEditable:true});O4C9.nm="O4C9"; O4CA=new Ext.grid.column.Column({ogrid:O470,sortable:false,dataIndex:"7",renderer:_rndcll_,rdonly:false,text:"Picture",width:150,attr:"{ft:'11px Tahoma'}",unEditable:true});O4CA.nm="O4CA";var O470_Cols=[O4C3,O4C4,O4C5,O4C6,O4C7,O4C8,O4C9,O4CA];O470.reconfigure(null,O470_Cols);O470.uniConfigColumns();O4C3.setElProp({font:"11px Tahoma","text-align":"left"},null,0,null,null,"titleEl");O4C4.setElProp({font:"11px Tahoma"},null,0,null,null,"titleEl");O4C5.setElProp({font:"11px Tahoma"},null,0,null,null,"titleEl");O4C6.setElProp({font:"11px Tahoma"},null,0,null,null,"titleEl");O4C7.setElProp({font:"11px Tahoma","text-align":"left"},null,0,null,null,"titleEl");O4C8.setElProp({font:"11px Tahoma","text-align":"left"},null,0,null,null,"titleEl");O4C9.setElProp({font:"11px Tahoma"},null,0,null,null,"titleEl");O4CA.setElProp({font:"11px Tahoma"},null,0,null,null,"titleEl");O470.setElProp({font:"bold 11px Tahoma",color:"#008000"},null,5,".x-group-header",null,"headerCt");O474.loadPage(1,{params:{start:0,limit:25,options:1}});O48B.stateValue="0100000000000000010000001C00000001000000";O48B.Id1="O6F_id";O48B.Id2="O3F8_id"; O4CB= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O48B&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O48B,e:"edited"});});O4CB.nm="O4CB";O48B.on("edited",O4CB);O492.stateValue="0100000000000000010000001C00000001000000";O492.Id1="O6F_id";O492.Id2="O3F8_id";O496.setElProp("wrap","SOFT",2,null,false,"inputEl");O496.stateValue="0100000000000000010000001C00000001000000";O496.Id1="O6F_id";O496.Id2="O3F8_id"; O4CC= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O496&Evt=edited&This="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O496,e:"edited"});});O4CC.nm="O4CC";O496.on("edited",O4CC);O49A.Id1="O6F_id";O49A.Id2="O3F8_id"; O4CD= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O49A&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O49A,e:"click"});});O4CD.nm="O4CD";O49A.on("click",O4CD);O49E.Id1="O6F_id";O49E.Id2="O3F8_id"; O4CE= (function(P0){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O49E&Evt=click&this="+P0.nm+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O49E,e:"click"});});O4CE.nm="O4CE";O49E.on("click",O4CE);O4AA.stateValue="0100000000000000010000001C00000001000000";O4AA.Id1="O6F_id";O4AA.Id2="O3F8_id"; O4CF= (function(P0,P1,P2){return Ext.Ajax.request({url:"/demo/desktop/mdemo.dll/HandleEvent",params:"Ajax=1&IsEvent=1&Obj=O4AA&Evt=change&This="+P0.nm+"&newValue="+_xl_(P1)+"&oldValue="+_xl_(P2)+""+_gv_(O8),success:AjaxSuccess,failure:AjaxFailure,obj:O4AA,e:"change"});});O4CF.nm="O4CF";O4AA.on("change",O4CF);O400.Id1="O6F_id";O400.Id2="O3F8_id";O43C.setElProp("title","First record",2);O440.setElProp("title","Prior record",2);O444.setElProp("title","Next record",2);O448.setElProp("title","Last record",2);O44C.setElProp("title","Insert record",2);O450.setElProp("title","Delete record",2);O454.setElProp("title","Edit record",2);O458.setElProp("title","Post edit",2);O45C.setElProp("title","Cancel edit",2);O460.setElProp("title","Refresh data",2);O464.setElProp("title","Apply updates",2);O468.setElProp("title","Cancel updates",2);
Т.е. у ребят работает поверх HTTP некий свой протокол, который передает данные для построения формы и для изменения данных.
На сколько реально что-то поменять в этом процессе, я не знаю. Никакой документации по части
Как писать свои контролы (серверную и клиентскую часть
Как выглядит протокол обмена и каков жизненный цикл контролов
...
— я не нашел.
Более того, там есть достаточно интересные вещи — например, специальная Login Form, которая появляется в начале каждой сессии.
Т.е. если вы хотите использовать другую форму аутентификации: Windows на уровне транспорта (если у вас есть AD в компании — это вполне хороший вариант), или какой-нибудь вариант SSO (на базе WS-Federation, OAuth, ...) — то придется или сильно попотеть самому, или ждать когда реализуют авторы.
В общем, я еще более укрепился в своем первоначальном выводе — можно ограниченно использовать для небольших внутренних приложений, когда заказчик очень хочет, а кроме Delphi-разработчиков в штате нет никого.
Здравствуйте, rfillipenko, Вы писали:
R>Но ведь древний RDS обеспечивает хорошую скорость отклика. Почему нельзя выполнять приложение на сервере, и содержимое окна программы передавать аналогично тому, как работает RDS?
Ну так как я показал выше — ребята и изобрели свой RDP.
Точнне, что-то сродни X-Window, Citrix MetaFrame (если я не путаю кто в той линейке за что отвечал) или Microsoft Application Virtualization (App-V) — т.е. у вас запускается виртуальное приложение где-то в облаке, а пользователю транслируется его интерфейс.
Единственное, что здесь все рисуется в рамках браузера, но зато вам как разработчику придется писать отдельное приложение, а не просто виртуализовать свое имеющееся.
Здравствуйте, Михаил Романов, Вы писали:
МР>Единственное, что здесь все рисуется в рамках браузера, но зато вам как разработчику придется писать отдельное приложение, а не просто виртуализовать свое имеющееся.
То есть можно проектировать приложение, как с VCL без оглядки на ограничения html-разметки?
Здравствуйте, rfillipenko, Вы писали:
R>То есть можно проектировать приложение, как с VCL без оглядки на ограничения html-разметки?
Я не очень понял, о каких вы ограничениях, если честно.
Я подозреваю, что пока вы будете оставаться в рамках сценариев, которые продумывали разработчики фреймворка — всё будет работать более-менее нормально.
Но надо будет сразу смириться, с тем, что:
Требуется аккуратное управление ресурсами в рамках сессии. Т.к. в одном процессе, по сути будут хоститься сразу все подключения (даже если они могут раскидываться по множеству процесов в том же ISAPI варианте, это сильно ничего не меняет).
Использование сторонних компонентов будет затруднено или невозможно. Также, скорее всего будут сложности с использованием сторонних JS библиотек.
Многие, привычные в Web-приложениях, сценарии будут невозможны или сложно реализуемы (например, описанный мною пример с авторизацией, или задание разной авторизации для разных частей приложения).
Могут быть проблемы с реализаций некоторых привычных пользователем сценариев. Например, навигации (кнопки "Назад"), то что это SPA уже много лет как не является оправднием, пользователи привыкли переходит по ссылкам (которые можно сохранить в Favorites или переслать коллеге) или нажимать кнопку "Назад", чтобы вернуться к предыдущей странице — здесь этого нет (хотя сам ExtJS вроде как всё это поддерживает).
Ну и если возникнут проблемы придется влезать и в JS (а его там очень много: ExtJS — одна из первых JS GUI библиотек, они понаписат ьуспели изрядно), в собственный механизм uinGUI (который нигде не документирован)...
И собственно вопрос — на сколько возможно (в описанных условиях) переиспользование кода (например от имеющегося Desktop приложения). Как по мне — практически никак.
А раз так, то резонен следующий вопрос — а зачем тогда оно? Может всё же выделить небольшой ресурс на изучение параллельного стека и сделать нормальное веб-приложение?
T>>Это ж разные наборы VCL, где ты видишь единость? I>Это замена для стандартного VCL.
Честно говоря не представляю как можно заменить десктопный TForm на вебовский без существенных изменений.
I>Я подробностей реализации не знаю, но полагаю что этот набор VCL генерирует html/js фронтэнд. Т.е. вместо формы будут html страница. I>В некоторых случаях — это удобно. Но не во всех.
Может для генератора отчетов это и сойдет, но для полноценных веб-приложений нужно намного больше чем тупая генерация HTML.
Здравствуйте, Михаил Романов, Вы писали:
МР>А раз так, то резонен следующий вопрос — а зачем тогда оно? Может всё же выделить небольшой ресурс на изучение параллельного стека и сделать нормальное веб-приложение?
Позвольте полюбопытствовать, а что в Вашем понимании "нормальное вэб-приложение"?
просто интересно...
Здравствуйте, turbocode, Вы писали:
T>Честно говоря не представляю как можно заменить десктопный TForm на вебовский без существенных изменений.
В чем проблема? VCL — это визуальная библиотека. Ее можно заменить на FireMonkey.
T>Может для генератора отчетов это и сойдет, но для полноценных веб-приложений нужно намного больше чем тупая генерация HTML.
Не спорю. Область применения ограничена. Смысл в том, чтобы оставить текущую бизнес логику и заменить только пользовательский интерфейс.
Для нового проекта я бы не стал это использовать, а вот для старых — неплохая экономия времени.
Здравствуйте, wamaco, Вы писали:
W>Позвольте полюбопытствовать, а что в Вашем понимании "нормальное вэб-приложение"? W>просто интересно...
С моей точки зрения, нормой для современных вэб-приложений является (с точки зрения пользователя):
Хорошая масштабируемость.
Поддержка широкого спектра разрешений экрана.
Удобство работы как с desktop (клавиатура и мышь) так и с мобильным (тач) экраном
Поддержка привычного user experience. Тут еть сложности с тем, что для Web и Desktop приложение UX — весьма различается. Например, для Web-приложения является нормой наличие навигации, причес возможностью скопировать ссылку и вернутся по ней на то же место (или передать её кому-то чтобы он смог отктвть ту же страницу), тогда как для настольного приложение — это что-то из мира фантастики.
Для разработчиков также будут важны:
Простота разработки и отладки
Простота расширения функционала
Простота интеграции с другими сервисами
Для того, чтобы этим критериям удовлетворят, для современных вэб-фреймворков является фактически нормой:
Работа в stateless режиме. Сессии стараются избегать или делать её разделяемой между узлами кластера
Работа в Geo-распределенном режиме, т.е. когда ваше приложение может быть расположено не просто на нескольких узлах в одном дата-центре, а одновременно работать в нескольких центрах. При этом активно используется CDN для доставки единого статического (и не очень статического контента).
Использование адаптивной верстки и вообще широкий контроль за версткой со стороны разработчика. Здесь не просто проблема в том, что есть, условно, настольные и мобильные компьютеры, а в том, что у них разрешения экрана плавают (от нескольких пикселей до десятков и сотен), и ваше приложение должно быть готово подстроится под них.
Большой процент вычислений на стороне клиента. Начиная от банальной валидации в полях и автозаполнения, заканчивая переносом солидной части логики (иногда вообще всей).
Поддержку одновренменно Web и Desktop UX (на сколько это позволяют текущие технологии). Например, навигации в стиле Web, и перетаскивание Drag-n-Drop'ом файлов для загрузки, как это принято на Desktop
Явное разделение фронтенда и бэкенда и организации их взаимодействия на базе устояышихся протоколов и практик. Например, использование REST (или GraphQL) как базы для приложения. Это позволяет проектироват бэкенд сразу же готовым и для Web-фронтенда и для мобильных приложений (если таковые появятся) и как API для интеграции.
Следование стандартам или устоявшимся практикам (если еще нет стандартов) в части интеграции. Это касается и аутентификации (например, очень популярной ныне аутентификации третьей стороной — тем же Facebook), и API для интеграции, о котором я говорил в пункте выше.
(по крайней мере в enterprise) Использование как базы одного из устоявшихся Web-фреймворков (Angular, React, Vue, ...) — это позволяет легко переиспользовать готовые сторонние компоненты или дорабатывать имеющиеся.
Как-то так.
Из всего выше перечисленного у uniGUI есть
простота разработки (с точки зрения привычек Desktop-разработчика) в определенных сценариях.
некие заделы на адаптивную верстку, но там есть определенные проблемы (я пробовал открывать мобильный пример в нескольких браузерах и на нескольких устройствах — увы, разметка плывет, а вот поправить её не так и просто — управлять разметкой нет возможности),
частично сделано разделение фронтенд-части и бэкенда, но удобство разработки более-менее серьезной логики фронтенда под вопросом (а значит в сложном приложении будут сплошные запросы на сервер), ну а реализуемый протокол обмена бэкенда с фронтендом и вовсе ни для чего, кроме этого самого обмена и не предназначен.
Здравствуйте, icezone, Вы писали:
I>Здравствуйте, loginx, Вы писали:
L>>чего чего, какие такие ограничения? скорее наоборот, безграничная свобода
I>Вот тут не соглашусь — ограничения есть везде. На десктопе HTML будет всегда проигрывать GDI в плане быстродействия.
это отчего ж? обоснования такого мнения не увидел...
я вот в игре весь гуи в 3D на js — gdi не тянет плавность...
Здравствуйте, loginx, Вы писали:
L>это отчего ж? обоснования такого мнения не увидел... L>я вот в игре весь гуи в 3D на js — gdi не тянет плавность...
ты не находишь, что это немного разные вещи? GDI — это окна с контролами, а 3D — это DirectX/OpenGL
ты же не будешь на OpenGL делать текстовый редактор? для этого нужна HTML верстка и скрипты, которые будут дергать GDI/Direct2D
т.е. добавляется лишняя прокладка между GUI и WinAPI
Здравствуйте, icezone, Вы писали:
I>Здравствуйте, loginx, Вы писали:
L>>это отчего ж? обоснования такого мнения не увидел... L>>я вот в игре весь гуи в 3D на js — gdi не тянет плавность...
I>ты не находишь, что это немного разные вещи? GDI — это окна с контролами, а 3D — это DirectX/OpenGL I>ты же не будешь на OpenGL делать текстовый редактор? для этого нужна HTML верстка и скрипты, которые будут дергать GDI/Direct2D I>т.е. добавляется лишняя прокладка между GUI и WinAPI
Мне как прикладному прогеру пофиг, дай мне плавность, если для этого тебе надо переписать все на 3D — переписывай
И это уже сделано с некоторой степенью удачи в WPF и Delphi
И даже в Лисе я не знаю как там это сделано но сейчас, прямо сейчас я кладу контролы прямо на 3D канву и оно работает!
т.е. одноременно 3D объект крутится, а надписи поверх него на html и все Ок. все работает.
Здравствуйте, icezone, Вы писали:
I>Здравствуйте, loginx, Вы писали:
L>>это отчего ж? обоснования такого мнения не увидел... L>>я вот в игре весь гуи в 3D на js — gdi не тянет плавность...
I>ты не находишь, что это немного разные вещи? GDI — это окна с контролами, а 3D — это DirectX/OpenGL I>ты же не будешь на OpenGL делать текстовый редактор? для этого нужна HTML верстка и скрипты, которые будут дергать GDI/Direct2D I>т.е. добавляется лишняя прокладка между GUI и WinAPI
гуи элементы много разных на 3D сделаны в Дельфи и MS ВПФ, умеренное число гуи контролов закрывающих потребности игроделов 3D сделаны в юнити 3D
ты что-то сильно отстал от жизни
Здравствуйте, loginx, Вы писали:
L>гуи элементы много разных на 3D сделаны в Дельфи и MS ВПФ, умеренное число гуи контролов закрывающих потребности игроделов 3D сделаны в юнити 3D L>ты что-то сильно отстал от жизни
это какие контролы на 3D сделаны? кнопки, списки, меню?
не нужны юнити и 3D в обычных приложениях от слова совсем