Главная » Delphi » Простое приложение WAP

0

Создание приложения WAP в Delphi  немного отличается от  создания обычного Web приложения. Возможно, создание приложения WAP даже  проще, поскольку  ог раничения, свойственные WAP и  его  устройствам, позволяют создавать более  про стые  серверные приложения, чем  те,  которые необходимы традиционным броузер ориентированным приложениям. Но эта медаль имеет  и обратную сторону:  разработ чику сложнее создать  приложение, которые должно  обеспечить конечным пользова телям необходимый уровень  сервиса вопреки этим ограничениям.

Для данного примера создадим  сначала  обычное приложение WebBroker, подоб ное тому, которое было  создано  в главе 23, “Разработка приложений WebSnap”.  Дан ное приложение имеет  один Web модуль, выполняющий одно действие. Это действие отмечено как установленное по умолчанию (рис. 24.3).

Рис. 24.3. Простое приложение

WebBroker для WAPВ листинге 24.1  представлен исходный код  главного модуля  этого  приложения, включая   обработчик события OnAction —  действия,  заданного для  Web модуля  по умолчанию.

Листинг 24.1. Main.pas — главный  модуль  проекта SimpWapunit Main;

interface uses

SysUtils, Classes, HTTPApp;

type

TWebModule1 = class(TWebModule)

procedure WebModule1WebActionItem1Action(Sender: TObject;

Request: TWebRequest; Response: TWebResponse;

var Handled: Boolean);

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

WebModule1: TWebModule1;

implementation

{$R *.DFM}

const

SWMLContent = ‘text/vnd.wap.wml';

SWMLDeck =

‘<?xml version="1.0"?>’#13#10 +

‘<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"’#13#10 +

‘"http://www.WAPforum.org/DTD/wml_1.1.xml">’#13#10 +

‘<wml>’#13#10 +

‘         <card>’#13#10 +

‘           <do type="accept">’#13#10 +

‘             <go href="#hello"/>’#13#10 +

‘           </do>’#13#10 +

‘           <p>Punch the Button</p>’#13#10 +

‘         </card>’#13#10 +

‘         <card id="hello">’#13#10 +

‘           <p>Hello from WAP!</p>’#13#10 +

‘         </card>’#13#10 +

‘</wml>’#13#10;

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest;

Response: TWebResponse; var Handled: Boolean);

begin

Response.ContentType := SWMLContent;

Response.Content := SWMLDeck;

end;

end.

При  вызове действия срабатывает обработчик события OnAction, заполняя свой ства  ContentType и Content объекта Response. Свойство ContentType получает строковое значение, устанавливающее тип  содержимого WML,  а возвращено  будет содержимое той  же самой  простой карточки WAP, которая уже рассматривалась ра нее в настоящей главе.

НА ЗАМЕТКУ

Не забудьте присвоить свойству ContentType объекта Response строку, содержащую тип MIME возвращаемого содержимого. Она установит информацию о типе в заголовке HTTP. Если тип будет возвращен (а следовательно и установлен) неправильно, то со- держимое будет, вероятно, искажено на устройстве назначения. Наиболее распро- странены следующие типы WAP:

•   text/vnd.wap.wml — для кода WML.

•   text/vnd.wap.wmlscript — для кода сценариев WML.

•   image/vnd.wap.wbmp — для беспроводных растровых изображений.

На рис. 24.4 это простое приложение WAP представлено в действии.

  

 Рис. 24.4. Приложение WAP в действии

Сообщения об ошибках

Стандартный обработчик исключений для приложений WebSnap  передает клиенту сообщение HTML,  содержащие информацию об ошибке.  Конечно, большинство уст ройств WAP будет неспособно понять сообщение в формате HTML,  поэтому  следует удостовериться, что информация о любых ошибках, которые могут произойти в при ложении WAP, будут переданы клиенту  в виде WML, а не HTML.  Это можно  сделать, заключив каждый  обработчик события OnAction в блок  try..except, который бу дет содержать функцию, предающую  сообщению об ошибках  соответствующий фор мат. Это показано в листинге 24.2.

Растровые изображения

Хоть  WAP и не  поддерживает изображений JPEG и GIF,  принятых в Web,  боль шинство устройств WAP поддерживает монохромные изображения в форме беспро водных  растров (.wbmp). В листинге 24.2 Web модуль содержит новую возможность — создание wbmp. Специальное действие генерирует солидного вида,  но  совершеннослучайный график для представления на дисплее  мобильного устройства. Не  будем вдаваться в подробности бинарного формата файлов .wbmp, но, как очевидно из кода, его создание не вызывает затруднений. Рис. 24.5 демонстрирует, как будет выглядеть график WBMP на дисплее мобильного телефона.

НА ЗАМЕТКУ

Не все WAP-броузеры, устройства и эмуляторы поддерживают изображения .wbmp. Удо-

стоверьтесь, что используемое устройство обладает этой возможностью.

Листинг 24.2. Main.pas. Еще раз и с чувством

unit Main; interface uses

SysUtils, Classes, HTTPApp;

type

TWebModule1 = class(TWebModule)

procedure WebModule1WebActionItem1Action(Sender: TObject;

Request: TWebRequest; Response: TWebResponse;

var Handled: Boolean);

procedure WebModule1GraphActionAction(Sender: TObject;

Request: TWebRequest; Response: TWebResponse;

var Handled: Boolean);

private

procedure CreateWirelessBitmap(MemStrm: TMemoryStream);

procedure HandleException(e: Exception;

Response: TWebResponse);

end;

var

WebModule1: TWebModule1;

implementation

{$R *.DFM}

const

SWMLContent = ‘text/vnd.wap.wml';

SWBMPContent = ‘image/vnd.wap.wbmp';

SWMLDeck =

‘<?xml version="1.0"?>’#13#10 +

‘<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"’#13#10 +

‘"http://www.WAPforum.org/DTD/wml_1.1.xml">’#13#10 +

‘<wml>’#13#10 +

‘         <card>’#13#10 +

‘           <do type="accept">’#13#10 +

‘             <go href="#hello"/>’#13#10 +

‘           </do>’#13#10 +

‘         <p>Punch the Button</p>’#13#10 +’     </card>’#13#10 +

‘         <card id="hello">’#13#10 +

‘           <p>Hello from WAP!</p>’#13#10 +

‘         </card>’#13#10 +

‘</wml>’#13#10;

SWMLError =

‘<?xml version="1.0"?>’#13#10 +

‘<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"’#13#10 +

‘"http://www.wapforum.org/DTD/wml_1.1.xml">’#13#10 +

‘<wml>’#13#10 +

‘         <card id="error" title="SimpWAP">’#13#10 +

‘           <p>Error: %s’#13#10 +

‘             <do type="prev" label="Back">’#13#10 +

‘               <prev/>’#13#10 +

‘             </do>’#13#10 +

‘           </p>’#13#10 +

‘         </card>’#13#10 +

‘</wml>’#13#10;

procedure TWebModule1.HandleException(e: Exception;

Response: TWebResponse);

begin

Response.ContentType := SWMLContent;

Response.Content := Format(SWMLError, [e.Message]);

end;

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest;

Response: TWebResponse; var Handled: Boolean);

begin try

Response.ContentType := SWMLContent; Response.Content := SWMLDeck;

except

on e: Exception do

HandleException(e, Response);

end;

end;

procedure TWebModule1.WebModule1GraphActionAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

var

MemStream: TMemoryStream;

begin

try

MemStream := TMemoryStream.Create;

try

CreateWirelessBitmap(MemStream);

MemStream.Position := 0;

with Response do begin

ContentType := SWBMPContent;ContentStream := MemStream; SendResponse;

end;

finally

MemStream.Free;

end;

except

on e: Exception do

HandleException(e, Response);

end;

end;

procedure TWebModule1.CreateWirelessBitmap(MemStrm: TMemoryStream);

const

Header : Array[0..3] of Char = #0#0#104#20;

var

Bmp: array[1..104,1..20] of Boolean;

X, Y, Dir, Bit: Integer;

B: Byte;

begin

{ очистить изображение }

FillChar(Bmp,SizeOf(Bmp),0);

{ прорисовка осей X и Y }

for X := 1 to 104 do Bmp[X, 20] := True;

for Y := 1 to 20 do Bmp[1, Y] := True;

{ прорисовка случайных данных }

Y := Random(20) + 1;

Dir := Random(10);

for X := 1 to 104 do begin

Bmp[X,Y] := True;

if (Dir > 4) then Y := Y+Random(2)+1

else Y := Y – Random(2) – 1;

if (Y > 20) then Y := 20;

if (Y < 1) then Y := 1;

Dir := Random(10);

end;

{ создать данные WBMP }

MemStrm.Write(Header, SizeOf(Header));

Bit := 7;

B := 0;

for Y := 1 to 20 do begin

for X := 1 to 104 do begin

if Bmp[X,Y] = True then

B := B or (1 shl Bit);

Dec(Bit);

if (Bit < 0) then begin

B := not B;

MemStrm.Write(B, SizeOf(B));

Bit := 7;

B := 0;

end;

end;end;

end;

initialization

Randomize;

end.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии