IntraWeb для розробки Web-додатків

Читаючи forum.xakep.ru я натрапив на один цікавий топік. Програміст-початківець запитав: «Як зробити форум, інтернет магазин на Delphi або на чомусь іншому?!». Відповіді мене здивували, хоча, звісно, ​​і питання було дещо дивно сформульоване. Проте саме засобам створення Web-додатків Borland завжди приділяла особливу увагу. Не є винятком і такий дуже популярний продукт цієї компанії, як Delphi. До його складу, в різних версіях, були включені такі потужні інструменти створення Web-додатків, як Web Broker, Web Snap і Web Services. Ці інструменти дозволили розробникам повною мірою використати можливості Delphi для реалізації бізнес-логіки у Web-додатках. Тим не менш, при цьому передбачається, що програміст для створення складних динамічних сторінок повинен все ж таки включати до своїх додатків фрагменти коду, написані іншими мовами (JScript або VBScript). Природно, що далеко не кожен розробник GUI-додатків має достатні навички створення та використання скриптових конструкцій. Разом з тим в даний час завдання реалізації повнофункціонального Web-інтерфейсу для великих інформаційних систем стає все більш актуальною.

І ось, починаючи із сьомої версії, Delphi поповнилася ще одним засобом створення Web-додатків – IntraWeb від компанії AtoZed Software. Про основи роботи з цим продуктом я хочу розповісти у статті.

Розглянутий продукт істотно спрощує процес розробки, позбавляючи Delphi-програміста необхідності впровадження у вихідний код фрагментів, написаних іншими мовами програмування. Тепер Web-програми можна розробляти, використовуючи виключно мову Delphi, при необхідності IntraWeb автоматично зробить конвертування програмних елементів ускрипти або HTML-код. Спробуємо розглянути роботу IntraWeb трохи докладніше та виявити переваги, які надає ця технологія.

IntraWeb підтримує два режими розробки – режим програми (Application Mode) та сторінковий режим (Page Mode). У режимі сторінки, програми можуть створюватися у форматах ISAPI, Apache DSO, NSAPI, CGI, або Win-CGI. У режимі програми – тільки формати ISAPI, NSAPI та Apache DSO. Незважаючи на те, що сторінковий режим має дещо більшу гнучкість, у рамках цієї статті зупинимося на розгляді роботи в режимі додатку, як більш простому для вивчення загальних концепцій IntraWeb.

Щоб створити новий проект виберемо пункт меню FileNewOther і перейдемо на закладку IntraWeb. З безлічі запропонованих варіантів оберемо Stand Alone Application. Така програма буде самостійним сервером. Користувач може звернутися до нього з браузера, набравши в командному рядку відповідну програму URL.

Після вибору типу проекту необхідно вказати директорій, у якому програма буде збережена. Після того, як всі перераховані вище дії виконані, ми отримаємо заготівлю програми. Заготівля включає три модулі – IWProject, IWUnit1 і ServerController.

IWProject є безпосередньо основним модулем проекту, виконується ініціалізація програми, а також підключаються форми, що входять до складу проекту. Як видно з наведеного нижче лістингу, що містить текст модуля IWProject, структура IntraWeb-проекту в принципі подібна до структури звичайного додатка.

program IWProject; uses IWInitStandAlone, ServerController in 'ServerController.pas' , IWUnit1 in 'IWUnit1.pas' ; begin IWRun(TFormMain, TIWServerController); end.

TUserSession =class public Username: string; Password: string; end; то надалі з будь-якого модуля програми можна буде викликати синтаксичну конструкцію такого вигляду:

UserSession.Username := ‘Joe’; LPassword := UserSession.Password;

Саме таким чином розробники IntraWeb рекомендують організовувати глобальні змінні у додатку. Якщо ж просто оголосити їх у секції public деякого модуля, як це робиться у звичайних додатках, то такі змінні будуть загальними для всіх сесій, що, відповідно, може спричинити конфлікти, пов'язані зі спробою змінювати їх значення одночасно різними користувачами.

Тепер розглянемо останній модуль, що входить до складу нашого проекту, – IWUnit1. У ньому описується форма формиосновного. Поглянувши на Object Inspector, відразу стає ясно, що ця форма має суттєві відмінності від звичайної форми програми Delphi - TForm. Саме ця форма і є заготівлею головної сторінки нашої програми, і вона має відображатися у браузері. Спробуємо розмістити на формі кілька компонентів з набору IW Standart – IWLabel, IWEdit та IWButton.

Щоб побачити, як виглядатиме тільки, що створена форма в дії, запустимо додаток на виконання. У формі, що з'явилася, натиснемо першу зліва кнопку (Launch selected browser and execute application). У вікні браузера з'явиться сторінка з розміщеними на ній елементами керування, тобто створена нами форма тепер відображається як HTML сторінка. Щоб надалі уникнути подібної, щодо довгої процедури запуску додамо для нашої програми параметр “/LaunchBrowser”. Для цього використовуйте пункт меню RunParameters.

Спробуємо додати до проекту деяку функціональність. Повернімося до режиму редагуванняпрограми та напишемо обробник події OnClick для компонента IWButton1:

procedure TformMain.IWButton1Click(Sender: TObject); begin IWLabel1.Caption:=IWEdit1.Text; end; Неважко здогадатися, що має статися. І дійсно, запустивши програму, можна побачити, що при натисканні на кнопку мітка IWLabel1 буде відображати той текст, який введений у поле введення IWEdit1.

У форму, що створюється, можна додати і фрагменти HTML коду. Розмістивши на формі компонент TIWText. За промовчанням цей компонент дозволяє просто відображати на сторінці статичний текст. Однак, якщо ви встановите значення властивості RawText - true, а властивості WantReturns - false, то текст, занесений за допомогою Object Inspector у властивість Lines буде сприйматися додатком як код HTML. Перш ніж перейти до розгляду роботи з базами даних в IntraWeb, давайте розглянемо механізми взаємодії між окремими формами програми. Для того, щоб додати в наш проект ще одну форму, активізуємо пункт меню FileNewOther, перейдемо на закладку IntraWeb і виберемо Application Form. Збережемо отриманий модуль на диску. Якщо після цього поглянути на вихідний код проекту (ProjectView Source), то ми побачимо, що форми, що входять до складу IntraWeb програми не створюються автоматично, як це відбувається в звичайному додатку. Як уже говорилося раніше, у вихідному коді нашого проекту відсутні рядки ініціалізації форм подібні до наступного.

Натомість створювати форми доведеться вручну. При натисканні на кнопку IWButton1 у нашому додатку відкриватимемо нову форму. Для цього додамо назву модуля, в якому знаходиться нова форма, до списку модулів, що використовуються для основної форми програми. У секцію public зухвалої форми додамо такий опис:

Подію OnCreate обробимо наступним чином:

procedure TformMain.IWAppFormCreate(Sender: TObject); begin FNewForm:=TFormMain1.Create(WebApplication); end;.

І, нарешті, при натисканні кнопки викличемо нову форму, змінивши код обробника події OnClick:

procedure TformMain.IWButton1Click(Sender: TObject); begin FNewForm.Show; end; Запустивши програму, переконайтеся, що при натисканні на кнопку IWButton1 браузер виведе на екран порожню сторінку. Далі додамо на другу форму (formMain1) компонент IWLabel. Нашим завданням буде відображення тексту, введеного у полі введення IWEdit1. Для цього перед викликом форми достатньо вставити рядок такого змісту:

FNewForm.IWLabel1.Caption:= IWEdit1.Text; Таким чином, ми бачимо, що значення властивостей компонентів, що розміщуються, можна передавати між формами IntraWeb-додатків без використання об'єкта TUserSession. Це відбувається тому, що компоненти на формах є членами класів самих IntraWeb форм, і, відповідно, ініціалізуються окремо для кожної сесії.

Тепер спробуємо відобразити на головній сторінці програми дані з таблиці. Як завжди, у таких випадках скористаємося таблицею customer.db із бази даних DBDEMOS. Створимо нове Stand Alone with Data Module додаток. У DataModule1 помістимо компоненти TDatabase, TTable, TSession та TDataSource. Встановимо для компонентів такі властивості:

ВластивістьЗначення
Session1
AutoSessionNameTrue
Table1
DatabaseNameDBDEMOS
TableNamecustomer.db
DataSource1
DataSetTable1

Взагалі, мені досить рідкотраплялися Web-сторінки, що дозволяють редагувати дані безпосередньо в таблиці, що відображається. Технічно реалізувати таку можливість непросто. Однак компонент IWDBGrid дозволяє досягти такого ефекту. Я не докладно розповідатиму, як це робиться, за бажання ви можете звернутися до демонстраційного прикладу. Натомість хотілося б трохи докладніше розглянути поведінку деяких компонентів відображення даних. Так формування списків з набору даних у звичайних додатках досить часто використовуються компоненти DBLookupComboBox і DBLookupListBox. У тому випадку, якщо важливо лише здійснити вибір будь-якого значення, без занесення його в інший набір даних властивості DataSource значення не присвоюється. Достатньо лише визначити властивості ListSource, ListField та KeyField. На мій погляд, особливо зручно те, що при виборі конкретного значення такого списку відбувається, відповідно, зміна поточного запису, що дає можливість легко визначити значення ключового поля. Компоненти IWDBLookupComboBox та IWDBLookupListBox, очевидно, не дозволяють зробити подібну операцію. Для того, щоб отримати значення ключового поля вибраного запису, доводиться встановлювати значення властивості DataField.

При роботі з даними варто звернути увагу на поведінку сервера при натисканні кнопки “Back” браузера. Справа в тому, що в цьому випадку може порушуватися синхронізація програми, і користувач отримає повідомлення приблизно такого змісту: Ви спробували переслати або оновити дані зі сторінки, інформація про яку вже не підтримується серверним додатком. Спробу внести зміни буде проігноровано. Ви будете синхронізовані з поточним місцем програми».information that is no longer available to the application server. Ваші активні зміни будуть ignored. Ви будете нещодавно перенесені до поточного місця в application). Після виведення цього повідомлення програма буде повернена в той стан, в якому він прибував до натискання кнопки “Back”. Проте, якщо виникає необхідність робити повернення на попередню сторінку, то настроїти поведінку програми при натисканні кнопки “Back” дозволить зміну значення якості .HistoryEnabled. Попереджувальне повідомлення також може бути вимкнено, якщо встановити значення властивості .ShowResyncWarning - false.

І все ж, щоб зайвий раз не спокушати користувача, я волію викликати InterWeb програми в окремому вікні браузера з відключеним командним рядком.

Як видно з розглянутих прикладів, використання технології IntraWeb може помітно полегшити процес написання Web-додатків. Delphi-програміст у процесі розробки, образно висловлюючись, потрапляє у рідне середовище, тобто. робить ту роботу, що він звик робити.

Крім того, незважаючи на те, що Web-додатки мають безліч незаперечних переваг перед звичайними, «настільними» додатками, вони далеко не завжди можуть надати користувачеві гнучкість, яка може бути реалізована в GUI-програмах. Пов'язано це, на мій погляд, насамперед із тим, що повнофункціональний Web-інтерфейс організувати значно складніше. Розробник серверних додатків повинен витрачати велику кількість часу на написання необхідних елементів управління та їх прив'язку до даних, або максимально спрощувати інтерфейс користувача, що може призвести до втрати функціональності програми. Можливо, поява IntraWeb у складі Delphi 7 і розвиток цієї технології в трьох наступних версіях продукту,реально може сприяти вирішенню цієї проблеми та відкрити багато цікавих технічних рішень.