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

Lazarus Pascal Discussion :

Error 1407 sous Windows [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Finalement ça n'est pas un bug sous lazarus mais un 'problème' dans ton code.

    Tu as une instruction ShowMessage dans la section 'initialization' de JDRBattle. Sous linux ça passe et on voit le message sous windows ça plante certainement parce que certaines initialisations indispensables n'ont pas encore été réalisées.

    Régle => Pas d'affichage graphique dans la section 'initialization' d'une fiche ou unité. Et j'ajouterais ni avant 'Application.Initialize'.

    Si tu as besoin de messages pour débugger ton code tu as cette solution.

    Un autre conseil pour la route : pas de chemins absolus dans ton code.

    Par exemple, dans ton unité JDRGestFiles tu as ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PathM1 :   string = 'c:\lazarus\jdr\datas\monsters\monster.dta';
    PathBoss:  string = 'c:\lazarus\jdr\datas\monsters\bosses.dta';
    Le problème c'est que moi je n'ai pas décompressé ton archive au même endroit. Résultat dès que je clique sur explorer --> BOUM !

    Une solution dans un premier temps c'est de n'utiliser que des chemins relatifs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PathM1 :   string = 'datas\monsters\monster.dta';
    PathBoss:  string = 'datas\monsters\bosses.dta';
    Mais la meilleure solution : http://wiki.lazarus.freepascal.org/M...gramming_Guide en particulier la section 'Data and resource files'.

  2. #22
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    Bravo Batman! tu es mon super Héro

    je confirme que ça marche en retirant cette ligne showmessage

    1 semaine de galère à cause d'une bétise

    comment as tu fait pour trouver cette aiguille ds une botte de foin ?

    heureusement que vous êtes là

    encore un gros merci Batyann

    Problème Résolu !!

  3. #23
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Pour trouver le bug j'ai utilisé le débogueur. J'ai constaté que l'exception était levée avant même la première instruction du programme. Donc c'était logiquement dans la section 'initialization' d'une unité.

    D'ailleurs j'ai vu que tu utilisais la section 'initialization' des unités pour initialiser des variables et parfois même des variables déclarées dans une autre unité. A faire comme ça ton programme vite devenir incompréhensible...

    Il vaut mieux initialiser les variables au moment de la déclaration. Par exemple ta variable City :

    déclarée dans JDRConfig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
       i, j, index, Essai, ErrorCode, hero, city , NbBattles,
       IndexPerso, IndexMonster, Chest: integer;
    et initialisée dans JDRMain :
    Tu peux initialiser ta variable au moment de sa déclaration dans JDRConfig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
       i, j, index, Essai, ErrorCode, hero, NbBattles,
       IndexPerso, IndexMonster, Chest: integer;
     
       City : integer = 1; // <==
    Sans compter que beaucoup de tes variables globales n'ont pas de raison d'être : i, j, index sont typiquement le genre de variable qu'on déclare localement dans les procédures ou les fonctions quand en on a besoin.

    Sans compter qu'en plus bien souvent les variables globales c'est mal.

    Maintenant tu as du boulot pour ce weekend !

  4. #24
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    ha oui le debogueur , j'ai entendu parler de cette étrange bête, mais je n'ai pas encore osé m'en approcher


    pour les variables globales, je fais de mon mieux, par rapport à la V1 yen a moins de 10, je ferai mieux par la suite

    pour l'initialisation des variables, merci du tuyau, je vais revoir ma copie

    riche de ton savoir, as tu une idée du sens de cette erreur 1407 ??

  5. #25
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Pour le 1407 c'est un code erreur de l'API win32 mais je ne connais que vaguement et n'y ai plus touché depuis 10 ans donc l'explication qui suit peut être plus ou moins carrément fause.

    Quand tu veux créer un composant graphique (ex: un bouton) sous windows tu passes par un appel à la fonction CreateWindowEx qui prend tout un tas de paramètres. Parmi ces paramètres tu doit passé le nom d'une classe de fenêtre que tu as du auparavant déclarer par un appel à RegisterClassEx.

    Sous lazarus c'est 'Application.Initialize' qui appelle RegisterClassEx. Mais 'Application.Initialize' n'est appelé qu'après que toutes les sections 'initialize' des unités aient été appelées. Hors ton ShowMessage provoquait un appel à CreateWindowEx avant l'appel de RegisterClassEx donc tu essayais de créer un composant avec une classe de fenêtre non encore enregistrée ce qui provoquait une erreur "classe de fenêtre introuvable" qui porte le code 1407.

    Mais bon Lazarus te permet de ne pas avoir à mettre les mains dans le camboui de l'API Win32 et c'est beaucoup plus simple.

  6. #26
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    Un autre conseil pour la route : pas de chemins absolus dans ton code.

    Par exemple, dans ton unité JDRGestFiles tu as ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PathM1 :   string = 'c:\lazarus\jdr\datas\monsters\monster.dta';
    PathBoss:  string = 'c:\lazarus\jdr\datas\monsters\bosses.dta';
    Le problème c'est que moi je n'ai pas décompressé ton archive au même endroit. Résultat dès que je clique sur explorer --> BOUM !

    Une solution dans un premier temps c'est de n'utiliser que des chemins relatifs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PathM1 :   string = 'datas\monsters\monster.dta';
    PathBoss:  string = 'datas\monsters\bosses.dta';
    Mais la meilleure solution : http://wiki.lazarus.freepascal.org/M...gramming_Guide en particulier la section 'Data and resource files'.
    Salut

    Je profite de ce post pour dire que les chemins relatifs sous Vista ne fonctionnent pas. La solution que j'ai adopté (sous Delphi) est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractFilePath(Application.ExeName)+'moncheminrelatif\...\info.txt'
    Bonne chance

    Edit : j'avais pas regardé le lien

  7. #27
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    Application.exeName c'est le nom du projet compilé ?

    dans mon cas c'est ProjetJDR.exe , mais si je mets ça, il dit ne pas le connaitre

  8. #28
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Non Application.exeName c'est 'Application.exeName' en toutes lettres.

  9. #29
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    ben j'avais essayé et c'est pareil:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Const   
      PathM1: string = ExtractFilePath(Application.ExeName)+'datas\monsters\monster.dta';

  10. #30
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    C'est normal, tu ne peux pas appeler une fonction pour donner une valeur à une constante.

    Tu dois faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const
       PathM1: string = 'datas\monsters\monster.dta';
    Puis quand tu ouvres ton fichier un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      AssignFile(myFile, ExtractFilePath(Application.ExeName)+PathM1);
      Reset(myFile);
    Mais le mieux c'est d'écrire une fonction qui à partir d'un chemin relatif te donne un chemin absolu vers un fichier de donnée et de mettre cette fonction dans une unité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function PathTo(const DataName: String) : String;
    begin
      Result:=ExtractFilePath(Application.ExeName)+DataName;
    end;
    Comme ça quand tu as besoin de charger un fichier de donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      AssignFile(myFile, PathTo(PathM1) );
    Ensuite tu peux adapter ta fonction PathTo en fonction de l'OS (Windows, Linux, Mac OSX, ...).

  11. #31
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    mais quand tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function PathTo(const DataName: String) : String;
    begin
      Result:=ExtractFilePath(Application.ExeName)+DataName;
    end;
    tu fais exactement la même chose

    variable string := Extract... + PathRelatif

    pourtant quand je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AssignFile(Persos, ExtractFilePath(Application.ExeName)+PathTeam);
    et bien ça ne marche pas, il me dit ne pas connaitre Application

    j'ai du encore faire un truc tordu

  12. #32
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Application est déclaré dans l'unité Forms de la LCL donc tu doit avoir un 'uses ..., Forms, ...;' dans la ou les unité ou tu veux t'en servir.

  13. #33
    Membre confirmé Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Par défaut
    HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    bien je pense qu'il est temps de quitter ce sujet , pour éventuellement reprendre le fil initial du RPG, j'avoue avoir un peu décroché à cause de cette panne due à mon ignorance.

    pour moi ce sujet est RESOLU

  14. #34
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Salut

    Ptite info :
    Application.ExeName retourne le nom de l'exe complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'C:\Jesaispasquoi\ProjetJDR.exe'
    ExtractFilePath renvoie seulement le chemin de ce qui est passé en argument, soit
    Ensuite, il suffit de coller ca avec ton chemin relatif, et le tour est joué.

    Bonne chance

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [V8] 500 Internal Server Error Odoo sous Win7 et Windows server 2003 et 2008
    Par geniustep dans le forum Odoo (ex-OpenERP)
    Réponses: 10
    Dernier message: 19/02/2015, 17h17
  2. Sous windows XPE : xml parsing error encoding
    Par bru.antoine dans le forum Windows Embedded
    Réponses: 0
    Dernier message: 11/04/2013, 20h04
  3. Réponses: 1
    Dernier message: 10/09/2009, 19h31
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 13h15
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 18h45

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