Introduction au Dark Basic

Décembre 2016

Grand merci à DJ Fire-Black qui est l'auteur de cette astuce.

Introduction


Pourquoi choisir DarkBASIC plutôt qu'un langage POO ?
DarkBASIC est simplifié, par rapport aux langages POO (Programmation Orientée Objet) et vous fera gagner un temps précieux, mais perd bien sûr grandement en flexibilité.
Il est presque similaire au Batch (c'est pour dire la simplicité).
En conclusion, préférez un langage POO que DarkBASIC pour travailler durement mais sûrement, mais préferez le DarkBASIC pour avoir une approche de la programmation.

Vous le savez très bien, à l'origine le langage DarkBASIC sert à créer des jeux.
Ce tutoriel ne vous explique pas ceci, car des aides sont disponibles dans ce logiciel pour pouvoir le faire.
Ce tutoriel va vous expliquer les bases pour savoir comment utiliser le DarkBASIC comme un vrai logiciel.

Ce tutoriel nécessite aussi de bonnes bases en programmation.



1. Le début du code


Le début du code commence par l'affichage de la fenêtre.
A son démarrage, un programme compilé en DarkBASIC démarrera en plein écran et nécessitera la d3drm.dll qui est généralement indisponible dans Windows Vista.
Donc, il faut déjà que vous ayez une idée de ce que vous voulez faire apparaître à l'écran.
Le DarkBASIC utilise le rem (comme en Batch) pour afficher un commentaire.

Voici à quoi ressemble le début du code de EDPLN 2 :

set window on
set window layout 1,1,1
set window title "System de sauvegarde par copie (1.1)"
show window
show mouse
disable escapekey
sync on
gosub start
end




Si vous êtes assez fort(e) en anglais ou en programmation, vous avez déjà compris de quoi il s'agit.
Ces fonctions sont aussi expliquées dans l'aide.
Mais je vous explique quand même :

Au démarrage, ce code affichera une fenêtre avec le titre EDPLN 2 Freeware SE, affichera la souris et désactivera la touche Echap pour faire quitter le programme.

Pour la suite, il faut bien sûr savoir ce que va faire votre programme.

2. Le corps du code


J'ai choisi l'idéal : Un programme qui sauvegarde les fichiers du PC dans un disque amovible.

2.1 Les menus


Donc, comme ceci est un logiciel, il faut que l'utilisateur ait un minimum de choix, comme, par exemple, un menu.

Ce menu va donc afficher ces choix de la façon d'un script Batch : A pour sauvegarder, B pour définir un filtre, C pour choisir le chemin de sortie, Q pour quitter.

Pour commencer, ce code aura besoin d'une boucle principale : ici, c'est la Do/Loop.
Dans cette boucle, on va d'abord récupérer les données (actions) de l'utilisateur, puis utiliser ces dernières pour faire fonctionner le programme.
Donc, il va nous falloir récupérer les lettres du clavier (input) et les analyser, puis les utiliser.

Ce code devrait s'écrire comme ceci (sans oublier d'avoir créé le début du code avant):

start:
rem Définition des valeurs par défaut
access$="E:\"
rem Début de la boucle principale
do
cls 0

rem print Pour afficher des textes à l'écran (et pas pour imprimer)
print "Utilitaire de sauvegarde de fichiers."
print " "
print "A pour sauvegarder, B pour définir un filtre, C pour changer le chemin de sortie, Q pour quitter."

rem Demande une valeur à l'utilisateur et l'enregistre sous key$
input "Choisissez l'action à faire et pressez Enter > ",key$

rem Analyse des données reçues
if key$<>"A" and key$<>"a" and key$<>"B" and key$<>"b" and key$<>"C" and key$<>"c" and key$<>"Q" and key$<>"q" then print "Veuillez choisir un choix valide." : sleep 2000 : gosub start
rem La ligne précédente affiche un message d'erreur pendant 2 secondes puis retourne au début si le choix est invalide.
rem Je n'ai pas oublié dans la ligne précédente à analyser les minuscules et majuscules.
rem Une autre solution aurait été de transformer key$ en minuscules/majuscules pour raccourcir le code.

rem Maintenant que l'analyse est faite, il faut utiliser les données.
rem On va donc commencer par voir si le premier choix a été fait :

if key$="a" or key$="A" then gosub save
rem Si le choix était A ou a, alors on va sauvegarder.

if key$="b" or key$="B" then gosub option1
rem De même pour B, on arrive au sous-menu option1

if key$="c" or key$="C" then gosub option2
rem De même pour C pour arriver au sous-menu option2

if key$="q" or key$="Q" then end
rem Ici, on a vu que si le choix était de quitter, ce programme quittera sans avertir.

rem Maintenant que les dérivations sont faites, on ferme la boucle par mesure de sécurité (ce qui va nous sauver, vous le verrez si vous exécutez ce code quand on aura fini).
loop
return


Voilà, vous avez un menu tout simple que vous pourrez changer chez vous, ajouter des choix et tout et tout...
Mais vous allez me dire, ça marche pas là ?!? Bah non...
Car on n'a pas encore créé les sub-functions (Sous-fonctions).

... toujours pas compris ? bon, vous avez vu lors de l'analyse des choix ces gosub, ils servent à se déplacer vers une sous-fonction.

Mais comme nos sous-fonctions n'existent pas, le compilateur est perdu...

On va donc créer ces sous-fonctions.

2.2 Les sous-fonctions


Dans ce code, il y a 4 sous-fonctions, dont une que l'on a déjà faite (juste au début du dernier code évalué ci-dessus... le fameux start:)
Il faut finir de rédiger les 3 dernières sous-fonctions.

Donc, il y a déjà la première sous-fonction : option1 qui va être l'endroit où choisir les filtres.
Les sous-fonctions ne se placent pas n'importe où, le mieux est d'en créer à la fin du code. Ceci peut ralentir l'exécution du code, mais nous verrons à la fin comment y remédier.

Dans cette sous-fonction, il y aura le même principe que start:
(Début de boucle, affichage de l'interface, récupération des données, analyse des données, exécution finale, fin de boucle.)

Il y aura aussi dans cette sous-fonction l'utilisation d'un tableau... comme une base de données.

Donc, on va faire tout ça :p
option1:
do
cls 0
print "Menu Filtrages des fichiers"
print " "
input "Veuillez entrer un nom de fichiers à exclure ou '/' pour quitter",next$
rem Là, on va créer un tableau nommé exclude$ pouvant contenir 255x1 données, soit 255 :p
dim exclude$(255,1)

rem On analyse les données...
if next$="/\" or next$=chr$(34)+"/\"+chr$(34) then exit
rem Lors de cette analyse de données, on a fait retourner au menu principal l'utilisateur sur sa demande
rem en quittant la boucle avec exit.
rem Maintenant, on remplit le tableau à l'aide d'une autre boucle : la for, to, next

   for nb#=1 to 255

      rem On analyse si la place est libre
      if exclude$(nb#,1)="" then exclude$(nb#,1)=next$ : exit
      rem On remplit la place seulement si elle est libre puis on sort de la boucle.

   next nb#
rem Mais... et si le tableau était plein ?!?
rem Et bien vous savez comment analyser des données maintenant, bonne chance ^^

rem Donc maintenant on ferme la boucle
loop
rem Et on signale au compilateur que la sous-fonction s'arrête là, pour qu'il puisse retourner au menu principal.
return

Pour la prochaine sous-fonction, option2, il faudra commencer par afficher le chemin de sortie courant (par défaut) F:\
Ensuite, on demande à l'utilisateur s'il veut vraiment modifier l'accès.
Par un oui, on lui fait entrer la nouvelle valeur exploitée par access$
Par un non, on retourne au menu principal.

Ça ne devrait pas être trop dur :p
option2:
do
cls 0

print "Changer la sortie de copie."
print " "
print "Chemin de sortie courant : "+access$
input "Voulez-vous vraiment changer le chemin d'accès ? (o : oui / n : non) >",choice$

if choice$<>"o" and choice$<>"O" and choice$<>"oui" and choice$<>"Oui" and choice$<>"OUI" and choice$<>"n" and choice$<>"N" and choice$<>"non" and choice$<>"Non" and choice$<>"NON"
   print "Choix invalide."
   sleep 2000
   gosub option2
endif

if choice$="o" or choice$="O" or choice$="oui" or choice$="Oui" or choice$="OUI"
   input "Veuillez entrer un nouveau chemin d'accès >",access$
else
   exit
endif
loop
return


Et voilà... tout simple... je ne vous ai pas expliqué car vous devriez savoir ce qu'il se passe.
Vous pouvez d'ailleurs, je pense, créer votre propre sous-fonction qui servira à définir le/les chemin(s) d'accès de la source de la copie.

Mais... ne vous soulagez pas trop vite : ce n'est pas fini... :-/

Il nous manque encore la sous-fonction fondamentale à l'utilisation du code : save, qui va nous servir à faire des copies de sauvegardes.

C'est la master, la mastodonte... the Queen...
Allez, fini de "rigoler" : on va le finir ce code.

Mais... dites moi... le DarkBASIC ne nous permet pas de copier des dossiers ? non... des fichiers oui, mais pas des dossiers...

Ho non... c'est l'apocalypse, la fin du monde ! Mais comment va-t-on faire ?!?

Une technique simple consiste à utiliser un autre code capable de le faire, ici on utilisera le Batch.
Mais... vous ne connaissez pas forcément le Batch... ce n'est pas grave, il y a des tutos sur tout l'univers du Net ;-)

Donc, on va utiliser le DarkBASIC pour écrire un fichier Batch et le lancer par la suite.
Heureusement pour nous que le Batch n'a pas besoin d'être compilé pour être exécutable ^^

On va donc procéder comme suit :
save:
cls 0

print "System de sauvegarde par copie"
print " "
print "Source : "+get dir$()
print "Destination : "+access$
print "Voulez-vous vraiment copier le dossier"
input "en cours vers "+access$+" ? (o : oui / n : non)>",choice$

if choice$<>"o" and choice$<>"O" and choice$<>"oui" and choice$<>"Oui" and choice$<>"OUI" and choice$<>"n" and choice$<>"N" and choice$<>"non" and choice$<>"Non" and choice$<>"NON"
   print "Choix invalide."
   sleep 2000
   gosub save
endif

rem Fermeture d'un éventuel fichier ouvert.
if file open(1)=1 then close file 1

rem Suppression d'un éventuel fichier de même nom déjà existant.
if file exist("code.bat")=1 then delete file "code.bat"

rem Création et ouverture d'un fichier Batch (.bat)
open to write 1,"code.bat"

rem Ecriture du code.
write string 1,"@ echo off"
write string 1,"cd "+get dir$()
write string 1,"xcopy "+chr$(34)+get dir$()+chr$(34)+" "+chr$(34)+access$+chr$(34)+" /s /c /q /g /h /x /y"
write string 1,"exit"
close file 1

rem Maintenant que le code est créé, on l'exécute...

execute file get dir$()+"\code.bat", "", get dir$(), 0

rem Il n'est pas sûr à 100% que cette opération fonctionne :s
rem Notre application va attendre que la copie soit terminée avant de continuer.
rem Ne seront copiés que les fichiers et sous-dossiers du répertoire actuel du code DarkBASIC.

print "Quand la copie sera terminée, vous pourrez continuer. Utilisez CTRL+C dans la fenêtre"
print "MS-BATCH (noire) pour stopper son exécution proprement."
sync

rem Le bloc suivant va permettre d'attendre une réaction de la part de l'utilisateur.
while scancode=0
endwhile

rem Et voilà, c'est la fin du code...
return


Nous allons voir maintenant tout ce que vous avez appris ici :p

3. En résumé


Vous avez donc "appris" :
  • 1) L'utilisation de l'algorithme (en quelque sorte)
  • 2) L'appel d'une fonction du compilateur (logique)
  • 3) Faire apparaître une fenêtre à l'écran.
  • 4) La création d'un menu principal constitué de 3 sous-menus.
  • 5) L'appel de sous-fonctions (sub-functions)
  • 6) L'analyse de données.
  • 7) La récupération de données.
  • 8) L'utilisation d'un tableau (vite vu, je l'avoue)
  • 9) La gestion d'un fichier en toute sécurité.
  • 10) Une petite utilisation du Batch ...


Vous aurez sans doute remarqué que le code est incomplet... désolé...

A voir également :

Ce document intitulé «  Introduction au Dark Basic  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.