Introduction

a. Quoi, encore un nouveau composant de développement Web dans Delphi 7?

Après ISAPI/CGI, WebSnap, les WebServices, voici que Borland nous propose IntraWeb dans Delphi 7. Les questions que certains peuvent se poser:

  • - A forçe de rajouter des outils de développement Web, Borland déroute?
  • - Tous ces outils doivent créer sans doute une redondance?
  • - On passera plus de temps à choisir un outil plutôt que de commencer à programmer immédiatement avec un seul?

b. A qui et à quoi est destiné Intraweb ?

Les réponses à ces questions : Intraweb n'est pas un outil comme les autres. Il ne remplace pas les autres méthodes. Borland nous offre certes une manière de plus de développer des applis Web, mais a surtout voulu rendre accessible, par une approche bien plus intuitive, le développement Web aux programmeurs Delphi habitués à développer des applications RAD standard.

Apprendre ISAPI, WebSnap ou SOAP, c'est acquérir une technique supplémentaire, une méthodologie différente, qui demande un investissement considérable en apprentissage, tâtonnements, mises au point etc.. Avec IntraWeb, c'est immédiat : vous développez comme pour une application normale à partir d'une forme ou vous déposez des composants. Et ça ne vous demandera pas plus de temps de créer une page Intraweb destinée à être posée sur un serveur Web qu'une forme Delphi standard. Vous posez sur cette nouvelle forme style Delphi les boutons, dialogues, combobox standards etc..., vous codez les événements, assignez les propriétés, compilez... ET CA ROULE... Le débogage ? Vous déboguez votre application là aussi comme une application normale.

L'accès à une base de données ? Plus simple tu meurs : un composant Database (ou création en runtime évidemment), un DBGrid, un DBNavigator, un datasource et pof... l'appli est prête à être portée sur le Web avec navigation, insertion, suppression, modification immédiate. Génial non? :-)

Vous pouvez en plus, bien évidemment, comme tout composant Delphi, créer vos propres composants Intraweb dérivés des composants de base.

c. Intraweb rend caduques les autres techniques?

La réponse est claire : c'est non ?

WebSnap, pour des applications relativement simples, avait déjà considérablement accéléré le processus de développement RAD par rapport à ISAPI ou il fallait mettre la mimine dans le cambouis. Je devrais dire "il faut toujours", car WebBroker (ISAPI), loin d'être mort et enterré, reste, dans la majorité des cas, un outil extrêmement souple et efficace.

Quant à WebSnap, il est d'une telle richesse, voire complexité parfois, que l'on ne peut simplement le ramener à un outil de développement RAD. Intraweb déjà plus, car plus immédiat. Pas besoin de connaître le HTML, les actions d'une ISAPI, les paramètres, le Jscript, les Adapter...X etc... Toutes ces techniques qui déroutent quelque peu le débutant. Mais malgré tout, si vous désirez aller plus loin, Intraweb vous le permet : il s'intègre parfaitement à une appli WebSnap ou WebBroker. Vous travaillez soit en Application mode, développement RAD, soit en Page mode ou les apprentis sorciers de l'ISAPI (WebBroker) traditionnel se retrouveront parfaitement.

Intraweb gère enfin automatiquement la persistence et l'unicité d'une session lors d'une connection client avec réglage du timeout. A chaque création de module Intraweb, une session avec ou sans paramètres utilisateurs est crée. En mémoire ou par cookies. Et gère également les templates. Et pour terminer, pour déployer vos applications, vous n'avez besoin d'aucun serveur Web. Tout est dans Intraweb, prêt à l'emploi. Ou alors, vous utilisez IIS ou Apache. Que demander de plus?

Enjoy...

1. Créer l'application

Nous allons nous amuser à faire une application légère de gestion de Delphinautes. La base de données est une base Firebird 6 qui est en ligne sur mon serveur Ngscan. Vous pourrez à tout moment tester les étapes en ligne

Créons une application Intraweb (ci-après IW), en utlisant le module Standalone application with Datamodule (j'ai D7 en anglais). Vous voyez immédiatement qu'Intraweb vous permet de créer des exécutables "standalone", des DSO pour serveurs Apache et des ISAPI's pour IIS.

Image non disponible

Delphi nous demande le répertoire dans lequel nous allons mettre notre projet. Créez un répertoire nommé IWDnautes. Sauvez votre projet sous IWDnautes.dpr

Dans le datamodule, nous allons ajouter les compos IB (référez-vous aux divers didacticiels sur www.developpez.com ou à l'aidre d'IB pour configurer les divers composants). Voilà le résultat:

Image non disponible

Notre base est maintenant prête à être utilisée par notre application.

2. Créer notre première forme

Peuplez votre forme des différents composants Intraweb pour aboutir à l'exemple iwtest. (TIWDBGrid, TIWDBEdit, TIWDBImage, TIWDBMemo). Ajoutez également un composant TIWMenu que nous connecterons plus tard. Nous affinerons également l'affichage un peu plus loin.

Reliez les composants DB au datasource du datamodule. Ouvrez votre base et votre query dans l'événement OnCreate du Datamodule et... lancez l'application. Ce run va lancer le serveur web Intraweb intégré. Vous n'avez pas besoin d'avoir d'autre serveur Web que celui-ci pour développer vos applications avec Intraweb.

Image non disponible

Vous sélectionnez le browser que vous désirez (celui par défaut ou Internet Explorer), et lancez l'application par F9. (A noter qu'Intraweb ne fonctionne pas avec Netscape 4.x) ET C'EST TOUT.... :-)

Evidemment, vous n'obtenez pas tout de suite la disposition telle que dans l'example, mais votre grille et vos dialogues de données doivent afficher les valeurs de votre base.

3. Affiner la grille

Nous allons nous attacher maintenant à créer une grille cliquable, qui nous permette de nous positionner directement sur un enregistrement. Pour ce faire, nous allons définir les colonnes de notre grille. Cliquez sur la propriété Columns du IWDBGrid et rajoutez les champs de votre requête que vous désirez afficher:

Image non disponible

Afin que l'utilisateur puisse cliquer sur une colonne, c'est ici que vous choisissez laquelle. Dans notre exemple, nous choisissons de cliquer sur la clé primaire de notre base (ID). Sélectionnez donc dans l'éditieur de colonne le champ ID, et dans ces propriétés, il suffit de mettre sous "linkfield", le nom de la colonne que vous voulez être cliquable.

Image non disponible

Afin qu'une action réponde au clic sur le lien, il suffit, dans l'événemment OnClick de cette colonne ID de mettre un code du style:

 
Sélectionnez

If not DataModule1.IbQuery.Locate('id',StrToInt(AValue),[]) then
  Webapplication.ShowMessage('N''existe pas');

Vous pouvez également, dans les propriétés de la grille, choisir diverses options intéressantes, comme par exemple RollOver, RollOverColor, RowAlternateColor qui vous permette d'alterner la couleur pour chaque ligne, de définir une couleur lorsque la souris passe sur le champ etc... et donneront à vos applications un caractère pro sans une seule ligne de Jscript. Vous pouvez également définir quelle est la couleur de la cellule de l'enregistrement sélectionné.

Autre élément important des propriétés, le FromStart. En le mettant à false, la grille affichera uniquement les enregistrements suivant celui qui a été sélectionné. A true, tous les enregistrements depuis le premier sont affichés.

La propriété UseFrame vous permet de choisir soit un affichage dans une grille avec scrolling, soit alors simplement un affichage de style tableau HTML simple.

4. Charger et sauver une image, créer un menu, afficher une nouvelle fenêtre

Pour le chargement d'une image, il est difficile de faire plus simple. Le composant TIWDBFile affichera automatiquement le boîte de dialogue "parcourir" afin de peupler le champ BLOB de votre base. Il faut simplement noter que le format GIF, pour les raisons légales que l'on connaît, n'est pas pris en charge par Intraweb. Vous pouvez par contre très bien utiliser des composants GIF pour Delphi, qu'Intraweb utilisera ensuite pour la conversion.

Concernant le menu, c'est tout aussi simple. En plus du TIWMenu, vous ajoutez un composant TMenu Delphi standard et vous l'assignez à la propriété AttachedMenu du TIWMenu. C'est tout. Et c'est par le composant TMenu standard que vous définissez les valeurs et les actions de votre menu.

Voici à quoi devrait ressembler votre forme principale:

Image non disponible

Pour montrer à quel point le codage est identique à une appli normale, voici le code OnClick du bouton de tri:

 
Sélectionnez

procedure TformMain.IWButton1Click(Sender: TObject);
begin
  With DataModule1.IbQuery do
  Begin
    Close;
    Case rTri.ItemIndex of
    0 : SQL.Text:='Select * from NAME order by NOM, PRENOM';
    1 : SQL.Text:='Select * from Name order by ID';
    end;
    Open;
  end;
end;

Vous voulez une nouvelle page ? Vous choisisez, dans fichier->nouveau->autre->Intraweb de D7, une applicationForm que vous créez comme une forme normale (je l'ai appelée TfWindow2), et dans l'événement OnClick de votre TMenuItem vous mettez tout simplement :

 
Sélectionnez
TfWindow2.Create(WebApplication).Show;

Pour retourner à la page principale, vous rajoutez dans la nouvelle fenêtre un bouton libellé "fermer" par exemple, ou vous codez le OnClick par :

 
Sélectionnez
Release;

Je me répète : plus simple, tu meurs...

A noter qu'Intraweb, pour des raisons évidentes de rafraîchissement et pertinence des données, annihile les actions "back" et "forward" du navigateur. Seules des actions définies dans les pages permettent la navigation.

5. Déploiement de l'application

Sous la forme d'exécutable, Intraweb, ne nécessite aucun serveur Web. Il suffit de lancer l'exécutable dans le répertoire de votre choix, (ou de le lancer en tant que service) et de l'appeler ensuite par http://127.0.0.1:4002/, soit le no IP local de votre machine (ou IP fixe si vous en avez un), et le no de port que vous avez attribué à votre application. Ce numéro de port est défini dans la propriété port de TIWServerController+. C'est tout.

Pour un déploiement sur IIS ou Apache, La transformation de votre exécutable en ISAPI ou DSO est obligatoire. Mais là aussi , c'est extrêmement simple. Il suffit en fait de changer le source de votre projet. Les unités restent absolument les mêmes. Voici d'abord le fichier source de l'éxécutable que j'ai appelé DNautes.

 
Sélectionnez

program DNautes;

{PUBDIST}

uses
  IWInitStandAlone,
  ServerController in 'ServerController.pas' {IWServerController: TDataModule},
  IWUnit1 in 'IWUnit1.pas' {formMain: TIWForm1},
  DatamoduleUnit in 'DatamoduleUnit.pas' {DataModule1: TDataModule},
  uWin2 in 'uWin2.pas' {fWindow2: TIWPageForm};

{$R *.res}

begin
  IWRun(TFormMain, TIWServerController);
end.

Et voici à quoi doit ressembler le code source de l'ISAPI:

 
Sélectionnez

library iwtest;

uses
  IWInitISAPI,
  ServerController in 'ServerController.pas' {IWServerController: TDataModule},
  IWUnit1 in 'IWUnit1.pas' {formMain: TIWForm1},
  DatamoduleUnit in 'DatamoduleUnit.pas' {DataModule1: TDataModule},
  uWin2 in 'uWin2.pas' {fWindow2: TIWPageForm};

{$R *.res}

begin
  IWRun(TFormMain, TIWServerController);
end.

Vous créez ainsi tout simplement 2 DPR, un pour l'exécutable, l'autre pour l'ISAPI. Vous évitez ainsi, tous les problèmes assez épineux soulevés par le déboguage d'ISAPI.

6. Les sessions

Pour comprendre le mécanisme des sessions, il nous faut prendre le code de l'unité ServerController. Nous y trouvons la classe:

 
Sélectionnez

TUserSession = class(TComponent)
public
  DataModule1: TDataModule1;
  TimeOut:Integer;
  UserName:String;
  constructor Create(AOwner: TComponent); override;
end;

Cet objet est créé à chaque nouvel appel à votre module. Vous constatez que le Datamodule fait partie de cet objet. C'est lui qui nous garantit l'unicité d'une session. Tout comme dans les ISAPI's, vous devez donc absolument éviter de déclarer des variables globales. C'est dans cette classe que vous ajoutez toutes les variables que vous voulez assigner à un user précis (nom, prénom, adresses, etc...). Vous pouvez ainsi très facilement ajouter des objets caddies par exemple dans un TStringList. Toutes ces variables sont stockées dans .data de TIWApplication. Le développement d'un module de e-commerce par exemple devient d'une facilité déconcertante

 
Sélectionnez

procedure TIWServerController.IWServerControllerBaseNewSession(ASession: TIWApplication; var VMainForm: TIWAppForm);
begin
  ASession.Data := TUserSession.Create(ASession);
end;

Vous y accédez par : UserSession.NomDeVariable (ex. UserSession.UserName). Intraweb gère ceci par la fonction UserSession:

 
Sélectionnez

function UserSession: TUserSession;
begin
  Result := TUserSession(RWebApplication.Data);
end;

Pour un Login automatique, vous utilisez la propriété AuthList de IWServerController. Authlist est un StringList. Vous devez y insérer les noms et mot de passe des utilisateurs acceptés sous la forme username=password. Vous pouvez ainsi, par un AuthList.LoadFromFile('myusers.txt') charger la liste à partir d'un fichier externe à l'appli ou vous ajoutez ou supprimez les users. Dès qu'une valeur est ajoutée à AuthList, la procédure de login est lancée automatiquement, à savoir qu'un dialogue demandera le username et password lors du lancement de l'appli. Quite easy :-)

Intraweb gère également le Timeout d'une session. Vous réglez cette valeur dans la propriété SessionTimeOut de TIWServerController. La valeur par défaut est de 10 minutes.

Enjoy... hope it helps :-)))

7. Liens

Le source du projet Définautes

Les fichiers d'aide originaux (en anglais)

Vous cherchez un hébergeur pour vos applis IntraWeb? Tout est là, et c'est pas cher :-))))

Image non disponible

Mon moteur de recherche Ngscan: http://www.ngscan.com

Newsgroup nzn sur Internet : news://news.vienneinfo.org/nzn.fr.delphi.Internet