Outils pour utilisateurs

Outils du site


issue113:tuto2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue113:tuto2 [2016/10/13 09:00] d52frissue113:tuto2 [2016/10/14 10:24] (Version actuelle) auntiee
Ligne 3: Ligne 3:
 In the previous part of the series, we covered personalizing the Free Vision menu bar, responding to commands, and using default message boxes and dialogs. This third part will describe connecting our Free Pascal / Free Vision program with the Sqlite3 database.** In the previous part of the series, we covered personalizing the Free Vision menu bar, responding to commands, and using default message boxes and dialogs. This third part will describe connecting our Free Pascal / Free Vision program with the Sqlite3 database.**
  
-Dans cette série d'articles, je construirai une application en mode texte avec FreePascal, en utilisant son interface en mode texte pour l'interaction avec l'utilisateur. Ceci sera combiné avec d'autres technologies, plus modernes, telles que l'accès à une base de données en utilisant SQL et l'accès au Web avec HTTP. Le but final du projet est de démontrer comment Pascal peut être utilisé pour construire une application moderne, tout en évitant le surpoids associé à une interface graphique qui utile un jeu de gadgets comme GTK ou Qt.+Dans cette série d'articles, je construirai une application en mode texte avec FreePascal, en utilisant son interface en mode texte pour l'interaction avec l'utilisateur. Ceci sera combiné avec d'autres technologies, plus modernes, telles que l'accès à une base de données en utilisant SQL et l'accès au Web avec HTTP. Le but final du projet est de démontrer comment Pascal peut être utilisé pour construire une application moderne, tout en évitant le surpoids associé à une interface graphique qui utilise un jeu de gadgets comme GTK ou Qt.
  
-Dans la partie précédente de la série, nous avons couvert la personnalisation de la barre de menu Free Vision, la réponse aux commandeset l'utilisation des boites et dialogues de message par défaut. Cette troisième partie décrira la connexion de note programme FreePascal / Free Vision à la base de données SQLite3.+Dans la partie précédente de la série, nous avons parlé de la personnalisation de la barre de menu Free Vision, la réponse aux commandes et l'utilisation des boîtes et dialogues de message par défaut. Cette troisième partie décrira la connexion de notre programme FreePascal/Free Vision à la base de données SQLite3.
  
 **Installation **Installation
Ligne 25: Ligne 25:
 Installation Installation
  
-Bien que SQLite n'atteint la notoriété que relativement récemment, ce projet a commencé depuis 2000. Il a certainement rempli un vide dans l'univers de bases de données, car sa fonctionnalité importante est que les programmes des clients sont liés à une simple bibliothèque. Il n'y a pas besoin d'installer une grande « face avant » de la base de données sur la machine de client, ni de se connecter à un serveur externe de base de données à travers un réseau. Les données sont stockées localement, dans un format de fichier simple. Ceci la rend très rapide et pratique pour les bases de données de taille petite à moyenne qui sont accédées en général par un unique utilisateur, tout en rendant les données facilement transportables d'un ordinateur à un autre (par simple copie d'un fichier).+Bien que SQLite n'ait atteint la notoriété que relativement récemment, ce projet a commencé dès 2000. Il a certainement rempli un vide dans l'univers des bases de données, car sa fonctionnalité importante est que les programmes des postes clients sont liés à une simple bibliothèque. Il n'y a pas besoin d'installer une grande interface de la base de données sur la machine de l'utilisateur, ni de se connecter à un serveur externe de base de données par un réseau. Les données sont stockées localement, dans un format de fichier simple. Ainsi, pour les bases de données de petite à moyenne taille auxquelles accède en général un seul utilisateur, tout devient très rapide et pratique et les données sont facilement transportables d'un ordinateur à un autre (par simple copie d'un fichier).
  
-SQLite sera probablement déjà installé sur un système Ubuntu, mais assurons-nous en et installons en ligne de commande à la fois le client et le paquet pour développeur. Nous aurons besoin de cette seconde partie pour compiler l'accès à la base de données dans nos programmes. Les paquets nécessaires sont :+SQLite est probablement déjà installé sur un système Ubuntu, mais assurons-nous-en et installons en ligne de commande à la fois le client et le paquet pour développeur. Nous aurons besoin de cette seconde partie pour compiler l'accès à la base de données dans nos programmes. Les paquets nécessaires sont :
  
 sudo apt-get install sqlite3 libsqlite3-dev sudo apt-get install sqlite3 libsqlite3-dev
  
-Maintenant, en tant qu'utilisateur ordinaire, nous pouvons créer une nouvelle base de données en utilisant l'outil en ligne de commande. Par exemple, nous pouvons créer un fichier des erreurs de notre magazine favori. Commençons par appeler le vrai fichier «fullcircle.db ». Ainsi :+Maintenant, en tant que simple utilisateur, nous pouvons créer une nouvelle base de données en utilisant l'outil en ligne de commande. Par exemple, nous pouvons créer un fichier des numéros de notre magazine favori. Commençons par appeler le vrai fichier « fullcircle.db ». Ainsi :
  
 $ sqlite3 fullcircle.db $ sqlite3 fullcircle.db
Ligne 47: Ligne 47:
 sqlite> insert into issues values (108, 'issue 108', '- description goes here -', 'http://dl.fullcirclemagazine.org/issue108_en.pdf', 'python inkscape chrome devices arduino');** sqlite> insert into issues values (108, 'issue 108', '- description goes here -', 'http://dl.fullcirclemagazine.org/issue108_en.pdf', 'python inkscape chrome devices arduino');**
  
-La commande CREATE TABLE crée une nouvelle table -appelée « issues » - dans laquelle plusieurs champs sont définis pour chaque saisie. « id » sera simplement un code numérique d'identification qui sera utilisé par le système pour indexer nos enregistrements par ordre croissant. Pour chaque saisie, l'information enregistrée inclura un titre (title), une description, un lien de téléchargement (download) et des étiquettes (tags) dans des chaînes distinctes. ceci deviendra plus clair quand nous remplirons la base de données avec de la vraie information :+La commande CREATE TABLE crée une nouvelle table - appelée « issues » (numéros) - dans laquelle plusieurs champs sont définis pour chaque saisie. « id » sera simplement un code numérique d'identification qui sera utilisé par le système pour indexer nos enregistrements par ordre croissant. Pour chaque saisie, l'information enregistrée inclura un titre (title), une description, un lien de téléchargement (download) et des étiquettes (tags)dans des chaînes distinctes. Ceci deviendra peut-être plus clair quand nous remplirons la base de données avec de la vraie information :
  
 sqlite> insert into issues values (110, 'issue 110', '- place pour la description -', 'http://dl.fullcirclemagazine.org/issue110_en.pdf', 'python clonezilla inkscape, chromebook'); sqlite> insert into issues values (110, 'issue 110', '- place pour la description -', 'http://dl.fullcirclemagazine.org/issue110_en.pdf', 'python clonezilla inkscape, chromebook');
Ligne 87: Ligne 87:
 sqlite> .quit** sqlite> .quit**
  
-En la première, nous demandons toutes les informations pour les enregistrements avec le titre « issue 109 ». Dans la seconde, nous voulons juste le lien de téléchargement pour la saisie contenant l'identifiant (ID) 110. Dans la dernière, nous cherchons les ID de tous les numéros qui sont étiquetés avec « inkscape » - notez l'utilisation de « % » comme joker pour correspondre à toute chaîne qui contient « inkscape », mais qui a aussi d'autres éléments de texte avant ou après le mot qui nous intéresse.+Dans la première recherche, nous demandons toutes les informations pour les enregistrements avec le titre « issue 109 ». Dans la seconde, nous voulons juste le lien de téléchargement pour la saisie contenant l'identifiant (ID) 110. Dans la dernière, nous cherchons les ID de tous les numéros qui sont étiquetés avec « inkscape » - notez l'utilisation de « % » comme joker pour correspondre à toute chaîne qui contient « inkscape », mais qui a aussi d'autres éléments de texte avant ou après le mot qui nous intéresse.
  
 Pour sortir du client en ligne de commande, nous tapons la commande : Pour sortir du client en ligne de commande, nous tapons la commande :
Ligne 104: Ligne 104:
 L'interface avec Free Pascal L'interface avec Free Pascal
  
-Nous commencerons pae écrire un court programme, simplement pour tester la connectivité entre l'environnement de notre programme et la bibliothèque SQLite. Dedans, nous nous limiterons à réaliser un recherche rapide et à afficher les résultats à l'écran avec une commande Writeln.+Nous commencerons par écrire un court programme, simplement pour tester la connectivité entre l'environnement de notre programme et la bibliothèque SQLite. À l'intérieur, nous nous limiterons à réaliser une recherche rapide et à afficher les résultats à l'écran avec la commande Writeln.
  
-Les membres du projet Free Pascal ont préparé une unité bien pratique. En fait, il y a plusieurs alternatives mais celle présentée ici semble être la mieux supportée, au moins à l'heure actuelle. Nous avons besoin de l'unité Crt pour Writeln, mais aussi de Strings et Classes ; cette dernière contient le type TStringList qui sera utilisé pour accéder à chaque ligne du résultat recherché. Enfin, Sqlite et Sqlite3db traite la connexion réelle à la bibliothèque :+Les membres du projet Free Pascal ont préparé une « unit » bien pratique. En fait, il y a plusieurs alternativesmais celle présentée ici semble être la mieux supportée, au moins à l'heure actuelle. Nous avons besoin de l'unit Crt pour Writeln, mais aussi de Strings et Classes ; cette dernière contient le type TStringList qui sera utilisé pour accéder à chaque ligne du résultat de la recherche. Enfin, Sqlite et Sqlite3db traitent la connexion réelle à la bibliothèque :
  
 uses uses
Ligne 134: Ligne 134:
   id, downloadURL : String;   id, downloadURL : String;
      
-Nous commençons par la création d'une connexion, l'exécution de lnotre recherche et le comptage du nombre de lignes du résultat :+Nous commençons par la création d'une connexion, l'exécution de notre recherche et le comptage du nombre de lignes du résultat :
  
 sql := TSQLite.Create(dbfile); sql := TSQLite.Create(dbfile);
Ligne 157: Ligne 157:
 The code for the complete program is available at this link: http://pastebin.com/k4JB6fZr .** The code for the complete program is available at this link: http://pastebin.com/k4JB6fZr .**
  
-Nous pouvons maintenant exécuter l'itération sur toutes les lignes :+Nous pouvons maintenant exécuter l'itération sur toutes les lignes du résultat :
  
 for i := 1 to n do for i := 1 to n do
Ligne 167: Ligne 167:
 end; end;
  
-Enfin, même si SQLite est plutôt robuste, c'est toujours mieux de fermer le connexion proprement :+Enfin, même si SQLite est plutôt robuste, c'est toujours mieux de fermer la connexion proprement :
  
 sql.Free; sql.Free;
Ligne 182: Ligne 182:
  
 result := ExecuteDialog (pOpen, @FileName);** result := ExecuteDialog (pOpen, @FileName);**
 +
 +Connexion de SQLite à Free Vision
 +
 +Dans la partie précédente de la série, nous avons conçu une application basique de Free Vision, avec un menu qui contenait un élément File > Open item (Fichier > Ouvrir un élément). Nous avons programmé cet élément pour sortir la commande cmOpen, qui était ensuite capturée dans la méthode HandleEvent pour créer un appel à l'utilisateur TFileDialog, lui demandant de choisir un fichier. Cependant, le choix fait par l'utilisateur n'a pas encore été exploité correctement. Faisons-le maintenant.
 +
 +En premier lieu, nous modifierons le code créant TFileDialog de sorte qu'il filtre les fichiers avec l'extension .db :
 +
 +pOpen := New(PFileDialog, Init('*.db', 'Open', 'File ~N~ame', fdOpenButton, hcNoContext));
 +
 +result := ExecuteDialog (pOpen, @FileName);
  
 **After execution, result is an integer that holds either command cmOpen indicating the user closed the dialog using the “Open” button, or cmCancel if the “Cancel” button was used. FileName is a string with the file name chosen. We can now use this input to set up a Dialog window that creates a Sqlite connection, performs the query, and displays results: **After execution, result is an integer that holds either command cmOpen indicating the user closed the dialog using the “Open” button, or cmCancel if the “Cancel” button was used. FileName is a string with the file name chosen. We can now use this input to set up a Dialog window that creates a Sqlite connection, performs the query, and displays results:
Ligne 197: Ligne 207:
   ExecuteDialog (pDisplay, nil);   ExecuteDialog (pDisplay, nil);
 end;** end;**
 +
 +Après exécution, le résultat est un entier qui contient soit la commande cmOpen indiquant que l'utilisateur a fermé le dialogue en utilisant le bouton « Open » (Ouvrir), soit cmCancel si le bouton « Cancel » (Annuler) a été utilisé. FileName est une chaîne contenant le nom du fichier choisi. Nous pouvons maintenant utiliser cette entrée pour paramétrer la fenêtre de dialogue qui crée la connexion à SQLite, exécute la recherche et affiche les résultats :
 +
 +if not (result = cmCancel) then
 +
 +begin
 +  GetExtent(R);
 +  R.A.X := R.A.X + 2;
 +  R.A.Y := R.A.Y + 2;
 +  R.B.X := R.B.X - 2;
 +  R.B.Y := R.B.Y - 2;
 +  pDisplay := New(PDisplaySQLDialog, Init(FileName)); 
 + 
 +  ExecuteDialog (pDisplay, nil);
 +end;
  
 **R is a variable of type TRect that Free Vision uses to indicate a rectangular region on screen. The two fields A and B are the top-left and bottom-right positions occupied that define the rectangle, which is in this case X and Y the column and row numbers. On the other hand, pDisplay is a pointer to a TDisplaySQLDialog - an object that inherits from TDialog and is not part of the standard Vision libraries. So let us define it, overwriting only the constructor Init method to pass along the database file name to be opened and displayed: **R is a variable of type TRect that Free Vision uses to indicate a rectangular region on screen. The two fields A and B are the top-left and bottom-right positions occupied that define the rectangle, which is in this case X and Y the column and row numbers. On the other hand, pDisplay is a pointer to a TDisplaySQLDialog - an object that inherits from TDialog and is not part of the standard Vision libraries. So let us define it, overwriting only the constructor Init method to pass along the database file name to be opened and displayed:
Ligne 208: Ligne 233:
 R.Assign(0, 0, 78, 17); R.Assign(0, 0, 78, 17);
 inherited Init (R, 'xxx');** inherited Init (R, 'xxx');**
 +
 +R est une variable de type TRect que Free Vision utilise pour indiquer une région rectangulaire de l'écran. Les deux champs A et B sont les angles haut gauche et bas droit qui définissent le rectangle, dont X et Y sont dans ce cas les numéros de ligne et de colonne. En revanche, pDisplay est un pointeur vers TDisplaySQLDialog - un objet qui hérite de TDialog et qui ne fait pas partie des bibliothèques standard de Vision. Aussi, nous devons le définir, écrasant seulement la méthode Init du constructeur pour transmettre le nom du fichier de la base de données à ouvrir et afficher :
 +
 +TDisplaySQLDialog = object(TDialog)
 +  constructor Init (FileName : String);
 +end;
 +
 +Avoir un Init personnalisé sert deux objectifs : c'est ici que sera construit l'interface, avec PListBox pour contenir les données à afficher, PScrollBar pour nous permettre de nous déplacer dans la liste et PButton pour fermer la fenêtre de dialogue. Commençons par paramétrer la taille de la fenêtre et son titre en utilisant la méthode du constructeur héritée TDialog :
 +
 +R.Assign(0, 0, 78, 17);
 +inherited Init (R, 'xxx');
    
 **Now, let us fit in the Sqlite routine to populate a PStringCollection with the results of our query. Unfortunately, there is a slight hiccup with the TStringList used in the previous example, already present in the days of Turbo Vision. One of the FreeVision classes also defines a TStringList type of object, which is incompatible with that used to parse Sqlite’s output. So we need to specify we wish to use the version defined in the Classes unit. The code (top right) should be self-explanatory. **Now, let us fit in the Sqlite routine to populate a PStringCollection with the results of our query. Unfortunately, there is a slight hiccup with the TStringList used in the previous example, already present in the days of Turbo Vision. One of the FreeVision classes also defines a TStringList type of object, which is incompatible with that used to parse Sqlite’s output. So we need to specify we wish to use the version defined in the Classes unit. The code (top right) should be self-explanatory.
Ligne 216: Ligne 252:
  
 In this part, we set up a small Sqlite database, then built a command-line Free Pascal program to access it. Finally, we integrated the database code into our Free Vision application through a new Dialog type to connect to the database and display retrieved data. In the next part of the series, we will connect to the Internet in order to refresh the information in our database directly from the Full Circle Magazine website.** In this part, we set up a small Sqlite database, then built a command-line Free Pascal program to access it. Finally, we integrated the database code into our Free Vision application through a new Dialog type to connect to the database and display retrieved data. In the next part of the series, we will connect to the Internet in order to refresh the information in our database directly from the Full Circle Magazine website.**
 +
 +Maintenant, finissons la routine SQLite pour remplir PStringCollection avec les résultats de notre recherche. Malheureusement, il y a un léger hic avec TStringList utilisé dans l'exemple précédent, déjà existant du temps de Turbo Vision. Une des classes de Free Vision définit aussi le type d'objet TStringList, qui est incompatible avec celui utilisé pour analyser la sortie de SQLite. Aussi, nous devons spécifier que voulons utiliser la version définie dans l'unit Classes. Le code (en haut à droite) devrait être explicite.
 +
 +En ayant fait ceci, nous avons paramétré la fenêtre de dialogue et rempli les Items (éléments) avec les données récupérées dans la base. Ce n'est plus maintenant qu'une simple question de paramétrage des gadgets et d'insertion de chacun dans la fenêtre Dailog (code en bas à droite).
 +
 +C'est à peu près tout. Le code complet de notre programme, jusqu'à présent, peut être trouvé par le lien : http://pastebin.com/sLFWm6pR .
 +
 +Dans cette partie, nous avons paramétré une petite base de données SQLite, puis construit un programme Free Pascal en ligne de commande pour y accéder. Enfin, nous avons intégré le code de la base de données dans notre application Free Vision par l'intermédiaire d'un nouveau type Dialog pour se connecter à la base et afficher les données récupérées. Dans la prochaine partie de la série, nous nous connecterons à Internet de façon à rafraîchir l'information de notre base de données directement depuis le site Web du FullCircle Magazine.
  
issue113/tuto2.1476342004.txt.gz · Dernière modification : 2016/10/13 09:00 de d52fr