[TUTO] Le compilateur en mode « Standby »

Informations pour bien débuter en PureBasic
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

[TUTO] Le compilateur en mode « Standby »

Message par Ollivier »

ça me turlupinait un temps de ne rien trouver à ce sujet. (Si j'ai loopé un tel sujet, son auteur m'en voit désolé). Mais j'ai été surpris de découvrir l'aide dans le répertoire SDK (grâce à un gars du forum anglais)
de PB (à mon nez et à ma barbe...).

Je poste la traduction de ces quelques
instructions.

___________________________________________________________

_______________________

Le compilateur PUREBASIC
______________________


Interface de communication avec éditeurs et scripts
____________________________________________________________


Compatibilité
Nous [la PBTeam] essayons de garder la compatibilité avec les anciennes
versions autant que possible, donc les anciens editeurs/
scripts peuvent encore fonctionner avec les nouvelles
versions de PB.

Les exceptions seront inscrites dans ce document fourni avec
chaque nouvelle version de compilateur.

Les anciennes versions de PB pour Windows (< 4.00)
utilisaient une Interface qui n'est plus valable pour les
versions récentes (> Version 4.00). Donc, si vous utilisiez
cette Interface, il vous faut faire la mise à jour.

Generalités

Quand le compilateur est démarré avec l'option /STANDBY (sous
Windows) ou l'option --standby (sous Linux et Mac), il va
attendre les commandes depuis l'entrée standard et répondre
vers la sortie standard. Cela permet de contrôler le
compilateur depuis un language ou script capable d'accéder
au canal standard du programme.

Sous PB, la librairie 'Process' permet cet échange
d'information.

Les commandes doivent être données sous forme de texte terminé
par un code de retour chariot (code ASCII 13, #CRLF ou #LF).
Il est important de respecter cette syntaxe sinon le compilateur
va mal réagir. La fonction 'WriteProgramStringN()' de la
librairie 'process' assure bien cette manoeuvre.

D'autres language ont cette même fonction comme fflush() en C.

Une commande doit être écrite en majuscule en début de ligne,
suivi d'éventuels arguments séparés par une tabulation.
(Les tabulations sont Notées <T> dans ce document).

Il ne doit pas y avoir d'espace, sauf s'ils appartiennent à un
des arguments d'une commande.

Excepté au démarrage, le compilateur écrira tout dans la sortie
standard en tant que réponse à une commande envoyée. Donc, vous
avez besoin de vérifier l'arrivée d'une réponse uniquement après
l'envoi d'une commande.

Le retour de réponse dépend donc uniquement du fait que l'on
envoie des commandes. Si rien n'est envoyé, la réponse est une
ligne unique de départ.

Dès le démarrage, le compilateur écrit cette ligne:

STARTING<T><VersionNr><VersionString>

<VersionNr> contient le numéro de version du compilateur sous
la forme '4.30'

Cette valeur peut être utilisée pour déterminer quelles commandes
sont supportés par le compilateur.

<VersionString> est la version du compilateur sous la forme
'PureBasic 4.10 (Windows - x86)'.

Ensuite, le compilateur charge ses librairies, et indique la ligne
suivante:

READY
- Le compilateur a fini son chargement initial et est prêt
à fonctionner

ERROR<T><Message>
- Le compilateur ne peut pas fonctionner
correctement pour les raisons données dans le message.

ERROR<T>SUBSYSTEM<T><SubsystemName>
- Le compilateur ne trouve pas le sous-système spécifié

Après le message 'READY', le compilateur attend désormais les
commandes sur le canal d'entrée standard.

Par contre, après un message 'ERROR', le compilateur s'arrête
immédiatement.

Sous-système et mode unicode

Les options de librairie sous-système et d'unicode ne peuvent
être modifiées pendant le fonctionnement du compilateur.

Pour effectuer un tel changement, le compilateur doit être
redémarré. C'est pourquoi ces deux types d'options sont
indisponibles ici. Ces deux types d'options doivent être
spécifiées dans la ligne de commande, au démarrage du
compilateur, au même titre que l'option /STANDBY.

Commandes supportées
(Depuis la version 4.10)


END

Ordonne au compilateur de s'arrêter

Paramètre(s) : Aucun
Réponse(s) : Aucune


SOURCE<T><FichierSource>

Indique au compilateur le nom du fichier source
pour la prochaine comilation

Paramètre(s) : Le nom du fichier source. (Il doit contenir
l'intégralité du chemin d'accès)
Réponse(s) : Aucune


SOURCEALIAS<T><SouceFile Alias>

Indique au compilateur le nom du fichier qui sera retourné dans
la constante #PB_Compiler_File pour le code source principal
à la place du nom de fichier spécifié par la commande SOURCE.
C'est utile pour les éditeurs qui compilent à partir d'un fichier
temporaire, mais qui veulent que le fichier source réel soit
reporté ici.

Paramètre(s) : Le nom du fichier (doit contenir l'intégralité du
chemin d'accès)
Réponse(s) : Aucune


INCLUDEPATH<T><Chemin>

Indique au compilateur quelles instructions de tous les
'FichierDInclusion' seront pris en compte. Cela permet de
mettre le fichier source dans répertoire temporaire en incluant
les fichiers relatifs au chemin d'origine. Si le chemin d'inclusion
n'est pas spécifié, le chemin du fichier source est utilisé par défaut.

Paramètre(s) : Le chemin d'accès. Il doit être complet et terminé
par un caractère '\' ou '/' (selon l'OS)
Réponse(s) : Aucune


RESOURCE<T><File>

(Pour Windows uniquement) Spécifie un script ressource (*.rc) à
inclure dans la compilation.

Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune


ICON<T><File>

Spécifie une icône pour l'application

Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune

Types de fichier supportés:
Windows : *.ico
MacOSX : *.icns
Linux : Non supporté


TARGET<T><FichierCible>

Spécifie le fichier cible pour la prochaine compilation.

Paramètre(s) : Le nom de fichier. (doit contenir le chemin complet)
Réponse(s) : Aucune


CONSTANT<T><ConstantDefinition>

Définit une constant pour la prochaine compilation.

Paramètre(s) : La ligne définissant intégralement la constante
Réponse(s) : Aucune. Si la définition venait à créer une erreur, cette
erreur n'apparaîtra qu'à la prochaine compilation.

Note : C'est la même règle pour l'option /CONSTANT dans la ligne
de commande. Ce qui signifie que la syntaxe doit être du type
"NAME=Value" sans le caractère '#' et sans espace autour du
signe '='. Cela signifie aussi que les nombres seront interprétés
comme des constantes numériques alors que toute expression
autre qu'un nombre sera considérée comme une constante
chaîne.


LINKER<T><FichierCommandeLieur>

Spécifie les options de la ligne de commande pour le lieur
(Semblable à l'option /LINKER de la ligne de commande)

Paramètre(s) : Un nom de fichier contenant les commandes
pour le lieur (doit contenir le chemin complet)
Réponse(s) : Aucune


COMPILE<T><FlagsList>

Démarre la compilation avec un fichier source, un fichier
cible et les drapeaux d'état préalablement spécifiés.

Paramètre(s) : Liste des drapeaux d'état séparés par une
tabulation.

Drapeaux d'état possibles :

DEBUGGER - Compilateur avec débogueur
INLINEASM - Autorise l'assembleur en ligne
DLL - Crée un DLL
XPSKIN - Active les skins XP (Windows uniquement)
ADMINISTRATOR - Mode administrateur sous Vista (Windows uniquement)
USER - Mode utilisateur (Windows uniquement)
CONSOLE - Crée un exécutable en mode console (Windows uniquement)
ONERROR - Autorise les instructions de la librairie OnError
MMX - Crée un exécutable optimisé MMX
3DNOW - Crée un exécutable optimisé 3DNOW
SSE - Crée un exécutable optimisé SSE
SSE2 - Crée un exécutable optimisé SSE2
DYNAMICCPU - Crée un exécutable compatible à tous les CPUs
THREAD - - Crée un exécutable avec sécurisation des threads
PROGRESS - Indique la progression de la compilation (Cf plus bas)
WARNINGS - Affiche les messages d'avertissement (Ver 4.30 Cf plus bas)

Exemple: 'COMPILE<T>DEBUGGER<T>THREAD' compilera avec le
débogueur et avec la sécurisation des threads

Après que la commande ait été exécutée (avec ou sans succès),
toutes les options (SOURCE, TARGET, ICON, RESOURCE,
INCLUDEPATH, CONSTANT, LINKER) seront effacées.
Elles ont donc besoin d'être à nouveau spécifiées par la suite
pour une future compilation.

Réponse(s) :

Si le drapeau d'état PROGRESS est spécifié, le compilateur
répondra par une ou plusieurs des lignes suivantes :

PROGRESS<T>INCLUDE<T><FileName> - un nouveau fichier est inclu
PROGRESS<T>LINES<T><LinesCount> - renseigne de la progression
toutes les 1000 lignes ainsi qu'à la fin totale de la lecture
PROGRESS<T>ASSEMBLING - indique que l'assemblage est accompli
PROGRESS<T>LINKING - indique que les liens sont accomplis

De nouveaux indicateurs de progression devraient voir le jour à l'avenir, donc
pour assurer la compatibilité future, les lignes de réponse sous la forme
'PROGRESS<T>XXX' et qui ne sont pas comprises doivent être ignorées.

Pour les versions 4.30 et ultérieures, si le drapeau d'état 'WARNINGS' est
spécifié, le compilateur est susceptible d'émettre des messages
d'avertissement. La séquence est comme le modèle qui suit :

WARNING<T><Source NumeroLigne>
Un message d'avertissement est émis pour la ligne donnée

Ce qui suit est un nombre de lignes d'informations optionnelles terminé par
la ligne 'OUTPUT<T>COMPLETE'.

A l'avenir, il pourra y avoir plus de lignes en guise de réponse, donc pour
assurer la compatibilité future, il est recommandé de lire toutes les lignes
jusqu'à ce que la ligne 'OUTPUT<T>COMPLETE' soit atteinte en ignorant
ce qui est non identifiable.

INCLUDEFILE<T><NomFichier><T><NumeroLigne>

L'erreur décelé se situe dans un fichier d'inclusion. Les arguments
indiquent donc le nom de fichier et la ligne mise en cause dans le
fichier d'inclusion.

MESSAGE<T><Texte>
Le message d'avertissement actuel.

OUTPUT<T>COMPLETE
Indique la fin de la séquence d'avertissement.

Quand la compilation est effectuée, la réponse peut être :

SUCCESS
La compilation s'est passé correctement

ERROR<T>SYNTAX<T><Source NumeroLigne>
Une erreur a été détectée durant la compilation du code PB

L'argument <Source NumeroLigne> donne le numéro de ligne
où l'erreur s'est produite.

Ce qui suit est un ensemble d'informations optionnelles se
terminant toujours par le signal 'OUTPUT<T>COMPLETE'
A l'avenir, d'autres types de réponse pourront être ajoutées
donc... pour assurer... la compatibilité, il est... recommandé
de lire toutes les lignes jusqu'à ce que la ligne
'OUTPUT<T>COMPLETE' soit atteinte, en ignorant les lignes
qui ne sont pas identifiables.

INCLUDEFILE<T><NomFichier><T><NumeroLigne>
Une erreur s'est produite dans un fichier d'inclusion. Les
arguments donnent le nom de fichier et le numéro de
ligne dans lesquels s'est produite l'erreur.

MACRO<T><ErrorLine><T><TotalMacroLines>
Une erreur a eu lieu dans une macro. Ce qui suit cette ligne
est le contenu de la macro déployée. (<TotalMacroLines>
= nombre de lignes). Cela se termine par une ligne contenant
'MACRO<T>COMPLETE'

<ErrorLine> donne la ligne dans la macro a provoqué
une erreur.

MESSAGE<T><Texte>
Le message de l'erreur actuellement décelée.

OUTPUT<T>COMPLETE
Indique la fin de la séquence d'informations sur l'erreur de syntaxe.

Note : Si certain des numéros de ligne ne peuvent pas être
déterminés par le compilateur (par exemple pour les erreurs
qui ne peuvent pas être précisément localisées), le numéro de
ligne retourné sera -1. Donc, vous devez vous attendre à gérer
cetype de valeur.

ERROR<T>ASSEMBLER
ERROR<T>LINKER
ERROR<T>RESOURCE


Une erreur a été détectée durant l'assemblage, le linkage
ou la compilation des ressources de script. Les informations
qui suivent sont alors retournées par le compilateur sous la forme
d'une séquence se terminant par 'OUTPUT<T>COMPLETE'.

FUNCTIONLIST

Demande le listing des fonctions connues par le compilateur.
(Fonctions PB + Fonctions librairie utilisateur)
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de fonctions.
Il y succède une fonction par ligne avec le nom de la fonction et
une brève description (si spécifié durant la création de la librairie).
La séquence se termine par 'OUTPUT<T>COMPLETE'.


STRUCTURELIST

Demande le listing des structures connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre de structures.
Il y succède un nom de structure par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.

INTERFACELIST

Demande le listing des interfaces connues par le compilateur.
Paramètre(s) : Aucun
Réponse(s) : La première ligne contient le nombre d'interfaces.
Il y succède un nom d'interface par ligne.
La séquence se termine par 'OUTPUT<T>COMPLETE'.


STRUCTURE<T><Nom>

Demande le contenu d'une structure connue par le compilateur.
Paramètre(s) : Le nom de la structure
Réponse(s) : La définition de la structure à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.


INTERFACE<T><Nom>

Demande le contenu d'une interface connue par le compilateur.
Paramètre(s) : Le nom de l'interface
Réponse(s) : La définition de l'interface à raison d'un membre
par ligne. La séquence se termine par 'OUTPUT<T>COMPLETE'.


HELPDIRECTORY<T><NomFonction>

Demande au compilateur le nom de la librairie d'une fonction
spécifiée.
Paramètre(s) : Le nom de la fonction
Réponse(s) : Soit 'API', soit 'UNKNOWN' soit le nom de
le librairie spécifiée
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

direct mis en post it et dans la rubrique des tutos

http://www.purebasic.fr/french/viewtopi ... 5087#65087

Merci pour le boulot :D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Manque plus qu'un petit code source pour tester.

Mais sinon trés bon tuto !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

le code source est ici :)
http://purebasic.developpez.com/faq/?pa ... ompilateur

Tu empiles les 4 codes sources à la suite et tu lances.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

C'est dommage que ce genre de truc ne soit pas mis directement dans la documentation ! En tout cas un grand merci pour cette trouvaille. :D
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Thyphoon a écrit :C'est dommage que ce genre de truc ne soit pas mis directement dans la documentation ! En tout cas un grand merci pour cette trouvaille. :D
tout ceci est dans le SDK
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

comtois a écrit :le code source est ici :)
http://purebasic.developpez.com/faq/?pa ... ompilateur

Tu empiles les 4 codes sources à la suite et tu lances.
>> Bravo pour le travail. Je n'avais même pas vu. Qu'est-ce que tu dois en baver à faire une telle page.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Progi1984 a écrit :Manque plus qu'un petit code source pour tester.

Mais sinon trés bon tuto !
Voici un exemple succint qui affiche les fonctions dans un éditeur afin d'être copiées/collées...

Code : Tout sélectionner

EnableExplicit

#DispLib = 1
#DispFn  = 2

#Gdt_A  = 1
#Gdt_A1 = 2
#Gdt_A2 = 3

#Gdt_FnExplorer   = #Gdt_A1
#Gdt_Editor = #Gdt_A2

#Spe_CR = Chr(13)

Structure ESInfo

    DeskWidth.I
    DeskHeight.I
    DeskDepth.I
    MainWinNo.I
    MainWinWidth.I
    MainWinHeight.I
   
    WinEvt.I
    EvtWin.I
    EvtGdt.I
    Evt.I
   
    FnExplorerType.I
    FnExplorerLib.S

EndStructure

Structure ProgInfo

    Hnd.I
    Name.S
    Param.S
    WorkDir.S
    Flags.I
    Exit.S
    Request.S
    Answer.S
    CoreQty.I
    SharedDuration.I
    Tabulation.S
    FnQty.I
    FnSelect.I
    LibQty.I
    LibSelect.I

EndStructure

Structure LibInfo

    Name.S
    Guid.Q

EndStructure

Global Prog.ProgInfo
Global ES.ESInfo

Global Dim Fn.S(0)
Global Dim FnLib.Q(0)

Global Dim Lib.LibInfo(0)
Global Dim TempLib.LibInfo(0)

;-Autres
Procedure.S StringField2(String.S, Index.I, Separator.S)
   Protected Result.S
   Protected I.I
   Protected Find.I
   Protected No.I
   Protected Length.I
   Protected Start.I

   Index - 1
   Start = 1
   If Index
      For I = 1 To Index
         Start = FindString(String, Separator, Start + 1)         
      Next
      Start + Len(Separator)
   EndIf
   Find = FindString(String, Separator, Start + 1)
   If Find = 0
      Find = Len(String) + 1
   EndIf
   Length = Find - Start
   Result = Mid(String, Start, Length)
   ProcedureReturn Result
EndProcedure

;-COMPILER
Procedure.I LibExist(LibName.S)
    Protected I.I
    Protected Result.I

    LibName = LCase(LibName)

    For I = 0 To Prog\LibQty - 1
        ;Debug Lib(I)\Name + " = ? = " + LibName
        If LCase(Lib(I)\Name) = LibName
            Result = 1
            Break
       
        EndIf
   
    Next I

    ProcedureReturn Result
EndProcedure

Procedure.S AnswerField(Rank.I, NoUpdate.I = 0)
    Protected Result.S

    If NoUpdate = 0
   
        Prog\Answer = ReadProgramString(Prog\Hnd)
   
    EndIf
   
    Result = StringField(Prog\Answer, Rank, Chr(9) )

    ProcedureReturn Result
EndProcedure

Procedure Ask()

    Protected I.I
    Protected Field.S
                   
    Prog\Request = ReplaceString(Prog\Request, Prog\Tabulation, Chr(9) )

    For I = 0 To CountString(Prog\Request, Chr(9) )

        Field = StringField(Prog\Request, 1, Chr(9) )
                   
        If I = 0
                       
            Field = UCase(Field)
                       
        EndIf
                   
        Prog\Request = ReplaceString(Prog\Request, Field, Trim(Field), #PB_String_NoCase)
                   
    Next I

    If ProgramRunning(Prog\Hnd)

        WriteProgramStringN(Prog\Hnd, Prog\Request)
                   
    EndIf

EndProcedure

Procedure ExtractFunctions()

    Protected I.I

    Prog\Request = "functionlist"
   
    Ask()
   
    Prog\FnQty = Val(AnswerField(1) )
   
    Global Dim Fn.S(Prog\FnQty - 1)
    Global Dim FnLib.Q(Prog\FnQty - 1)
   
    For I = 0 To Prog\FnQty - 1

        Fn(I) = AnswerField(1)

    Next I
   
    AnswerField(2)

EndProcedure


Procedure SelectLib(LibName.S)
    Protected I.I

    LibName = LCase(LibName)

    For I = 0 To Prog\LibQty - 1

        If LCase(Lib(I)\Name) = LibName
       
            Prog\LibSelect = I
            Break
       
        EndIf
   
    Next I
   
EndProcedure

Procedure SelectFn(FnName.S)
    Protected I.I

    FnName = LCase(FnName)

    For I = 0 To Prog\FnQty - 1
   
        If LCase(StringField(Fn(I), 1, " ") ) = FnName
       
            Prog\FnSelect = I
            Break
       
        EndIf
   
    Next I

EndProcedure


Procedure PrepareLibs()

    Protected I.I
    Protected J.I
    Protected Answer.S
   
    For I = 0 To Prog\FnQty - 1
   
        Prog\Request = "helpdirectory§§" + StringField(Fn(I), 1, " ")
       
        Ask()
       
        Answer = AnswerField(1)
       
        If LibExist(Answer) = 0
       
            Global Dim TempLib.LibInfo(Prog\LibQty)
            For J = 0 To Prog\LibQty - 1
                TempLib(J)\Name = Lib(J)\Name
                TempLib(J)\Guid = Lib(J)\Guid
            Next J

            Global Dim Lib.LibInfo(Prog\LibQty) 
            For J = 0 To Prog\LibQty - 1
                Lib(J)\Name = TempLib(J)\Name
                Lib(J)\Guid = TempLib(J)\Guid
            Next J

            Global Dim TempLib.LibInfo(0) 
            Lib(Prog\LibQty)\Name = Answer
            Lib(Prog\LibQty)\Guid = Val("$" + Left(MD5Fingerprint(@Lib(Prog\LibQty)\Name, Len(Lib(Prog\LibQty)\Name) ), 16) ) ; /!\ UTF-8 /!\
            Prog\LibQty + 1
       
        EndIf
         
        SelectLib(Answer)
        FnLib(I) = Lib(Prog\LibSelect)\Guid
   
    Next I
   
    SortStructuredArray(Lib(), #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(LibInfo\Name), #PB_Sort_String)
   
EndProcedure


Procedure Request()

    Repeat
                 
        Delay(Prog\SharedDuration)

        If ProgramRunning(Prog\Hnd)

            Prog\Request = InputRequester("", "", "")
           
            Ask()

        Else

            Break

        EndIf

    ForEver

EndProcedure
   
;-GUI   
Procedure UpdateFnExplorer()
    Protected I.I

    Select ES\FnExplorerType
       
        Case #DispLib
       
            ClearGadgetItems(#Gdt_FnExplorer)

            For I = 0 To Prog\LibQty - 1
           
                AddGadgetItem(#Gdt_FnExplorer, I + 1, Lib(I)\Name, ImageID(0))
               
            Next I
       
        Case #DispFn
       
            For I = 0 To Prog\LibQty - 1
           
                If ES\FnExplorerLib = Lib(I)\Name
               
                    Prog\LibSelect = I
                    Break 
               
                EndIf
               
            Next I

            ClearGadgetItems(#Gdt_FnExplorer)
           
            For I = 0 To Prog\FnQty - 1
           
                If FnLib(I) = Lib(Prog\LibSelect)\Guid
                   
                    AddGadgetItem(#Gdt_FnExplorer, I + 1, StringField(Fn(I), 1, " "), ImageID(0))
               
                EndIf
               
            Next I
       
    EndSelect
EndProcedure

Procedure MainWindow()

    Protected I.I
    Protected Text.S

    ExamineDesktops()
    ES\DeskWidth  = DesktopWidth(0)
    ES\DeskHeight = DesktopHeight(0)
    ES\DeskDepth  = DesktopDepth(0)
   
    ES\MainWinNo = OpenWindow(-1, 0, ES\DeskHeight >> 2, ES\DeskWidth, ES\DeskHeight >> 1, "PureUser", $CF0001)
    SmartWindowRefresh(ES\MainWinNo, 1)
   
    ES\MainWinWidth  = WindowWidth(ES\MainWinNo)
    ES\MainWinHeight = WindowHeight(ES\MainWinNo)
   
    ListIconGadget(#Gdt_A1, 0, 0, ES\MainWinWidth, ES\MainWinHeight, "", 0, #PB_ListIcon_GridLines)
    EditorGadget(#Gdt_A2, 0, 0, ES\MainWinWidth, ES\MainWinHeight)
    SplitterGadget(#Gdt_A, 0, 0, ES\MainWinWidth, ES\MainWinHeight, #Gdt_A1, #Gdt_A2, #PB_Splitter_Vertical)

;    LoadImage(0, "examples\sources\data\drive.bmp")
    CreateImage(0, 32, 32)
    StartDrawing(ImageOutput(0) )
      Box(0, 0, 32, 32, 0)
      Box(1, 1, 30, 30, #White)
    StopDrawing()
    SetGadgetAttribute(#Gdt_FnExplorer, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
   
    ES\FnExplorerType = #DispLib
    UpdateFnExplorer()
   
    Repeat
     
        Delay(1)
       
        ES\WinEvt = WindowEvent()

        If ES\WinEvt
       
            ES\EvtWin = EventWindow()
            ES\Evt    = EventType()
                       
            If ES\EvtWin = ES\MainWinNo
             
                Select ES\WinEvt
                   
                    Case 16

                        Break
               
                    Case #PB_Event_SizeWindow
                   
                        ES\MainWinWidth = WindowWidth(ES\MainWinNo)
                        ES\MainWinHeight = WindowHeight(ES\MainWinNo)
                        ResizeGadget(#Gdt_A, 0, 0, ES\MainWinWidth, ES\MainWinHeight)
                        UpdateFnExplorer()
                       
                    Case #PB_Event_Gadget
                   
                        ES\EvtGdt = EventGadget()

                        If ES\EvtGdt = #Gdt_A
                       
                            UpdateFnExplorer()
                         
                        EndIf

                        If ES\EvtGdt = #Gdt_FnExplorer
                       
                            If ES\Evt = #PB_EventType_LeftClick 
                                           
                                If ES\FnExplorerType = #DispLib
                                                 
                                    ES\FnExplorerType = #DispFn
                                    ES\FnExplorerLib  = GetGadgetItemText(#Gdt_FnExplorer, GetGadgetState(#Gdt_FnExplorer) )
                                    UpdateFnExplorer()
                                
                                Else
                                
                                    SelectFn(GetGadgetItemText(#Gdt_FnExplorer, GetGadgetState(#Gdt_FnExplorer) ) )
                                    Text = StringField2(Fn(Prog\FnSelect), 1, " - ") + #Spe_CR
                                    Text + StringField2(Fn(Prog\FnSelect), 2, " - ") + #Spe_CR
                                    Text + #Spe_CR + GetGadgetText(#Gdt_Editor)
                                    SetGadgetText(#Gdt_Editor, Text)
                                    ES\FnExplorerType = #DispLib
                                    UpdateFnExplorer() 
                                
                                EndIf
                               
                            EndIf
                         
                        EndIf
                         
                EndSelect
               
            EndIf
       
        EndIf
       
    ForEver
   
    CloseWindow(ES\MainWinNo)

EndProcedure
   
    Prog\CoreQty        = 1 ; Nombre de coeur(s) CPU
    Prog\SharedDuration = Prog\CoreQty << 4 + 2
   
    Prog\Tabulation     = "§§"
   
    Prog\Name           = "PbCompiler.EXE"
    Prog\Param          = "/STANDBY"
    Prog\WorkDir        = #PB_Compiler_Home + "\Compilers"
    Prog\Flags          = #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Hide
 
    Prog\Hnd   = RunProgram(Prog\Name, Prog\Param, Prog\WorkDir, Prog\Flags)
 
    If Prog\Hnd

        MessageRequester(AnswerField(3), "Démarrage du compilateur")
       
        If AnswerField(1) = "READY"
       
            ExtractFunctions()
           
            PrepareLibs()
           
            Prog\Request = "end"
            Ask()
       
        EndIf
 
    EndIf
   
    SelectFn("createimage")
   
    SelectLib("image")

    MainWindow()   
   
    Delay(Prog\SharedDuration)
   
    End
    
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [TUTO] Le compilateur en mode « Standby »

Message par Ollivier »

Bonjour à vous,

n'ayant que très peu de temps, je me permets de soumettre cette demande ouverte.

Fred a ajouté 'IMPORTLIST'. Est-il possible qu'une (ou plusieurs) âme charitable teste cet ajout, afin de compléter ce tutoriel?

Je rappelle, à moins que je me plante, que ce mode est un gage hors du commun de fiabilité dans le temps.

Il permet de faire évoluer le langage, tester la faisabilité de suggestions de nouvelles syntaxes, convertir à 100% toutes les autres syntaxes possibles et inimaginables connues (C, Pascal, Fortran, Python, etc... Si quelqu'un veut s'amuser avec la liste des langages du site Rosetta Code, il le peut), l'orienté objet y compris (d'où la nullité de tout débat à ce sujet).

Bon temps à vous.
Répondre