Re[8]: Delphi для Web
От: turbocode  
Дата: 03.11.17 21:16
Оценка:
T>>То есть на каждого посетителя сайта будет на сервере запускаться программа на Delphi?
K>А как по-твоему работают сайты? Ну вот RSDN, например?

Вебсервер обрабатывает HTTP-запросы но он не хранит состояние сайта, а только принял, обработал и отдал назад.
Отредактировано 03.11.2017 21:17 turbocode . Предыдущая версия .
Re[9]: Delphi для Web
От: Kerk  
Дата: 03.11.17 21:20
Оценка:
Здравствуйте, 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.

Re[10]: Delphi для Web
От: turbocode  
Дата: 03.11.17 21:26
Оценка:
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 так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.
Re[11]: Delphi для Web
От: wamaco  
Дата: 03.11.17 21:30
Оценка:
Здравствуйте, turbocode, Вы писали:
]

T>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.


они из коробки ISAPI
Re[12]: Delphi для Web
От: turbocode  
Дата: 03.11.17 21:33
Оценка:
T>>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.
W>они из коробки ISAPI

Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше?
Re[13]: Delphi для Web
От: Kerk  
Дата: 03.11.17 21:38
Оценка: :)
Здравствуйте, turbocode, Вы писали:

T>>>Сессия это просто (key, value) контейнер данных, она сама по себе ничего не делает. Как видно из описания любая программа на Delphi так просто не заработает в вебе, а нужно еще делать поддержку каких то там модулей.

W>>они из коробки ISAPI

T>Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше?


И ничего. Этот uniGUI — это отдельная от VCL визуальная библиотека. Ну почитай ты сайт, елки-палки. Я тоже этой штукой ни разу не пользовался, но за полторы минуты сайты посмотрел.
Re[9]: Delphi для Web
От: icezone  
Дата: 03.11.17 22:07
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Вебсервер обрабатывает HTTP-запросы но он не хранит состояние сайта, а только принял, обработал и отдал назад.


Правда что-ли? Вебсервер сам запросы обрабатывает? Ты где-то в 90х застрял, на уровне статических страниц.
Re[10]: Delphi для Web
От: turbocode  
Дата: 03.11.17 22:17
Оценка:
I>Правда что-ли? Вебсервер сам запросы обрабатывает? Ты где-то в 90х застрял, на уровне статических страниц.

В смысле сам? Кто то на PHP, кто на ASP.NET сидит. Но это ж никакие не приложения на Delphi.
Re[14]: Delphi для Web
От: turbocode  
Дата: 03.11.17 22:19
Оценка:
T>>Допустим есть приложение на старом добром VCL, этот VCL ничего не знает о вебе. Что дальше?
K>И ничего. Этот uniGUI — это отдельная от VCL визуальная библиотека.

Это еще ужаснее чем я думал: потому что создавать одно и тоже приложение с разными наборами визуальных библиотек это самое худшее что может быть.
Re[11]: Delphi для Web
От: icezone  
Дата: 03.11.17 22:33
Оценка:
Здравствуйте, turbocode, Вы писали:

T>В смысле сам? Кто то на PHP, кто на ASP.NET сидит. Но это ж никакие не приложения на Delphi.


Это были твои слова. Теперь осталось объяснить разницу между интерпретатором PHP и приложением на Delphi.
Re[12]: Delphi для Web
От: turbocode  
Дата: 03.11.17 22:45
Оценка:
T>>В смысле сам? Кто то на PHP, кто на ASP.NET сидит. Но это ж никакие не приложения на Delphi.
I>Это были твои слова. Теперь осталось объяснить разницу между интерпретатором PHP и приложением на Delphi.

Мне неизвестен принцип того как приложения на Delphi будут работать в вебе. Если ты знаешь то расскажи, вместо того чтобы здесь газировать лужи тупыми вопросами.
Re[15]: Delphi для Web
От: icezone  
Дата: 03.11.17 22:45
Оценка: +1
Здравствуйте, turbocode, Вы писали:

T>Это еще ужаснее чем я думал: потому что создавать одно и тоже приложение с разными наборами визуальных библиотек это самое худшее что может быть.


Почему ты упорно отказываешься читать описание и выдумываешь проблемы?
Технология предлагает единый GUI для веба и десктопа. Бекэнд делаешь на delphi, а фронтэнд генерируется на js.

Я примерно так реализовал просмотр отчетов в одной программе, когда попросили сделать удаленный доступ, только фронтэнд сделал руками.
На Indy сделал сервер с генерацией отчетов и авторизацией. При удаленном просмотре человек использует браузер,
а на десктопе все отображается через приложение с EmbeddedWB.
Отредактировано 03.11.2017 22:58 icezone . Предыдущая версия . Еще …
Отредактировано 03.11.2017 22:58 icezone . Предыдущая версия .
Re[13]: Delphi для Web
От: icezone  
Дата: 03.11.17 22:57
Оценка: +1
Здравствуйте, turbocode, Вы писали:

T>Мне неизвестен принцип того как приложения на Delphi будут работать в вебе. Если ты знаешь то расскажи, вместо того чтобы здесь газировать лужи тупыми вопросами.


Я с тебя угораю — как работает ты не знаешь, но мнение имеешь.
Ок, приложения на Delphi будут работать точно так же как и приложения на C++, PHP, Perl,...
а еще ведь Node.js есть, он тебе точно мозг взорвет

Может с чего-нибудь попроще начнем? Например, как любой бекэнд общается с вебсервером?
Или — зачем веб приложению внешний вебсервер?
Re[16]: Delphi для Web
От: turbocode  
Дата: 03.11.17 22:59
Оценка:
I>Технология предлагает единый GUI для веба и десктопа.
Это ж разные наборы VCL, где ты видишь единость? Ну да визуально они похожи но от этого ни холодно ни жарко, потому что морду для приложения нужно делать дважды: одну для десктопа, а другую для веба.

I>Бекэнд делаешь на delphi,

Есть языки и получше для бекенда чем Delphi.

I>а фронтэнд генерируется на js.

Где генерируются (на фронте или на бекенде)? Чем генерируются? На основании чего генерируются?
Re[14]: Delphi для Web
От: turbocode  
Дата: 03.11.17 23:02
Оценка:
I>Может с чего-нибудь попроще начнем? Например, как любой бекэнд общается с вебсервером?
I>Или — зачем веб приложению внешний вебсервер?

Это оффтоп.
Re[17]: Delphi для Web
От: icezone  
Дата: 03.11.17 23:39
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Это ж разные наборы VCL, где ты видишь единость?


Это замена для стандартного VCL.

T>Есть языки и получше для бекенда чем Delphi.


Об этом можно спорить бесконечно. Зависит от поставленной задачи.

T>Где генерируются (на фронте или на бекенде)? Чем генерируются? На основании чего генерируются?


Я подробностей реализации не знаю, но полагаю что этот набор VCL генерирует html/js фронтэнд. Т.е. вместо формы будут html страница.
В некоторых случаях — это удобно. Но не во всех.
Re[15]: Delphi для Web
От: icezone  
Дата: 03.11.17 23:49
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Это оффтоп.


Почему? Ты же сам спросил как delphi может взаимодействовать с вебсервером...
Под Apache модули делаются через FastCGI, под IIS на ISAPI. На любом языке.
Можно и сам сервер сделать на Delphi с блекджеком и ...
Re: Delphi для Web
От: icezone  
Дата: 03.11.17 23:51
Оценка:
Здравствуйте, gangastyle, Вы писали:

G>http://unigui.com/

G>Есть смысл использовать для web-приложений в шароваре?

немного погуглил — есть масса альтернатив
Raudus, ExtPascal, Morfik
Re[3]: Delphi для Web
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 04.11.17 04:46
Оценка:
Здравствуйте, turbocode, Вы писали:

МР>>В целом, концепция у ребят очень напоминает ASP.Net Web Forms.


T>Я так понял что там всё заделали на JavaScript+Ajax никаких ASP.Net Web Forms там и близко нету.

Не знаю. По тому, что я увидел, выглядит похоже:

Т.е. всяко должен быть механизм создания этой самой формы, приема изменений от клиента, передачи результата на клиент (причем, т.к. поддерживается динамическое создание компонент передвать надо не только данные, но и разметку в каком-то виде).
Большой разницы с 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);

  А это похоже на данные
Для грида

{metaData :{ "totalProperty":"results", "root":"rows","fields":["0","_0","1","_1","2","_2","3","_3","4","_4","5","_5","6","_6","7","_7","_x","_r"]},"success":true, "results":28, "rows":[{id:0,0:90020,_0:"",1:"Triggerfish",_1:"",2:"Clown Triggerfish",_2:"",3:"Ballistoides conspicillum",_3:"",4:50,_4:"",5:19.6850393700787,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:0},{id:1,0:90030,_0:"",1:"Snapper",_1:"",2:"Red Emperor",_2:"",3:"Lutjanus sebae",_3:"",4:60,_4:"",5:23.6220472440945,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:1},{id:2,0:90050,_0:"",1:"Wrasse",_1:"",2:"Giant Maori Wrasse",_2:"",3:"Cheilinus undulatus",_3:"",4:229,_4:"",5:90.1574803149606,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:2},{id:3,0:90070,_0:"",1:"Angelfish",_1:"",2:"Blue Angelfish",_2:"",3:"Pomacanthus nauarchus",_3:"",4:30,_4:"",5:11.8110236220472,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:3},{id:4,0:90080,_0:"",1:"Cod",_1:"",2:"Lunartail Rockcod",_2:"",3:"Variola louti",_3:"",4:80,_4:"",5:31.496062992126,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:4},{id:5,0:90090,_0:"",1:"Scorpionfish",_1:"",2:"Firefish",_2:"",3:"Pterois volitans",_3:"",4:38,_4:"",5:14.9606299212598,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:5},{id:6,0:90100,_0:"",1:"Butterflyfish",_1:"",2:"Ornate Butterflyfish",_2:"",3:"Chaetodon Ornatissimus",_3:"",4:19,_4:"",5:7.48031496062992,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:6},{id:7,0:90110,_0:"",1:"Shark",_1:"",2:"Swell Shark",_2:"",3:"Cephaloscyllium ventriosum",_3:"",4:102,_4:"",5:40.1574803149606,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:7},{id:8,0:90120,_0:"",1:"Ray",_1:"",2:"Bat Ray",_2:"",3:"Myliobatis californica",_3:"",4:56,_4:"",5:22.0472440944882,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:8},{id:9,0:90130,_0:"",1:"Eel",_1:"",2:"California Moray",_2:"",3:"Gymnothorax mordax",_3:"",4:150,_4:"",5:59.0551181102362,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:9},{id:10,0:90140,_0:"",1:"Cod",_1:"",2:"Lingcod",_2:"",3:"Ophiodon elongatus",_3:"",4:150,_4:"",5:59.0551181102362,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:10},{id:11,0:90150,_0:"",1:"Sculpin",_1:"",2:"Cabezon",_2:"",3:"Scorpaenichthys marmoratus",_3:"",4:99,_4:"",5:38.9763779527559,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:11},{id:12,0:90160,_0:"",1:"Spadefish",_1:"",2:"Atlantic Spadefish",_2:"",3:"Chaetodiperus faber",_3:"",4:90,_4:"",5:35.4330708661417,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:12},{id:13,0:90170,_0:"",1:"Shark",_1:"",2:"Nurse Shark",_2:"",3:"Ginglymostoma cirratum",_3:"",4:400,_4:"",5:157.48031496063,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:13},{id:14,0:90180,_0:"",1:"Ray",_1:"",2:"Spotted Eagle Ray",_2:"",3:"Aetobatus narinari",_3:"",4:200,_4:"",5:78.740157480315,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:14},{id:15,0:90190,_0:"",1:"Snapper",_1:"",2:"Yellowtail Snapper",_2:"",3:"Ocyurus chrysurus",_3:"",4:75,_4:"",5:29.5275590551181,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:15},{id:16,0:90200,_0:"",1:"Parrotfish",_1:"",2:"Redband Parrotfish",_2:"",3:"Sparisoma Aurofrenatum",_3:"",4:28,_4:"",5:11.0236220472441,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:16},{id:17,0:90210,_0:"",1:"Barracuda",_1:"",2:"Great Barracuda",_2:"",3:"Sphyraena barracuda",_3:"",4:150,_4:"",5:59.0551181102362,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:17},{id:18,0:90220,_0:"",1:"Grunt",_1:"",2:"French Grunt",_2:"",3:"Haemulon flavolineatum",_3:"",4:30,_4:"",5:11.8110236220472,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:18},{id:19,0:90230,_0:"",1:"Snapper",_1:"",2:"Dog Snapper",_2:"",3:"Lutjanus jocu",_3:"",4:90,_4:"",5:35.4330708661417,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:19},{id:20,0:90240,_0:"",1:"Grouper",_1:"",2:"Nassau Grouper",_2:"",3:"Epinephelus striatus",_3:"",4:91,_4:"",5:35.8267716535433,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:20},{id:21,0:90250,_0:"",1:"Wrasse",_1:"",2:"Bluehead Wrasse",_2:"",3:"Thalassoma bifasciatum",_3:"",4:15,_4:"",5:5.90551181102362,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:21},{id:22,0:90260,_0:"",1:"Jack",_1:"",2:"Yellow Jack",_2:"",3:"Gnathanodon speciousus",_3:"",4:90,_4:"",5:35.4330708661417,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:22},{id:23,0:90270,_0:"",1:"Surfperch",_1:"",2:"Redtail Surfperch",_2:"",3:"Amphistichus rhodoterus",_3:"",4:40,_4:"",5:15.748031496063,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:23},{id:24,0:90280,_0:"",1:"Croaker",_1:"",2:"White Sea Bass",_2:"",3:"Atractoscion nobilis",_3:"",4:150,_4:"",5:59.0551181102362,_5:"",6:"(MEMO)",_6:"",7:"(GRAPHIC)",_7:"",_r:24}]}

И для таймера

O41.setText("04/11/2017 07:29");



Т.е. у ребят работает поверх HTTP некий свой протокол, который передает данные для построения формы и для изменения данных.
На сколько реально что-то поменять в этом процессе, я не знаю. Никакой документации по части
— я не нашел.

Более того, там есть достаточно интересные вещи — например, специальная Login Form, которая появляется в начале каждой сессии.
Т.е. если вы хотите использовать другую форму аутентификации: Windows на уровне транспорта (если у вас есть AD в компании — это вполне хороший вариант), или какой-нибудь вариант SSO (на базе WS-Federation, OAuth, ...) — то придется или сильно попотеть самому, или ждать когда реализуют авторы.


В общем, я еще более укрепился в своем первоначальном выводе — можно ограниченно использовать для небольших внутренних приложений, когда заказчик очень хочет, а кроме Delphi-разработчиков в штате нет никого.
Re[3]: Delphi для Web
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 04.11.17 05:01
Оценка:
Здравствуйте, rfillipenko, Вы писали:

R>Но ведь древний RDS обеспечивает хорошую скорость отклика. Почему нельзя выполнять приложение на сервере, и содержимое окна программы передавать аналогично тому, как работает RDS?

Ну так как я показал выше — ребята и изобрели свой RDP.
Точнне, что-то сродни X-Window, Citrix MetaFrame (если я не путаю кто в той линейке за что отвечал) или Microsoft Application Virtualization (App-V) — т.е. у вас запускается виртуальное приложение где-то в облаке, а пользователю транслируется его интерфейс.

Единственное, что здесь все рисуется в рамках браузера, но зато вам как разработчику придется писать отдельное приложение, а не просто виртуализовать свое имеющееся.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.