IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Free Pascal Discussion :

Remplacement de la procédure SetInOutRes de Delphi [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut Remplacement de la procédure SetInOutRes de Delphi
    Bonjour !

    J'ai voulu retoucher l'unité Console de Rudy Velthuis (qui est une réplique de l'unité Crt) pour la rendre compatible avec Free Pascal.

    http://rvelthuis.de/programs/console.html

    Voici les trois modifications que j'ai faites. Je précise que j'ai compilé en mode Delphi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      //ScrollConsoleScreenBufferA(StdOut, Rect, @Rect, NewPos, Fill); // Error: Incompatible type for arg no. 3: Got "Pointer", expected "SMALL_RECT"
      ScrollConsoleScreenBufferA(StdOut, Rect, Rect, NewPos, Fill);
     
      //ReadPtr := T.BufPtr; // Error: Incompatible types: got "TextRec.^TextBuf" expected "PChar"
      ReadPtr := PAnsiChar(T.BufPtr);
     
      //SetInOutRes(GetLastError); // Error: Identifier not found "SetInOutRes"
    Je pense que les deux premières corrections sont bonnes. En revanche je n'ai pas trouvé de remplacement pour la procédure SetInOutRes() qui (si j'ai bien compris) permet de régler la valeur de la variable (?) IOResult. Auriez-vous une idée ?

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    cette fonction ne sert qu'à remettre à zéro le code erreur des entrées\sorties

    cela revient un peu à faire IOResult := 0;

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Salut Roland,
    Citation Envoyé par Roland Chastain Voir le message
    Auriez-vous une idée ?
    Aucune !
    Suis allé farfouiller dans mes vieilles sources .pas, Windows comme SysUtils, et cette procédure n'y est pas...

    Je pense que c'est le moment d'écrire à l'auteur.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    resalut

    non c'est dans system.pas pour delphi

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Merci pour vos réponses. Vu l'endroit où l'instruction est placée, j'ai l'impression qu'elle ne sert pas à grand chose. En tout cas la valeur de IOResult n'est jamais utilisée dans l'unité. Peut-être l'idée est-elle que le programme utilisant l'unité puisse lire la valeur de IOResult en cas d'échec de l'ouverture de la console. Mais bon, comme ça n'échoue jamais...

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Citation Envoyé par anapurna Voir le message
    resalut

    non c'est dans system.pas pour delphi
    Rhôôô, c'est la meilleure, celle-là

    Extraits du console.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    interface
     
    uses Windows;
     
    implementation
     
    uses SysUtils;
    Comment t'as fait pour deviner que c'était dans system.pas ? Ou alors cette unité est incluse par défaut ?

    Et voilà tout ce qu'on trouve à ce propos dans le system.pas de mon vieux D3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure SetInOutRes;
    asm
            PUSH    EAX
            CALL    SysInit.@GetTLS
            POP     [EAX].InOutRes
    end;
     
    procedure InOutError;
    asm
            CALL    GetLastError
            JMP     SetInOutRes
    end;
    Je vous laisse traduire en français,

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    @Jipété

    Oui, l'unité System est appelée implicitement. Merci pour le code. C'est bizarre, il n'y a pas d'argument à la procédure.

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    C'est bizarre, il n'y a pas d'argument à la procédure.
    Le bout extrait doit avoir pas loin de 20 ans, ça a peut-être évolué depuis, mais je n'ai pas mieux à proposer...

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    j'ai delphi 7 au boulot j'ai juste fait une recherche et il m'a ouvert unité system

    il y a un argument a la procédure c'est bien pour cela que l'on passe getlasterror

    PS voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure SetInOutRes(NewValue: Integer);
    begin
      InOutRes := NewValue;
    end;
    a priori
    InOutRes est une threadvar global a l'unité system (déclaré dans l'implementation )

  10. #10
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Citation Envoyé par anapurna Voir le message
    InOutRes est une threadvar global a l'unité system (déclaré dans l'implementation )
    J'ai eu la curiosité de fouiller dans les source de la RTL Free Pascal (v3.0.0) :

    InoutRes est une variable Threadvar (type Word) déclarée dans l'Interface de l'unité System (et plus précisément dans le fichier inclus Systemh.inc tout comme la fonction IOResult). InouRes est donc Public et peut être lu ou écrit directement depuis n'importe où. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InOutRes := GetLastError;
    Le hic c'est que les codes d'erreur contenus dans InoutRes (et renvoyés par la fonction IOResult) sont sensés être des codes MSDOS (compatibilité Turbo Pascal) alors que GetLastError n'existe que pour la plateforme Windows avec une codification des erreurs légèrement différente. Pour les autres plateformes le mécanisme de récupération des erreurs, ainsi que leur codification, est encore différent.

    Pour cela l'unité System dispose, en section Implementation, de routines de conversion de codes (donc non publiques). On peut les consulter dans le fichier SysOs.inc correspondant à la plateforme considérée. Les noms peuvent varier :
    Errno2InoutRes (WIN), PosixToRunError (Unix, Linux, AIX, etc.), DosError2InOut (Amiga), Etc.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Merci à tous pour vos recherches.

    Donc j'ai adopté la correction suggérée par DomDA91 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InOutRes := GetLastError;
    Pour la différence entre les plateformes, c'est bon à savoir mais en l'occurrence ce n'est pas gênant puisque l'unité Console est destinée exclusivement à Windows. Mais je prends bonne note de la remarque sur la différence entre les codes d'erreur DOS et Windows.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment remplacer des fonctions MySQL/PHP en Delphi
    Par Sundark dans le forum Débuter
    Réponses: 7
    Dernier message: 23/05/2008, 09h39
  2. Executer une procédure Access sous Delphi
    Par kmaniche dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/12/2006, 20h51
  3. Créer une procédure stockée depuis Delphi
    Par blonde dans le forum Bases de données
    Réponses: 10
    Dernier message: 10/03/2006, 11h26
  4. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 09h47
  5. PRocédure stocké, comment appeler avec delphi?
    Par SkyDev dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/04/2004, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo