1 - Présentation IntraWeb
Intraweb est un jeu de composants Delphi permettant de développer des applications Web de
façon visuelle: le développeur choisit ses composants sur la Palette, les dépose sur la Forme,
modifie ses propriétés dans l'Inspecteur d'Objet, et effectue des traitements dans du code
Pascal (Delphi)
Depuis Delphi 2, Borland a fait de gros efforts pour nous offrir des composants permettant de
créer des sites Web. Ces composants (WebBroker, WebSnap) étaient cependant surtout
orientés vers la création de pages dynamiques par code. La partie construction visuelle de la
présentation de la page (mise en page, image, couleurs) n'était pas possible visuellement.
Personne n'a compris pourquoi une société capable de poser et ajuster quelques labels et
boutons sur une tForm Windows a choisi de ne pas permettre de poser quelques labels et
boutons sur une future page .HTML.
C'est donc ce vide immense qui a été comblé par Intraweb, et nous allons présenter
l'utilisation de cette technique.
Nous allons utiliser Delphi 2006, mais ce que nous présentons pourrait être réalisé avec les
composants Intraweb disponibles pour les versions Delphi 5, Delphi 6, Delphi 7, Delphi 8,
Delphi 2005, Delphi 2006, Turbo Delphi et Delphi 2007
2 - La Première Applications IntraWeb
Commençons par l'exemple simple de la calculette:
l'utilisateur tape l'adresse Web d'une page permettant de faire des multiplications
son explorateur web lui présente une page avec 2 Edit et un bouton
l'utilisateur tape 2 nombre et clic le bouton
son explorateur lui renvoie le résultat
Par conséquent
créez sur votre disque un dossier 01_calculator
lancez Delphi 2006
lancez le Wizard Intraweb en sélectionnant "File | New | Other | Intraweb | Intraweb
wizard"
L'emplacement des Wizards Intraweb dans les menus Delphi ainsi que le contenu des
différents dialogues varie avec les versions de Delphi, mais le mécanisme reste le même
Intraweb présente un dialogue permettant spécifier le type d'application Intraweb que
vous souhaitez créer
C:\programs\fr\web\intraweb\01_calculator
p_01_calculator
et cliquez "Ok"
Intraweb crée 3 unités
Cette étape peut être sautée, mais notre expérience de Delphi 2006 nous a appris à
effectuer cette sauvegarde avant de poursuivre. Donc sélectionnez chaque unité tour à
tour et sélectionnez "Save As" pour
Puis dans la Palette, sélectionnez la page correspondant aux composants visuels "IW
Standard", puis sélectionnez un tIwEdit
et posez-le sur la Forme.
compilez
le Serveur Internet Intraweb est affiché:
nous avons utilisé IntraWeb en mode "StandAlone": notre application contient en fait
un Serveur Web qui est chargé de fournir notre page à Internet Explorer. Il existe un
autre mode, dit mode "Page" dont nous parlerons à la fin de notre présentation
comme indiqué, l'emplacement dans les menus Delphi du Wizard qui lance le serveur
Standalone peut varier énormément selon la version de Delphi. Mais en naviguant un
peu dans ces menus, il n'est guère difficile de trouver la page Intraweb, et sur cette
page une icône correspondant au mode Standalone
lorsque nous exécutons le projet et lançons le Serveur (F9 ou l'icône verte), il ne faut
pas trop tarder à remplir la page et cliquer sur le bouton. Il y a en effet une
temporisation qui peut bloquer la réponse. Dans ce cas relancez l'exécution Delphi
3 - Le fonctionnement Intraweb
3.1 - Fonctionnement Internet
<HTML>
<BODY>
Bienvenue sur notre site
</BODY>
</HTML>
La page, qui peut être rédigée en utilisant NotePad (ou tout autre éditeur de texte
ASCII) est sauvegardée sur disque, sous le nom de HELLO.HTML, par exemple
le développeur lance un Serveur Web, qui est une application qui écoute et attend les
requêtes provenant de clients. Ce serveur peut être IIS (Internet Information Server),
Apache, un serveur Web écrit en utilisant des Sockets Delphi:
un utilisateur lance un explorateur web (Internet Explorer, Netscape, un client Web écrit
avec des Sockets Delphi, ...), et demande à l'explorateur web de rapporter la page
HELLO.HTML:
le Serveur Web localise HELLO.HTM, l'envoie vers l'explorateur, qui l'affiche:
la construction du texte .HTML de la page sera fait de façon visuelle en posant des
composants sur la Forme. Les propriétés de ces composants seront utilisées par
Intraweb pour générer le fichier .HTML
le Serveur Web est un Le fichier .HTML résultant
cette application est lancée, et elle correspond à un Serveur Web Intraweb, plus les
paramètres des pages construites:
un utilisateur lance un explorateur web (Internet Explorer, Netscape, un client Web écrit
avec des Sockets Delphi, ...), et demande à l'explorateur web de rapporter la page
HELLO.HTML:
le Serveur Web Intraweb utilise les paramètres de la Forme pour construire la page
HELLO.HTML, et la retourne au client qui l'affiche:
La génération d'une page .HTML à partir d'un Forme n'est en fait pas très complexe: il suffit
d'analyser les propriétés des contrôles et générer les balises .HTML (<BODY>, <INPUT>
etc) correspondantes. Nous avons d'ailleurs présenté dans l'article Delphi Web Designer un
projet Delphi permettant de générer une page .HTML à l'aide de contrôles Delphi (tPanel,
tEdit, tLabel ...) posés sur une tForm. Notre générateur est bien entendu très simplet par
rapport aux contrôles IntraWeb, mais il permet de comprendre le principe. De plus, Intraweb
a ajouté le Serveur Web, et même le lancement de l'Explorateur Web.
nous utiliserons le Serveur Web IntraWeb (plutôt que les composants WebBroker)
ce Serveur est construit à l'aide des composants Indy. Ceci explique d'ailleurs les
possibilités SSL (Secure Socket Layer, ou encore mode TCP/IP sécurisé) offertes par
Intraweb
IwServerController est chargé de gérer l'application, et en particulier
o les sessions utilisateur
o les exceptions
Voici un diagramme de classe UML simplifié (les classes Intraweb représentées sont
celles de Delphi 6):
Les pages sont appelées par un Explorateur Web en utilisant une URL ayant la
structure suivante (visible sur la capture d'écran ci-dessus):
et:
Nos schémas ci-dessus ont présenté la mécanique de requête de page par un Explorateur, et la
réponse .HTML du Serveur Web.
Lorsque la page .HTML contient des zones de saisie (texte, checkbox, bouton radio, listbox),
il y a un double aller-retour entre l'Explorateur et le Serveur.
Tout d'abord, il faut comprendre que la mécanique utilisée pour qu'un utilisateur échange des
informations avec un Serveur est l'antique technique des <FORM> .HTML. Elle fonctionne
ainsi:
le développeur place dans son texte .HTML une balise <FORM> à l'intérieur de
laquelle se trouvent des balises pour:
au moins un bouton
des contrôles de saisie. Par exemple un Edit
<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM METHOD="POST"
ACTION="http://www.jcolibri.com/convert.exe">
valeur en euro ?
<INPUT TYPE="edit"NAME="les_euros"><BR>
<INPUT TYPE="submit"VALUE="convertis"><BR>
</FORM>
</BODY>
</HTML>
où
Le point extrêmement important est que le traitement du "clic" est effectué sur le Serveur.
Cette mécanique est chevillée dans le protocole .HTML, et est identique que nous mettions en
oeuvre CGI, ISAPI, NSAPI, ASP, ASP.NET ou ... Intraweb. Pour résumer
Lorsque nous utilisons une page .HTML construite avec Intraweb et qui contient des
contrôles, la mécanique est la même, sauf que
Notez que:
TOUTES nos pages, plus le Serveur Intraweb sont contenus dans un seul .EXE (en
mode Application).
Nous avons présenté la mécanique CGI pour bien illustrer le fonctionnement sous-jacent.
Mais vous n'aurez pas à programmer de CGI, ISAPI, d'écrire de balises .HTML etc: c'est
Intraweb qui mettra tout en place. C'est ce que nous allons examiner à présent.
4 - Quelques Techniques IntraWeb
4.1 - Exemples IntraWeb
Maintenant que nous avons présenté un premier exemple ainsi que le fonctionnement de base
d'IntraWeb, nous allons examiner quelques exemples un peu plus élaborés:
Un site est en général composé de plusieurs pages .HTML, et l'utilisateur navigue d'une page
à une autre en utilisant des hyper-liens ou des boutons.
nous créons autant de pages Intraweb additionnelles que nous souhaitons en utilisant
"File | New | Other | Intraweb | New Form"
Intraweb gère une pile de pages actives, et
o au lancement c'est la page par défaut qui est ajoutée à la pile
o lorsque l'utilisateur clique un bouton, le Serveur prend la main, en fait dans le
OnClick du bouton de la page cliquée. Pour que le Serveur renvoie une page
vers l'utilisateur, il faut
créer la seconde page
my_iw_page:= t_my_iw_page.Create(WebApplication);
my_iw_page.Show
o ce qui peut, dans ce cas de "création + affichage" être abrégé par:
t_my_iw_page.Create(WebApplication).Show
o lorsque nous souhaitons qu'une page ne soit pas retournée à l'utilisateur, nous
appelons:
my_iw_page.Hide
o et
la page est retirée de la liste des pages actives
la page située au sommet de la pile est retournée à l'utilisateur
Notez que:
les nouvelles pages sont ajoutées par "File | New | Other | Intraweb | New Form", PAS
en ajoutant une nouvelle Forme Windows ("File | New | Form")
pour retourner une nouvelle page, il FAUT utiliser iw_page.Show(), et jamais
ShowModal. De même pour supprimer une page, il faut utiliser iw_page.Hide() (et
pas Visible:= False). Ce sont en effet ces deux primitives Show() et Hide() qui gèrent
la pile des pages IntraWeb
Voici un exemple avec deux pages: la première calcule le taux du dollar, la seconde renvoie
la valeur.
lancez une nouvelle application IntraWeb par "File | New | Other | Intraweb | Intraweb
Application Wizard"
le wizard est affiché
tapez le chemin et le nom de l'application, par exemple P_02_TWO_PAGES. et cliquez
"OK"
la nouvelle application est créée
modifiez aussi le nom de UNIT1 en U_02_TWO_PAGES_1, et le nom de tIwForm1 en
tIwForm_page_1
compilez pour vérifier
l_c_iwform_page_2:= tiwform_page_2.Create(WebApplication);
l_c_iwform_page_2.iwlabel1.Caption:= IwEdit1.Text
+ ' euros = '+ FloatToStr(l_dollar)+ ' US $';
l_c_iwform_page_2.Show();
// -- same as
// with tiwform_page_2.Create(WebApplication) do
// begin
// iwlabel1.Caption:= IwEdit1.Text+ ...ooo...
// Show;
// end;
end; // convertClick
implementation
uses u_02_two_pages_2;
Et pour que la seconde page permette de revenir à la page 1 pour entrer une nouvelle valeur:
sélectionnez U_02_TWO_PAGES_2
de l'onglet "IW Standard" de la Tools Palette, sélectionnez un tIwLabel posez-le sur la
Forme
de l'onglet "IW Standard", sélectionnez un tIwButton, nommez-le "backbutton", créez
son événement OnClick, et retirez la seconde page de la pile
procedure TiwForm_page_2.backbuttonClick(Sender: TObject);
begin
Hide();
// Release();
end; // backbuttonClick
compilez et exécutez
le Serveur est affiché
clickez l'icône pour lancer l'Explorateur
la page 1 est affichée
Notez que
et par la suite, cet utilisateur ajoute ou retire des pages actives à sa liste par Show() et Hide().
4.2.4 - Création et Destruction
Pour créer une page, il faut utiliser, comme nous l'avons indiqué ci-dessus:
t_my_iw_page.Create(WebApplication)
my_iw_page.Release
En fait dans l'exemple ci-dessus nous avons utilisé page_2.Hide(), alors que nous aurions du
employer page_2.Release()
Comme chaque page a un référence vers tIwApplication qui contient la liste des pages, il est
possible, à titre de debugging, de visualiser cette liste:
sélectionnez U_02_TWO_PAGES_1
de l'onglet "IW Standard" de la Tools Palette, sélectionnez un tIwListBox et posez-la sur
la Forme
sélectionnez un tIwButton, nommez-le "pagestack", créez son événement OnClick, et
affichez la liste des pages (exécuté par le Serveur lorsqu'il traitera pagelist.Click)
procedure TIWForm_page_1.pagestackbuttonClick(Sender: TObject);
var l_form_index: Integer;
begin
with IwListBox1 do
begin
Clear;
for l_form_index:= 0 to WebApplication.FormCount- 1 do
Items.Add(WebApplication.Forms[l_form_index].Name);
end; // with iwIlistBox1
end; // pagestackbuttonClick
Pour le moment nous avons affiché nos pages via le Serveur Standalone. Naturellement nos
utilisateurs seront sur une machine éloignée, et c'est eux qui lanceront la demande d'une page
de notre site.
En fait, il suffit dans Internet Explorer de fournir l'adresse et le port (si ce n'est pas le port 80)
pour obtenir la page principale, puis de naviguer à partir de là.
Nous utilisons à l'Institut Pascal un réseau local, et le poste sur lequel est le Serveur Intraweb
a l'adresse IP 152.178.41.18 (lancez ipconfig.exe pour éventuellement connaître l'adresse de
votre poste). Pour effectuer notre essai, il faut connaître le port. Par conséquent
http://152.178.41.18:8888/ Entrée
la page est affichée dans Internet Explorer, comme précédemment
placer les composants d'accès aux bases de données sur le tDataModule UserSession
initialiser la connection avec la base
ajouter à la tIwForm quelques champs tIwDb_xxx
Par conséquent:
lancez une nouvelle application IntraWeb par "File | New | Other | Intraweb | Intraweb
Application Wizard"
le wizard est affiché
tapez le chemin et le nom de l'application, par exemple P_03_DBEDIT et cliquez "OK"
la nouvelle application est créée
modifiez aussi le nom de UNIT1 en U_03_DBEDIT
compilez pour vérifier
Dans l'Inspecteur
Pour varier les plaisirs, voici une application avec une grille et un moteur SQL Interbase.
Tout d'abord, créons un nouveau projet:
lancez une nouvelle application IntraWeb par "File | New | Other | Intraweb | Intraweb
Application Wizard"
le wizard est affiché
tapez le chemin et le nom de l'application, par exemple P_04_DBGRID et cliquez "OK"
la nouvelle application est créée
modifiez aussi le nom de UNIT1 en U_04_DBGRID_INTERBASE
compilez pour vérifier
compilez et exécutez
voici le résultat:
Nous pouvons utiliser plusieurs propriétés pour varier l'affichage dans une tIwDbGrid:
4.4.3 - Pagination
Lorsque la Table est de grande taille, il est coûteux et inefficace de transférer vers le client
toutes les lignes. Nous pouvons limiter le nombre de lignes envoyées en utilisant RowLimit,
et en gérant par des boutons la demande de la page précédente ou suivante.
Par exemple:
posez un tIwButton sur la Forme, créez son événement OnClick et tapez le code qui
déplace la ligne courante d'un nombre de lignes égale au nombre de lignes de le
tIwDbGrid:
procedure TIWForm1.next1Click(Sender: TObject);
begin
UserSession.IbQuery1.MoveBy(IwDbGrid3.RowLimit);
end; // next1Click
Importez aussi dans la liste des USES SERVERCONTROLLER pour pouvoir accéder à
USERSESSION.IbQuery1
posez de même un bouton pour reculer
compilez et exécutez
voici le résultat :
Notez que
IbQuery1 est sur le DataModule USERSESSION. Comme indiqué plus haut, il n'y a
PAS de variable globale nous permettant de désigner ce DataModule. En revanche,
ServerController a créé une FUNCTION, appelée UserSession, qui nous permet
d'accéder aux composant de TIWUserSession
vous pouvez aussi ajouter le code qui inhibe les boutons lorsque nous dépassons les
limites (IbQuery.Eof etc)
le lecteur attentif aura remarqué que dans la dbGrid2, la couleur jaune souligne bien
que c'est "japan" qui est devenue la ligne courante
comme nous ne pouvons utiliser un IwButton1.Name tel que "next_", nous avons
utilisé "next1". Le risque est en effet, dans des WITH éventuels, d'utiliser le nom
Next ayant une signification pour d'autres composants faisant partie du WITH. Si
vous n'employez pas de WITH, nommez les boutons comme bon vous semble.
4.4.4 - tDbGrid modifiable
Nous allons examiner comment l'utilisateur peut changer les valeurs présentées dans un
grille. Nous allons en profiter pour montrer comment utiliser une connection ADO.
lancez une nouvelle application IntraWeb par "File | New | Other | Intraweb | Intraweb
Application Wizard"
le wizard est affiché
tapez le chemin et le nom de l'application, par exemple P_05_DBGRID_ADO et
cliquez "OK"
la nouvelle application est créée
modifiez aussi le nom de UNIT1 en U_05_DBGRID_ADO
compilez pour vérifier
Ici, nous allons utiliser le fichier ACCESS fourni avec Delphi, appelé DBDEMOS.MDB. Ce
fichier est situé, dans notre cas, en
C:\Program Files\Fichiers communs\Borland Shared\Data\
et nous l'avons copié dans un répertoire plus confortable, appelé \_data, proche de notre
application
sélectionnez U_02_EDIT_DBGRID_ADO
pour que les composants db_xxx puissent accéder à DataSource1, ajoutez à la clause
USES l'importation de UserSessionUnit
de l'onglet "Data Access" de la Palette, sélectionnez une tDataSource, posez-la sur la
tForm et initialisez DataSource1.DataSet vers AdoDataSet1
de l'onglet "Iw Data", selectionnez une tIwDbGrid et posez-la sur la Forme.
Sélectionnez DatataSource et initialisez-la vers DataSource1
pour que ADO fonctionne, il faut aussi s'occuper de l'initialisation des objets COM:
sélectionnez SERVERCONTROLLER.PAS
dans l'Inspecteur, initialisez IwServerController.ComInitialization à ciNormal
ou ciMultiThreaded
à titre de vérification, lancez l'application et vérifiez que vous voyez bien la table
Notez que:
il faut basculler ComInitialization. Si cette étape n'est pas effectuée, vous aurez une
erreur "coinitialize" qui est, pour les utilisateurs d'ADO avec IntraWeb, l'erreur la plus
fréquente. Cette propriété n'est pas initialisée par IntraWeb par défaut, car elle n'a lieu
d'être que pour ADO
nous avons aussi montré ici que nous pouvons placer le tDataSource sur la
TIWForm1 (comme nous pouvons choisir de le placer sur tIwUserSession)
si la connexion ADO ne réussit pas, vous pouvez faire l'exercice avec une Table BDE,
InterBase, ou tout autre composant d'accès
Puis limitez le nombre de lignes et posez les tIwButton pour naviguer dans la grille, comme il
a été présenté dans le paragraphe précédent.
C'est cette dernière solution que nous avons retenue. Elle s'inspire en fait de ASP.NET, ou,
lorsque nous souhaitons modifier une grille. Démontrons d'abord schématiquement ce que
nous souhaitons faire:
An niveau IntraWeb:
nous commençons par ajouter 3 colonnes pour nos boutons. Cela se fait en créant les
colonnes de tIwDbGrid manuellement, en utilisant la propriété tIwDbGrid.Columns
l'incrustation de tIwButtons et tIwEdits se fait en gérant l'affichage de chaque cellule.
Pour cela la tIwDbGrid comporte un événement tIwDbGrid.OnRenderCell (similaire
aux événement OwnerDraw d'une tDbGrid usuelle):
m_do_modify: Boolean;
m_selected_row: Integer;
m_selected_key: String;
et:
l_column_index: Integer;
l_c_iwedit: tIwEdit;
begin
SetLength(m_c_do_modify_button_list, IwDbGrid1.RowLimit);
m_c_do_modify_button_list[l_row_index]:= l_c_do_modify_button;
end; // for l_row_index
SetLength(m_c_edit_list, k_table_column_count);
for l_column_index:= 0 to k_table_column_count- 1 do
begin
l_c_iwedit:= tIwEdit.Create(Self);
with l_c_iwedit do
Text:= 'Edit_'+ IntToStr(l_column_index);
m_c_edit_list[l_column_index]:= l_c_iwedit;
end; // for l_column_index
m_c_do_post_button:= tIwButton.Create(Self);
with m_c_do_post_button do
begin
Color:= clWebLime;
Caption:= 'Post';
OnClick:= handle_do_post_click;
Visible:= False;
end; // with m_c_do_post_button
m_c_do_cancel_button:= tIwButton.Create(Self);
with m_c_do_cancel_button do
begin
Color:= clWebRed;
Caption:= 'Cancel';
OnClick:= handle_do_cancel_click;
Visible:= False;
end; // with m_c_do_cancel_button
end; // IWAppFormCreate
procedure draw_in_display_mode;
var l_field_value: String;
begin
if ARow= 0
then // column header
else
case AColumn of
0 : begin
// -- the button column
ACell.Control:= m_c_do_modify_button_list[ARow- 1];
ACell.Control.Enabled:= True;
end;
1 : begin
l_field_value:= UserSession.AdoDataset1.Fields[0].AsString;
ACell.Text:= l_field_value;
end;
2 : begin
l_field_value:=
UserSession.AdoDataset1.FieldByName('Population').AsString;
ACell.Text:= l_field_value;
end;
end; // case AColumn
end; // draw_in_display_mode
procedure draw_in_edit_mode;
procedure display_selected_row;
var l_field_value: String;
begin
case AColumn of
1 : begin
l_field_value:= UserSession.AdoDataset1.Fields[0].AsString;
ACell.Control:= m_c_edit_list[0];
m_c_edit_list[0].Text:= l_field_value;
m_selected_key:= l_field_value;
end;
2 : begin
l_field_value:= UserSession.AdoDataset1.FieldByName('Population').AsSt
ring;
ACell.Control:= m_c_edit_list[1];
m_c_edit_list[1].Text:= l_field_value;
end;
3 : begin
ACell.Control:= m_c_do_post_button;
end;
4 : begin
ACell.Control:= m_c_do_cancel_button;
end;
end; // case AColumn
end; // display_selected_row
procedure display_other_row;
var l_field_value: String;
begin
case AColumn of
1 : begin
l_field_value:= UserSession.AdoDataset1.Fields[0].AsString;
ACell.Text:= l_field_value;
end;
2 : begin
l_field_value:=
UserSession.AdoDataset1.FieldByName('Population').AsString;
ACell.Text:= l_field_value;
end;
end; // case AColumn
end; // display_other_row
begin // draw_in_edit_mode
if ARow= 0
then // column header
else
if aColumn= 0
then begin
// -- the modify column
ACell.Control:= m_c_do_modify_button_list[ARow- 1];
ACell.Control.Enabled:= False;
end
else
if ARow= m_selected_row
then display_selected_row
else display_other_row;
end; // draw_in_edit_mode
begin // IWDBGrid1RenderCell
if m_do_modify
then draw_in_edit_mode
else draw_in_display_mode;
end; // IWDBGrid1RenderCell
m_c_do_post_button.Visible:= True;
m_c_do_cancel_button.Visible:= True;
end; // with Sender as tIwButton
end; // handle_do_modify_click
with UserSession.AdoCommand1 do
begin
CommandText:=
'UPDATE country '
+ ' SET population= '+ l_population
+ ' WHERE Name= '''+ m_selected_key+ '''';
// display('cmd '+ CommandText);
Execute;
end; // with UserSession.AdoCommand1
(*
with UserSession.AdoDataset2 do
begin
Open;
// -- refresh AdoDataset1
UserSession.AdoDataset1.Close;
UserSession.AdoDataset1.Open;
tout d'abord nous nous sommes entêtés à vouloir utiliser ADO. Lorsque nous avons
essayé de mettre à jour, nous avons eu une exception "OleException, missing required
parameter". Après quelques heures d'essai, nous avons décidé d'utiliser un
tAdoDataSet, et Locate n'a pas fonctionné, car la colonne COUNTRY n'existait pas.
Nous avions confondu EMPLOYEE_GDB.COUNTRY et
DBDEMOS_MDB.COUNTRY, et le nom correct pour la colonne contenant le nom
du pays est ici NAME. "OleException, missing parameter" était naturellement le
message le plus approprié pour nous mettre sur la voie. Pas aussi inutile que "Syntax
Error", mais pas loin, voire pire ...
revenons à notre sujet. Nous aurions pu, comme ASP.NET utiliser la même colonne
pour les boutons de modification et ceux de confirmation ou annulation. Nous avons
tout laissé pour mieux montrer ce qui se passait
nous avons créé des listes de boutons. Il faudrait naturellement les libérer, et ceci dans
tIwForm.OnDestroy
nous avons utilisé une grille de taille fixe pour pouvoir plus facilement allouer nos
tables de boutons. Il serait possible de parcourir la Table pour allouer un nombre
variable en fonction de la taille de la table
en plus des dbGrid, il existe aussi une grille tIwGrid (non liée à une base de données)
que nous pouvons remplir, modifier etc
il arrive que lorsque nous créons des tIwButton ou autre contrôle par code, nous ne
connaissions pas l'UNITé Intraweb à importer. Nous pouvons naturellement
recherche cette unité en utilisant l'aide. Une solution bien connue est de déposer un
exemplaire de ce type de contrôle via la Palette, de compiler (ce qui force Delphi à
ajouter le bon USES, puis à retirer ce composant
SELF est impératif dans tIwButton.Create(SELF) (sinon le clic ne sera pas pris en
compte)
peut-être les nouvelles versions d'Intraweb faciliteront la modification d'une grille,
mais les messages trouvés sur les forums n'en parlent pas
la stratégie utilisée pour modifier une grille est similaire à celle que nous avons
utilisée pour présenter la navigation dans une grille en utilisant CGI, et est la même
que celle utilisée, nous l'avons déjà indiqué, par ASP.NET
nous pourrions utiliser la même technique pour nous positionner sur une ligne en
utilisant la grille
il faudrait aussi gérer l'inhibition de previous et next pendant la modification
la dernière image ci-dessus présente aussi un tIwMemo. Naturellement, nous n'avons
pu nous empêcher d'afficher différents message de mise au point, comme sous
Windows. Ici le memo affiche la requête qui va être exécutée. Les méthodes pour
afficher et effacer le memo sont dans les sources du .ZIP
en ce qui concerne la tIwDbGrid:
o UseFrame permet de supprimer le titre de la tIwDbGrid. UseSize affiche un
cadre autour de la grille
o tIwDbGrid.Colums[0] n'est pas accepté. Il faut utiliser
tIwDbGrid.Colums[0].Items[0]
o apparemment, le titre des colonnes est compté comme une ligne de la
tIwDbGrid
o les tIwDbGridColumn ont aussi un événement OnClick que nous aurions peut
être pu utiliser au lieu de mettre en place des boutons Modify
o CellPadding est le gras dans une cellule, CellSpacing la taille de la bordure
(comme pour les <TABLE>s .HTML, naturellement
o BgColor et la couleur de la zone dessinée
o Options.dgShowTitles permet de supprimer les titres des colonnes
Par définition, le protocole .HTTP est sans état: lorsqu'un Client demande une page, le
Serveur la lui envoie, et oublie tout de cette requête. Ceci évite d'avoir à gérer au niveau du
Serveur l'état de chaque Client.
5.1 - Remarques
Intraweb permet de créer des applications Web, et le Web est censé remplacer un jour toutes
les applications locales. Il faut donc qu'Intraweb soit aussi riche que tous les composants
Windows locaux. Vaste programme.
Notre tutoriel n'a donc pu tout présenter, et parmi les domaines non présentés:
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent:
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou
autre). Pour supprimer le projet, effacez le répertoire.
La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la
zone de compilation: K_onstant, T_ype, G_lobal, L_ocal, P_arametre, F_unction, C_lasse.
Elle est présentée plus en détail dans l'article La Notation Alsacienne
Comme d'habitude:
Nom :
E-mail :
Commentaires * :
et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans
vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries.
C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous
écrirons d'articles.
7 - Références
Intraweb est fourni en version BE avec les nouvelles versions de Delphi. Vous pouvez
récupérer les mises à jour, ou les versions plus complètes auprès de AtoZed
Nous organisons aussi régulièrement des Formations IntraWeb qui entrent en détail dans la
construction, la mise au point et le dépoloiement d'applications IntraWeb.
8 - L'auteur
John COLIBRI est passionné par le développement Delphi et les applications de Bases de
Données. Il a écrit de nombreux livres et articles, et partage son temps entre le
développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration
Xe_n, refactoring) pour ses clients, le conseil (composants, architecture, test) et la
formation. Son site contient des articles avec code source, ainsi que le programme et le
calendrier des stages de formation Delphi, base de données, programmation objet,
Services Web, Tcp/Ip et UML qu'il anime personellement tous les mois, à Paris, en
province ou sur site client.