menu
  Home  ==>  articles  ==>  delphi  ==>  delphi_8_vcl_net   

Delphi 8 VLC NET - John COLIBRI.


1 - Introduction

J'ai choisi de présenter à Borcon 2004 les différents moyens d'utiliser Interbase:
  • pour Delphi 5 à 6, les API, le BDE et Sql Links, Interbase Express, dbExpress et Ado
  • pour Delphi 8, Ibx.Net, dbExpress.Net, Ado.Net et le BDP
Il fallait donc que j'utilise Delphi 8.

Cet article présente donc mes "notes de route" pour ma première utilisation de Delphi 8.



Pour travailler en Delphi 8, nous avons fondamentalement deux modes:

  • le mode VCL.NET qui est une librairie nous permettant de travailler comme en Delphi sans .NET
  • le mode Windows Forms qui utilise les gadgets (boutons, listbox etc) C#
Le mode le plus facile pour un vieux routard Delphi est naturellement celui qui se rapproche le plus de la VCL. C'est par là que j'ai commencé, et cet article concerne donc l'utilisation de VLC.NET



J'ai commencé par installer la version, et à faire quelques essais, lancer quelques démos.

Lorsque j'ai voulu réaliser mes premiers essais avec Interbase, je me suis senti comme tout nu parce que je n'avais pas la main avec l'affichage. Il me manquait cruellement display.

Il me fallait à l'évidence récupérer en premier lieu l'affichage et les logs. Cet article va donc présenter le portage de nos unités d'affichage en VCL.NET.




2 - L'Interface de Développement

Quelques mots sur l'interface pour commencer.

2.1 - L'accueil

Au lancement de Delphi 8, nous avons la page d'accueil:



2.2 - Une nouvelle application

nous créons une nouvelle application par Fichiers | Nouveau | VCL Forms

Nous pouvons aussi sélectionner dans la page d'accueil un projet précédent, ou appeler Fichier | Réouvrir.

Notez que:

  • la palette est à droite et se présente comme une suite d'onglets drop down

    Voici un exemple obtenu en déroulant l'onglet "Standard":

  • par défaut l'Inspecteur d'Objet présente les propriétés "par catégories". Je préfère les voir dans l'ordre alphabétique, et le Click Droit souris "Arrange" a changé cet ordre de présentation

  • le basculement entre la Forme et l'Unité peut se faire en sélectionnant les onglets "Code et Design". En mode "Code" le contenu de l'Inspecteur d'Objet disparaît mais je ne sais pas pourquoi


2.3 - Help

L'aide avec son TreeView est très agréable:



2.4 - Les Options du Projet

Le dialogue des Options est un peu nouveau, mais tout s'y retrouve sans difficulté:



2.5 - Folding Editor

L'éditeur offre, enfin, un mode "folding": en cliquant sur les "+" ou "-", nous pouvons afficher plus ou moins de détail du texte:
  • la vue détaillée:

  • en repliant les procédures:

  • en fermant l'Interface:


Un petit regret: le changement d'indentation d'un texte replié n'indente pas les lignes cachées.




3 - Le portage Delphi 6 vers Delphi 8

3.1 - L'Objectif

Nous souhaitions pouvoir:
  • afficher par

         display('un texte');

  • sauvegarder la suite de ces messages dans un fichier .TXT
Ces deux fonctionalités sont réalisées sous Delphi 8 par les unités
  • u_strings qui contient diverses routines de manipulation de chaînes
  • u_c_basic_object qui permet de doter chaque objet d'un nom individuel
  • u_c_display qui affiche les messages dans un tMemo
  • u_c_log qui stocke les messages dans un fichier .TXT
Ce sont ces routines que nous avons portées en VCL.NET.

L'importation de u_c_display et u_c_log a tout de suite bloqué sur FILE que j'utilise pour stocker le journal sur disque. Je me souvenais que David Intersimone avait mentionné que les FILE, ABSOLUTE, Asm, @ et autres accès direct mémoire ne marcheraient plus.

Il me fallait donc adapter mes librairies de base.

Pour éviter les conflits d'unités (en source) j'ai choisi de préfixer toutes mes librairies Delphi 8 en mode VLC.NET avec "_net_". Voici le résultat de ce portage.

3.2 - u_strings

La librairie de manipulations usuelles a été chargée. Ont été refusés
  • les procédures de conversions ANSI / OEM qui utilisaient des pChar, Move, FillChar
  • les String[indice] passés comme paramètres à des procédures attendant en paramètres VAR un Char est refusé:


3.3 - u_c_basic_object

Cette classe me permet de placer un identificateur sur chaque objet (et accesoirement, dans une version plus élaborée, de mémoriser les création / destructions d'objets).

La seule difficulté rencontrée a été le constructeur: tout constructeur doit obligatoirement appeler INHERITED (l'héritage de tObject n'est pas automatique):

    constructor c_basic_object.create_basic_object(p_nameString);
      begin
        Inherited Create;

        m_name:= p_name;
      end// create_basic_object


3.4 - u_c_net_log




J'ai simplement remplacé le FILE par un tFileStream:

  • les paramètres de création (fmCreate, fmOpenReadWrite etc) marchent sans problème
  • il semblerait même qu'un FILE OF Char aurait pu être employé
  • pour écrire une chaîne de caractères, ne n'ai PAS pu employer:

        m_c_file_stream.Write(p_ma_string[1], Length(p_ma_string));

    Je suis donc passé par une écriture caractères à caractère:

    procedure c_log.write_to_log(p_textString);
      var l_lengthInteger;
          l_characterchar;
          l_indexInteger;
      begin
        l_length:= Length(p_text);

        with m_c_file_stream do
        begin
          Position:= Size;

          if l_length<> 0
            then begin
                p_text:= p_textchr(13)+ Chr(10);
                for l_index:= 1 to l_length+ 2 do
                begin
                  l_character:= p_text[l_index];
                  Write(l_character, 1);
                end;
              end;
        end// with m_c_file_stream
      end// write_to_log

    Notez que:

    • j'ai eu droit à un Warning car j'ai converti les caractères de ma String en Char. J'imagine que leurs String sont en Unicode
    • le fichier .TXT est en revanche parfaitement lisible via NotePad en cliquant dessus dans un dans Explorateur Windows

3.5 - u_c_net_display

Rappelons que notre unité d'affichage
  • initialise un pointeur global vers une tStrings
  • les appels à display('xxx')
    • affichent en indentant le texte
    • si le log est initialisé, le texte est aussi sauvegardé sur disque
Cette unité a été compilée sans problème




4 - L'application

Voici simplement la marche à suivre pour construire cette application:
   lancez Delphi 8
   l'écran d'accueil apparaît
   cliquez Fichiers | Nouveau | Application VCL Forms
   Delphi présente une Forme vierge avec l'Inspecteur d'Objet à gauche et la Palette à droite
   dans la Palette, cliquez l'onglet Standard
   la page des contrôles standards apparaît

   sélectionnez tEdit et posez-le sur la Forme
   sélectionnez un tMemo et posez-le sur la Forme
   sélectionnez tButton et posez-le sur la Forme
Changez son nom: dans l'Inspecteur d'Objet
  • sélectionnez (Name) et tapez "display_"
  • sélectionnez Text, et tapez "display_"
Créez son événement OnClick en cliquant deux fois sur le bouton de la Forme, et affichez dans tMemo le contenu de Edit1.Text:

     display(Edit1.Text);

   ajoutez les importations de nos unités

     USES u_c_display, u_c_log;

   créez l'événement Form.OnCreate en cliquant deux fois sur la Forme. Initialisez l'affichage et le log:

procedure TForm1.FormCreate(SenderTObject);
  begin
    initialize_display(Memo1.Lines);
    initialize_default_log;
  end// FormCreate

   compilez et exécutez


Comme vous pouvez vous en rendre compte, pratiquement comme en Delphi 6 !




5 - Les premières impressions

ATTENTION: l'évaluation qui vient est très partielle: je n'ai utilisé la version que quelques heures, je n'ai lu aucune doc. De plus, pressé par le temps je n'ai pas trop poussé les investigations.

Néanmoins, voici mes commentaires:

  • le délai entre le lancement de la compilation et l'apparition de la fenêtre est nettement (sic) plus lent
  • les erreurs moins faciles à repérer. J'avais dans des premiers essais tapé un slash avant dans le nom de fichier du log:

        m_file_name:= f_exe_path+ '/log/log.txt';

    Il a fallu le pas à pas par F7 pour trouver la faute, et encore c'est l'examen visuel qui m'a montré l'erreur (et non pas un message "wrong file name")

  • j'ai rencontré en essayant de créer une base Interbase un message d'erreur:

         "Object Reference not Set"

    Ce type d'erreur est semble-t-il assez courant et redouté. Dans le fichier "Delphi 8 2nd Update", Borland cite de nombreuses corrections ayant eu pour objet de faire disparaître ce type de messages. Pour le moment je ne comprends pas ce qui les provoque.

    Une recherche Google "Object Reference not Set" fournit 12.400 réponses. Et le fléau ne concerne pas que Borland: les angoisses vont de Crystal Report à Excel (on n'est jamais mieux servi...)

    Il proviendrait de l'accès à un attribut (propriété) d'un objet non initialisé. Cela je m'en doutais à peine. Mais quel objet ou quelle classe ? Mystère, mystère...

  • ce qui ne marche plus
    • FILE. En revanche l'utilisation des fichiers normaux (FILE OF) devrait marcher. En tout cas nous avons choisi d'utiliser les tFileStream qui n'ont pas posé de problème
    • il n'est plus possible de passer des String en paramètre variable
  • lorsque nous sauvegardons un nouveau projet, Delphi 8 nous propose toujours de démarrer en "Borland Studio Project" (alors qu'en Delphi 6, le changement du chemin "Démarrer En" de l'icône sur le bureau permettait de spécifier où sauvegarder les fichiers).

    Pour me simplifier la vie, j'ai donc créé un projet vide, placé dans un répertoire proche, contenant déjà tous les chemins pour l'EXE, les DCU et les unité. Puis pour chaque nouveau projet j'ai utilisé "Sauvegarder le Projet sous" et "Sauvegarder sous"

  • je suis encore assez gauche avec l'interface utilisateur. De plus les petits problèmes rencontrés tiennent peut-être à la version que j'ai utilisée pour rédiger cet article (en cliquant Help | About | Version Info vous obtenez la version de toutes les DLL).

    Quoi qu'il en soit:

    • F12 pour sauter du .PAS à la Forme ne marche pas toujours ? En revanche les onglets au bas de la Forme "Code" et "Design" fonctionnent parfaitement
    • il est arrivé que la palette ait du mal à revenir. En rechargeant Delphi elle réapparaît
    • l'Inspecteur d'Objet aussi semble voyager un peu et la séparation des colonnes titre / valeur doit être réajustée à chaque chargement. J'imagine que, comme en Delphi 6, nous pouvons utiliser "Tools | Options | Save Desktop", mais je ne l'utilise pas sous Delphi 6 pour deux raisons:
      • les premières versions ne permettaient pas facilement de supprimer les effets de cette option. En cliquant sur le .DPR dans un Explorateur Windows, c'est le .DPR qui apparaissait et non pas la Forme
      • si le .DSK garde mes options, les lecteurs qui chargent mes .ZIP les auront, et la disposition que j'adopte pour le bureau (qui n'a rien de très exotique: essentiellement virer le Browser d'Objet) peut ne pas convenir à tout le monde.
    • l'ajout des événements semble se faire vers le haut du fichier .PAS: les nouveaux événements sont ajoutés au début du .PAS (après tWinFormCreate et avant le précédent événement que nous avons créé).
    • le changement des noms de répertoires qui sont présentés dans la page d'accueil en dehors de Delphi (par un Explorateur Windows avant le lancement) bloque le chargement de Delphi. Il faut créer un nouveau répertoire et sauvegarder dans le nouveau tous les projets cités sur la pages d'accueil par "Fichier | Sauvergarder sous"
    • Comme la Forme est piégée dans un "éditeur de dialogue" du type "Visual C++", elle n'est pas positionnée à l'exécution (il y a sans doûte un moyen, mais cela n'est pas très important)
    • la définition de Name d'un tButton ne semble pas toujours mettre à jour Caption. Et si un événement Button1_Click existe, il semble que le changement de Name de "button1" en "ouvrir" ne se propage pas à "ouvrir_Click". Name est d'ailleurs présenté avec des parenthèses dans l'Inspecteur d'Objet, et c'est peut-être lié
    • il semble même que l'on puisse avoir plusieurs événements rattachés au même bouton (peut être un appui répété sur la création de l'événement). J'ai eu des Button1Click puis Button1Click1 ou similaires. Et pour le moment les événements non modifiés dans le .PAS ne sont pas toujours supprimés par le compilateur.
    • pour supprimer le texte d'un événement, c'est semble-t-il un peu sportif: je place le nom dans le tampon de recherche, me positionne au début du texte, puis cherche et supprime toutes les occurences. Apparemment cela ne cause pas de dégats collatéraux (pointeurs de l'Inspecteur d'Objet sans destination, par exemple).
    • il m'est arrivé plusieurs fois en cliquant depuis un Explorateur Windows sur un .DPR des messages du type "le chemin de votre application n'a pas été trouvé". Comment-ça, je viens de cliquer dessus ? Mais il est possible que l'utilisation de chemins relatifs dans "Project | Options | Directories" sème un peu la panique.
    • les options du projet sont contenues dans un fichier .CFG. Il n'y a plus de .DOF. Je vais donc devoir adapter tous mes logiciels qui utilisaient le .DOF pour
      • changer les chemins absolus en chemins relatifs (pour les programmes que je publie sur ce site: le lecteur doit pouvoir les dézipper n'importe où)
      • exécuter automatiquement tous les .DPR avant de zipper en lançant en mode batch le compilateur BCC (pour vérifier qu'aucune unité, qu'aucun chemin, et aucun fichier annexe ne manquent)
      • zipper une application (le .DOF était utilisé pour retrouver toutes les unités à zipper)
      Lorsque nous changeons manuellement un chemin (pour changer, par exemple C:\PROGRAMS\INTERBASE\EXE et ..\EXE) il semble que le .CFG conserve les deux versions
    • si un contrôle est placé sur une Forme et que nous rétrécissons la Forme, les barre de défilement ne nous le signalent pas
    • en mode Vcl.Net, les composants non-visuels ne sont pas toujours affiché: lorsque nous rechargeons une application comportant une SqlConnection ou un IbQuery sur un tMemo posé sur un tPanel, les composants non visuels ne sont plus affichés. Si nous élargissons le tMemo, ils ré apparaissent.
    • il semble que Delphi 8 privilégie l'utilisation de groupes de projets. Personnellement je préfère traiter un seul projet à la fois. Pour être sûr de ne pas mélanger toutes les formes et toutes les unités il m'est arrivé de tout sauvegarder, puis de recharger en cliquant sur le .DPR. Je commence à m'habituer à toujours tout fermer avant de recharger un projet précédent. Le diagnostic est simple: vous voyez apparaître des tForm2, tForm3 etc.
    • de nombreuses fenêtres sont divisées par des "splitters". Lorsque nous agrandissons la fenêtre (l'Inspecteur d'Objet, la Forme et son DataModule ...), Delphi déplace proportionnellement le "splitter". Ce qui fait que pour avoir la bonne répartition, il faut s'y prendre à trois ou quatre fois. Je préférais l'ancienne façon: je positionne le splitter pour avoir la première partie, et agrandis la fenêtre pour avoir la seconde. S'ils l'ont fait ainsi, je suppose que beaucoup de développeurs préfèrent cette façon de faire.
    • comme la spécification des répertoires dans "Projets | Options" est un peu laborieuse, j'ai surtout procédé en copiant un projet précédent (ayant déjà les répertoires pour l'.EXE, le .DCU et les utilitaires documenté). Je sauve d'abord le .DPR ("Fichiers | Enregistrer le projet sous) en changeant le répertoire. Mais lorsque je souhaite changer le .PAS par "Fichiers | Enregistrer Sous", Delphi me utilise le répertoire actuel de l'unité ("Enregistre Sous" ne modifie donc pas le répertoire courant de Delphi ?)

    • plus anecdotique: mes identificateurs et mes commentaires sont actuellement en anglais. Pour éviter des conflicts éventuels avec des mots déjà utilisés (Open Close etc), j'avais pris l'habitude de choisir des Name se terminant par "_" (par exemple open_). Ceci avait aussi l'avantage que la méthode séparait le nom du contrôle du nom de l'événement:

          PROCEDURE tForm1.open_Click(Sender...

      au lien de

          PROCEDURE tForm1.openClick(Sender...

      Eh bien, surprise, Windows Forms le fait automatiquement: si vous ajoutez un Name Open, la méthode Click sera appelée Open_Click.

    • en dehors de Delphi, le click d'un fichier .PAS et .DFM dans un Explorateur Windows charge Delphi 8. Naturellement, une fois Delphi 8 installé, l'association de Windows se fait avec la nouvelle version. Si l'on souhaite travailler en Delphi 6, il faut explicitement utiliser "Ouvrir" plutôt que de cliquer dans un Explorateur. Allez, encore un petit effort, et ils ajouteront le nom de la méthode en commentaire après le END ...
Cette longue liste pourrait paraître comme un rejet du produit. Il n'en est rien: c'est plutôt une liste de notes écrites dès le début de mon exploration du produit il y a trois jours. Aucun doute que dans quelques semaines j'aurais une plus grande dextérité à manipuler l'interface. Si certaines affirmations ci-dessus sont erronnées, faites-le moi savoir par téléphone au 01.42.83.69.36 ou par mail à jcolibri@jcolibri.com, et je corrigerai ces remarques.



En résumé:

  • Borland a fait, comme pour Linux, un effort tout à fait remarquable et très réussi pour que nos anciennes applications fonctionne et que le portage soit un effort raisonablement simple
  • La performance de la mécanique Microsoft est décevante. Il faut dire que je suis très biaisé à ce niveau et je m'attendais certes pas à ce que ces couches de couches de couches accélérent les choses. Je n'ai pas du tout été déçu à ce sujet.
  • si je suis un jour contraint et forcé d'utiliser le bébé (.NET Framework, LongHorn, Bono...), je sais que je pourrais retomber sur mes pattes avec un minimum de dégats



6 - Télécharger les Exemples

Vous pouvez télécharger: Ce .ZIP qui comprend:
  • le .DPR, la forme principale, les formes annexes eventuelles
  • les fichiers de paramètres (le schéma et le batch de création)
  • dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque .ZIP est autonaume)
Ces .ZIP contiennent des chemins RELATIFS. Par conséquent:
  • créez un répertoire n'importe où sur votre machine
  • placez le .ZIP dans ce répertoire
  • dézippez et les sous-répertoires nécessaires seront créés
  • compilez et exécutez
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.



Comme d'habitude:

  • nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
  • tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
  • plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
    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 - Conclusion

Ce premier contact avec Delphi 8 a démontré que le passage de Delphi 6 à Delphi 8 peut être réalisé très efficacement.

Pour une utilisation concrète de VCL.NET, voyez les articles

  • Interbase Ibx Net
  • Interbase dbExpress Net
Nous n'avons abordé ici que l'utilisation de VCL.NET. Nous avons aussi utilisé l'autre possibilité: Windows Forms. Vous pouvez consulter à ce sujet:
  • Delphi 8 Windows Forms
  • Delphi 8 Ado Net
  • Interbase Borland Data Provider
Et pour ceux qui seront présent à la conférence Borcon 2004 je présenterai les différents types d'utilisation d'Interbase en Delphi 6 et Delphi 8.

Rappelons aussi que j'interviens aussi pour des missions d'audit, de réalisation de projet, de portage et maintenance, et de tutorat.




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.
Créé: oct-04. Maj: aou-15  148 articles, 471 sources .ZIP, 2.021 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2015
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
    + uml_design_patterns
    + graphique
    + delphi
      – delphi_8_vcl_net
      – d8_windows_forms
      – turbo_delphi
      – les_versions_delphi
      – roadmap_delphi_6/7
      – ide_delphi_2006
      – rad_studio_2007
      – roadmap_delphi_4/8
      – raccourcis_clavier
      – delphi_prism
      – roadmap_delphi_8/10
      – demos_sur_sourceforge
      – delphi_xe
      – migration_unicode
      – delphi_xe2
      – delphi_xe2_tour
      – roadmap_2011
      – maj_delphi_xe2_1
      – delphi_xe3_lancement
      – delphi_xe3_et_apres
      – delphi_xe3_infos
      – delphi_xe3_recap
      – roadmap_mobile_studio
      – delphi_xe4_ios
      – delphi_xe4_android
      – roadmap_delphi_2014
      – rachat_embarcadero
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog

Formation de Delphi 7 à Xe3 Présentation des nouveautés de Delphi 5, 6, 7 à Delphi Xe, Xe2, Xe3: nouveautés Rtl (génériques, anonymes, RTTI), Vcl (LiveBindings, FireMonkey, Mobiles), outil - 5 jours