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 :

Migrer un projet de J. Colibri : AV garanti à un endroit où ça ne devrait pas [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut Migrer un projet de J. Colibri : AV garanti à un endroit où ça ne devrait pas
    Bonjour,

    nouvelle semaine, nouveaux problèmes...

    Récupéré hier un projet de traitement graphique chez l'ami John (c'est kèk chose ses projets ! La quantité de fichiers pour faire un HelloWorld, tu te demandes... Plus la manière de nommer les choses, très particulière : faut_ s_'y_ faire_ ).

    Bref, je demande à Laz de me le convertir, il se loupe sur certains points qu'après examen je commente (genre les lignes en rapport avec l'impression bloquent la compil : on verra ça plus tard), et quand enfin je peux lancer le prog, ben ça loupe pas : AV

    Après enquête, il y a une blague dans FormCreate, et après enquête approfondie c'est "post sur le forum" parce que là, vous allez voir, c'est encore un truc de ouf'.

    Soit un objet déclaré ainsi (je mets juste le début, concerné au 1er chef) au tout début d'une unité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    unit u_c_display;
     
    {$MODE Delphi}
     
      interface
        uses SysUtils, Classes, u_c_basic_object, u_c_log;
     
        type c_display= class(c_basic_object)
                          public
                            m_do_display: Boolean;
                            m_indentation: Integer;
                            m_current_string: String;
                            m_c_strings: tStrings;
    et quelques lignes plus bas on trouve cette chose, appelée (à travers une avalanche d'appels intermédiaires [c'est du John]) depuis le FormCreate, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
          begin
            Inherited ;
     
            m_c_strings:= p_c_strings;
            m_do_display:= True; // <------- Fait planter sur SIGSEGV...
     
            m_c_log:= p_c_log;
          end; // create_display
    Vu, le commentaire de l'instruction qui affecte True au boolean ? Que si je commente cette ligne ça roule ?
    p_c_strings correspond à un memo.Lines, et p_c_log est passé comme nil.

    Et sous Windows c'est quelque chose encore dans la même unité mais plus loin que le Create qui met la pagaille :
    Nom : av_colibri.png
Affichages : 252
Taille : 15,4 Ko

    Et la procédure g_c_display.display se contente d'afficher du texte si m_do_display est à true.

    Une idée sur ce que je pourrais bien faire pour avancer ?
    Une chose très curieuse, c'est que les messages d'erreur n'arrivent pas instantanément, il leur faut bien 5 à 10 secondes (si si !) même quand ils se suivent ; très bizarre...

    Ah, le lien de son projet.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut je viens de regarder vite fait avant de retourner au boulot. ce qui me moi me "choque un peu" c'est que dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unit u_c_display;
      interface
        uses SysUtils, Classes, u_c_basic_object, u_c_log;
     
        type c_display= class(c_basic_object)
    ...
    "c_display" depend donc de l'unité unité u_c_basic_object et que dans celle ci on ait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      implementation
        uses u_c_display;
    c'est un peu "une référence circulaire" qui passe peut-être sous "Delphi" mais plante sous Lazarus. Pas le temps de tester, mais si en remplaçant "type c_display= class(c_basic_object)" par "c_display= class" tout simplement ça fonctionne ? mais bon pour ton projet je penses pas que tu ais vraiment besoins de ces 2 unités
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    c'est un peu "une référence circulaire" qui passe peut-être sous "Delphi" mais plante sous Lazarus.
    C'est l'impression que j'ai eue aussi, mais je n'y croyais pas : pas J.C. quand même, pas lui ! Moi je veux bien, mais, John Cé, quand même, non, quoi !

    Citation Envoyé par BeanzMaster Voir le message
    Pas le temps de tester, mais si en remplaçant "type c_display= class(c_basic_object)" par "c_display= class" tout simplement ça fonctionne ?
    Sans le type devant ? Ça ne compile pas, et avec, ça plante tout aussi violemment.

    Citation Envoyé par BeanzMaster Voir le message
    mais bon pour ton projet je penses pas que tu ais vraiment besoins de ces 2 unités
    2 unités ? Il n'y en a qu'une, il me semble, par contre ce c_display est utilisé au moins dans 5 unités, alors l'enlever, c'est comme enlever une carte tout en bas du château !

    Mais merci quand même d'avoir jeté un œil et un début de solution.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Il n'y a pas référence circulaire du fait des uses en section interface d'une unité et implementation de l'autre.

    Je me posais par contre la question dans le constructeur d'un inherited Create(pName); au lieu d'un inherited sec, ne renvoyant à rien (pas de méthode ancestrale) sinon au type TObject. Mais sans y croire pour résoudre le problème.
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Yop !
    Citation Envoyé par tourlourou Voir le message
    Je me posais par contre la question dans le constructeur d'un inherited Create(pName); au lieu d'un inherited sec, ne renvoyant à rien (pas de méthode ancestrale) sinon au type TObject. Mais sans y croire pour résoudre le problème.
    Comme ça, tu veux dire ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
          begin
            //Inherited ;
            inherited Create(p_name);
            m_c_strings:= p_c_strings;
            m_do_display:= True;
     
            m_c_log:= p_c_log;
          end; // create_display
    Le compilo l'est pas content
    u_c_display.pas(84,33) Error: Wrong number of parameters specified for call to "Create"
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Bah oui elle s'appelle create_basic_object(p_name: String) !
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bah oui elle s'appelle create_basic_object(p_name: String) !
    Ah, t'as dû confondre avec create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log); Virtual; et moi je ne l'ai pas vu non plus

    Pas simples pas clairs, hein, les codes à J.C.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Bonjour,

    J'ai fait un petit test simplifié (mais je dois m'absenter aujourd'hui) et ça ne plante pas si j'oublie toute la machinerie derrière (je n'ai même pas mis de destructeur tellement je suis pressé ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    type
     
      { TDisplay }
     
      TDisplay = class
         m_do_display: Boolean;
         m_indentation: Integer;
         m_current_string: String;
         m_c_strings: tStrings;
         constructor  create_display(p_name: String; p_c_strings: tStrings);
      end;
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
        ADisplay: TDisplay;
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ADisplay := TDisplay.create_display('coucou', memo1.Lines);
    end;
     
    { TDisplay }
     
    constructor TDisplay.create_display(p_name: String; p_c_strings: tStrings);
    begin
      inherited ;
      m_c_strings:= p_c_strings;
      m_do_display:= True; // <------- NE fait PAS planter sur SIGSEGV...
    end;
     
    end.
    Je soupçonne la création d'être mal ficelée, mais je regarderai ça plus tard.
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonjour,

    et merci pour ton petit test. De mon côté, j'ai suivi la piste :

    Dans FormCreate, la 1re instruction c'est
    initialize_display(Memo1.Lines); qui se trouve dans u_c_display.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        procedure initialize_display(p_c_strings: tStrings);
          begin
            if Assigned(g_c_display)
              then g_c_display.Free;
     
            g_c_display:= c_display.create_display('display', p_c_strings, Nil);
          end; // initialize_display
    et ce c_display.create_display se trouve un peu plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
          begin
            Inherited ;
     
            m_c_strings:= p_c_strings;
            m_do_display:= True;  // c'est ici que ça plante
     
            m_c_log:= p_c_log;
          end; // create_display
    Le c_display, quant à lui, c'est type c_display= class(c_basic_object) et c_basic_object est déclaré dans u_c_basic_object.pas comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    unit u_c_basic_object;
      interface
     
        type c_basic_object= class
                               m_name: String;
                               destructor Destroy; Override;
                               constructor create_basic_object(p_name: String); Virtual;
                               constructor construct_empty;
                               procedure display_abstract(p_texte: string);
                     end;
     
      implementation
        uses u_c_display;
     
        constructor c_basic_object.create_basic_object(p_name: String);
          begin
            m_name:= p_name;
          end; // create_basic_object
     
        constructor c_basic_object.construct_empty;
          begin
          end; // construct_empty
     
        procedure c_basic_object.display_abstract(p_texte: string);
          begin
            display_bug_halt(m_name+ ' '+ p_texte+ ': abstract procedure');
          end; // display_abstract
     
        destructor c_basic_object.Destroy;
          begin
          end; // Destroy
     
        begin // u_c_basic_object
        end. // u_c_basic_object
    Oui, tout est là, une unité entière juste pour ça...

    Tout ça me dépasse, merci pour votre implication
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut question bête mais "g_c_display" il est créé quand et ou ?
    car "c_display.create_display('display', p_c_strings, Nil);" pour moi c'est pas un "constructor" même si il est déclarer comme telle dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
          begin
            Inherited ;
     
            m_c_strings:= p_c_strings;
            m_do_display:= True;  // c'est ici que ça plante
     
            m_c_log:= p_c_log;
          end; // create_display
    "inherited" il appel qui dans c_basic_object ????? on dirait simplement que l'objet "c_display" n'est pas instancié correctement d'ou l'erreur. A mon avis il serais judicieux de travailler sur le "constructor" et au lieu d'avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        type c_basic_object= class
                               m_name: String;
                               destructor Destroy; Override;
                               constructor create_basic_object(p_name: String); Virtual;
                               constructor construct_empty;
                               procedure display_abstract(p_texte: string);
                     end;
    on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        type c_basic_object= class
                               m_name: String;
                               destructor Destroy; Override;
                               constructor create(p_name: String); //override;
                               procedure display_abstract(p_texte: string);
                     end;
    Et dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
        type c_display= class(c_basic_object)
                          public
                            m_do_display: Boolean;
                            m_indentation: Integer;
                            m_current_string: String;
                            m_c_strings: tStrings;
     
                            m_c_log: c_log;
     
                            Constructor create(p_name: String; p_c_strings: tStrings;
                                p_c_log: c_log); Override;
     
                            procedure clear_display;
     
                            procedure display_string(p_text: String);
                            procedure display(p_text: String);
                            procedure display_line;
     
                            procedure display_strings(p_c_strings: tStrings);
     
                            function f_save_display: Boolean;
                            procedure restore_display(p_display: Boolean);
     
                            procedure stop(p_text: String);
                            procedure display_bug(p_text: String);
                            procedure display_bug_stop(p_text: String);
                            procedure display_bug_halt(p_text: String);
     
                            Destructor Destroy; Override;
                        end;
     
    Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
          begin
            Inherited Create(p_name);
     
            m_c_strings:= p_c_strings;
            m_do_display:= True;  // c'est ici que ça plante
     
            m_c_log:= p_c_log;
          end; // create_display
    Par trop le temps de regarder en détails, mais à mon avis c'est la que le bas blesse
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Truc chelou je viens de vite fais de convertir le projet à JC, juste retirer le "DirectoryListBox" je compil et la pas souci j'ai

    Nom : jctest1.jpg
Affichages : 212
Taille : 10,2 Ko


    Pas d'erreur à la compilation. par contre l'icone du progamme n'apparait pas encore dans la barre des taches et lorsque je clique sur ok le prog ne se ferme pas.

    Le dossier "log" n'existe pas dans l'archive que nini et hop "nouveau dossier" je recompile et la

    Nom : jctest2.jpg
Affichages : 208
Taille : 16,2 Ko
    Nom : jctest3.jpg
Affichages : 215
Taille : 67,0 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        procedure display(p_text: String);
          begin
            if Assigned(g_c_display)
              then g_c_display.display(p_text); // Ligne 251 c'est ici donc l'erreur est dans C_display
          end; // display

    je clique sur "OK" nouvelle fenêtre

    Nom : jctest4.jpg
Affichages : 210
Taille : 15,9 Ko
    et c'est tout

    apres quelque F8 et MAJ+F8 la 1ere erreur apparait ici "Application.Run; " plus le temps de debogguer plus loin je dois encore retourner au taf

    Voili voilu en esperant que ca aidera.....un peu

    pour info cf mon message précédent c'est sur il y a un objet qui est mal instancié :


    http://www.freepascal.org/docs-html/user/userap4.html

    Runtime 210 Object not initialized
    When compiled with range checking on, a program will report this error if you call a virtual method without having called its object’s constructor.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut question bête mais "g_c_display" il est créé quand et ou ?
    car "c_display.create_display('display', p_c_strings, Nil);" pour moi c'est pas un "constructor" même si il est déclaré comme tel dans [...]
    Réponse :
    Déclaré dans u_c_display :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        // -- THE global display, used by the non-object calls
        var g_c_display: c_display= Nil;
    il est créé là (même unité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        procedure initialize_display(p_c_strings: tStrings);
          begin
            if Assigned(g_c_display)
              then g_c_display.Free;
     
            g_c_display:= c_display.create_display('display', p_c_strings, Nil);
          end; // initialize_display
    qui est appelé par FormCreate, et voilà.

    Il est utilisé 17 fois, une fois comme ci-dessus et 16 fois comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        procedure start_display;
          begin
            if Assigned(g_c_display)
              then g_c_display.m_do_display := True;
          end; // start_display
    les 15 autres fois sont + ou - identiques

    Quant au reste, remplacement de create_display par create, le compilateur ne retrouve pas ses petits, et me jette une erreur à la figure, genre le constructor has no member blabla...

    Citation Envoyé par BeanzMaster Voir le message
    Truc chelou je viens vite fait de convertir le projet à JC, juste retirer le "DirectoryListBox" je compil et la pas souci j'ai
    [--snip--]
    apres quelque F8 et MAJ+F8 la 1ere erreur apparait ici "Application.Run; " plus le temps de debogguer plus loin je dois encore retourner au taf
    Bienvenue au club, j'ai eu exactement les mêmes...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    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 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    type
    c_display= class(c_basic_object)
    public
    ...
    Constructor create(p_name: String; p_c_strings: tStrings; p_c_log: c_log); Override;
    ...
    end;
    ....
    Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
    il n'y a vraiment rien qui vous choque ?
    parce que pour moi c'est plantage assuré ^^
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     type
    c_display= class(c_basic_object)
    public
    ...
    Constructor create(p_name: String; p_c_strings: tStrings; p_c_log: c_log); Override;
    ...
    end;
    ....
    Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
    il n'y a vraiment rien qui vous choque ?
    parce que pour moi c'est plantage assuré ^^
    T'as vu ce que j'ai écrit cet après-midi ? Tiens, je remets :
    Citation Envoyé par Jipété Voir le message
    Quant au reste, remplacement de create_display par create, le compilateur ne retrouve pas ses petits, et me jette une erreur à la figure, genre le constructor has no member blabla...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir, bonsoir, piouf je rentre du boulot il y a 1h, me prend une bonne douche et hop je me remet sur ce petit truc.

    1 - Je remplace les create_????? comme je le disais dans mon précédent post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        type c_basic_object= class
                               m_name: String;
     
                               destructor Destroy; Override;
     
    //                           constructor create_basic_object(p_name: String); Virtual;
                                constructor Create(p_name: String);//virtual; 
     type
    c_display= class(c_basic_object)
    public
    ...
    Constructor create(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
    ...
    end;
    ...
    //    Constructor c_display.create_display(p_name: String; p_c_strings: tStrings; p_c_log: c_log);
         Constructor c_display.create(p_name: String; p_c_strings: tStringlist; p_c_log: c_log);
          begin
            Inherited Create(p_name);
     
            m_c_strings := p_c_strings;
            m_do_display:= True;
     
            m_c_log:= p_c_log;
          end; // create_display
    ainsi que tous les appels de "create_basic_object" par "create" jusque la pas de soucis ca compile et paf toujours ce jolie runtime 210

    Je progresse un peu, je vais voir dans le dossier log, ok le fichier est bien créé et rempli. Je vais sur la form et je me met sur l'onglet "display_" je lance le bouzin et la miracle ca fonctionne et le log est bien affiché
    Je clique sur le bouton "Clear" et la runtime 210 . je retourne dans l'unité "C_display " je regarde un peu plus dans les fonctions et la je m'aperçois que c'est la variable "m_c_strings: tStrings; " qui lève l'exception.

    Il semblerai que "m_c_strings" ne soit plus "accessible" je met "accessible"

    car si on fait, dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        procedure c_display.clear_display;
          begin
     
            if assigned(m_c_strings) then
            begin
               showmessage('Log cleared');     //---> Ici pas de soucis notre message est bien affiché       
              //m_c_strings.Clear; -------------------> C'est la que ca plante, c'est comme si "m_c_strings" avait disparu comme par magie, Une erreur d'adressage au niveau compilation ?
     
            end
            else
            begin
               showmessage('no Log Assigned');
            end;
          end; // clear_display
    et dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     procedure c_display.display(p_text: String);
          var l_text: String;
              l_length: Integer;
          begin
            if not m_do_display
              then exit;
     
            l_length:= Length(p_text);
            if (l_length> 0) and (p_text[1]= '<')
              then begin
                  dec(m_indentation, 2);
                  if m_indentation< 0
                    then begin
                        display('*** negative indent');
                        m_indentation:= 0;
                      end;
                end;
     
            // -- if no Write, add indentation
            if m_current_string= ''
              then l_text:= f_spaces(m_indentation)
              else l_text:= '';
     
            // -- compute the indentation, the current strings, and this parameter
            l_text:= l_text+ m_current_string+ p_text;
     
            // -- add the result to the tStrings
            Showmessage('c_display.Display : '+l_text); // ---> la pas de soucis notre boite s'affiche et le programme fonctionne et le fichier log est correctement écrit (cf ci-dessous)
            //m_c_strings.Add(l_text);  //------> c'est la que ca plante
     
            // -- flush to the log
            if Assigned(m_c_log)
              then m_c_log.write_line(l_text);
     
            if (l_length> 0) and (p_text[1]= '>')
              then inc(m_indentation, 2);
     
            m_current_string:= '';
          end; // display
    // -- D:\Documents\projets\Lazarus\Test\colibri\graphic\color_correction\log/log_posteffect.log 26/10/2016 00:22:35

    5 94 764
    5 76 636

    104 193 764
    5 76 636

    203 292 764
    5 76 636

    5 94 764
    86 157 636

    104 193 764
    86 157 636

    203 292 764
    86 157 636

    5 94 764
    167 238 636

    104 193 764
    167 238 636

    203 292 764
    167 238 636
    repaint
    create_bitmap

    et voila ce que ça donne
    en ne commentant pas la ligne " //m_c_strings.Add(l_text); //------> c'est la que ca plante"

    Nom : jctest5.jpg
Affichages : 197
Taille : 32,1 Ko

    mais des que l'on se trouve sur le 1er onglet ou si on clique sur le bouton "Clear" ça plante.

    Donc, bug de FPC sur les TStrings ici, ou bien serait-il mal utilisé, ici pour FPC ???? c'est franchement bizarre car ca fonctionne bien au début

    TStrings étant une classe abstraite cf : http://lazarus-ccr.sourceforge.net/d.../tstrings.html. En remplaçant ce TStrings par TStringList cela pourra peux être résoudre le problème.

    voila ca sera tout pour ce soir
    Je pense qu'on n'a pas fini de rire avec cet exemple de JC ! qui est très intéressant dans tous les cas.

    Bonne nuit
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  16. #16
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut JP & BeanzMaster.

    J'ai fait un petit test en rassemblant le code utile pour c_display dans l'unité principale de mon prog.
    J'ai ajouté une procédure toute simple pour le display : elle demande d'ajouter dans AText (un deuxième Memo) le contenu de m_c_strings.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure c_display.Display(AText: TStrings);
    var
      i: integer;
    begin
      for i:= 0 to m_c_strings.count - 1 do
         AText.Add(m_c_strings[i]);
    end;
    et dans Form1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      initialize_display(Memo1.Lines);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      g_c_display.display(memo2.lines);
    end;
    Le FormCreate ne pose pas de problèmes.
    Mais le clic sur button1 déclenche l'exception SIGSEGV !

    Je rejoins ici ce que dit BeanzMaster. Le problème est uniquement lié à m_c_strings qui n'est plus "accessible".
    En fait, en écrivant m_c_strings := p_c_strings , il n'y a aucune création d'objet, m_c_strings reçoit uniquement l'adresse du TStrings de Memo1.
    J'ai donc pensé à un problème de synchronisation dans l'ordre de création.
    En plaçant le initialize_display dans l'événement OnActivate de Form1 --> plus aucun problème avec la procédure Display.
    Et si je modifie Memo1, m_c_strings va prendre en compte le nouveau contenu de Memo1 puisque ce n'est qu'un pointeur.

    J'espère que J.C. ne sera pas vexé si je dis que j'aurais codé g_C_display d'une toute autre manière.

    Cordialement
    Thierry

    PS : c'est nouveau dans le forum de ne plus afficher qu'un seul message, les autres étant dans un arbre ? Je n'aime pas du tout cela.

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonjour,

    et grand merci pour ces tests qui ont bien dû te prendre la tête et du temps...

    Je reviens juste sur ce point, qui me fait penser à des choses déjà vécues, genre tu testes "if assigned" et le machin ne se comporte pas comme son nom l'indique
    Citation Envoyé par BeanzMaster Voir le message
    Il semblerait que "m_c_strings" ne soit plus "accessible" je met "accessible"

    car si on fait, dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        procedure c_display.clear_display;
          begin
     
            if assigned(m_c_strings) then
            begin
               showmessage('Log cleared');     //---> Ici pas de soucis notre message est bien affiché       
              //m_c_strings.Clear; -------------------> C'est la que ca plante, c'est comme si "m_c_strings" avait disparu comme par magie, Une erreur d'adressage au niveau compilation ?
    Donc en gros ce "if assigned" n'est pas fiable et il faudrait alors le remplacer par autre chose, et partout !
    Ben on n'est pas rendu, hein...

    Citation Envoyé par BeanzMaster Voir le message
    Je pense qu'on n'a pas fini de rire avec cet exemple de JC ! qui est très intéressant dans tous les cas.
    Comme tu dis, oui, sauf que moi je ris jaune.

    Et j'ai l'impression, loin au fond de ma mémoire, d'avoir déjà lu des choses à propos de ce fourbe assigned dans le forum Delphi.

    PS : je viens de retrouver ce que j'avais noté il y a quelque temps :
    Dans mon FormDestroy j'ai mis if Assigned(UnObjet) then UnObjet.Free; et rien d'anormal jusque là, enfin, il me semble.
    Ou plutôt, il me semblait...

    Parce que suite à une réorganisation de code, j'ai dupliqué ailleurs cette ligne qui tue et c'est le cas de le dire car jusqu'à ce que je m'en rende compte, je me demandais pourquoi je me prenais un AV à la fermeture de l'application.
    Jusqu'à ce que je supprime la ligne dans FormDestroy.

    Donc deux possibilités :
    - ou bien UnObjet.Free fait mal son boulot dans le sens où l'objet n'est qu'à moitié libéré, ce qui permet une seconde exécution ou plutôt tentative d'exécution se soldant par un AV,
    - ou bien c'est if Assigned(UnObjet) qui foire en détectant quand même un objet libéré.
    On en est là. J'aime bien la dernière ligne de ma citation, qui recoupe ce que tu as vécu cette nuit...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    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 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    il arrive qu'a la libération d'un objet la valeur ne soit pas complètement "nettoyé"
    car l'objet en question a redéfini le destroy mais a oublié de faire un inherited pour que le destroy libère correctement la mémoire
    pour palier a ce genre de soucis après le free on affecte nil a la variable

    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Ah, croisement de réponses, mais je préfère sur-poster plutôt qu'éditer mon post précédent.

    Citation Envoyé par ThWilliam Voir le message
    J'ai donc pensé à un problème de synchronisation dans l'ordre de création.
    En plaçant le initialize_display dans l'événement OnActivate de Form1 --> plus aucun problème avec la procédure Display.

    Bien vu, bien joué !

    Je vais enfin pouvoir trafiquer avec ses curseurs, encore bravo et merci.

    Citation Envoyé par ThWilliam Voir le message
    J'espère que J.C. ne sera pas vexé si je dis que j'aurais codé g_C_display d'une toute autre manière.


    Citation Envoyé par ThWilliam Voir le message
    PS : c'est nouveau dans le forum de ne plus afficher qu'un seul message, les autres étant dans un arbre ? Je n'aime pas du tout cela.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Je vais enfin pouvoir trafiquer avec ses curseurs, encore bravo et merci.
    Mais pas avec ses fichiers...

    Après avoir adapté cette histoire de Directories dans le FormCreate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ////        set_directory_listbox_directory(DirectoryListBox1, k_path);
            FileListBox1.Directory := k_path;
    je peux enfin voir ses fichiers, comme dans l'article sur le site (lien donné dans le 1er post), enfin, les deux premiers, car pour le 3e la saga continue :

    Nom : erreur_escalier.png
Affichages : 200
Taille : 18,9 Ko


    Et si je clique sur "continuer", j'ai le même avec la précision "Range Check Error".

    Tant que je ne touche pas au 3e je peux passer du 1er au 2e et retour plusieurs fois sans souci, donc il y aurait un souci avec ce 3e ?
    Essai d'ouverture avec The Gimp --> RAS, pas de message, rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            For l_y:= l_start_y to l_end_y do
              for l_x:= l_start_x to l_end_x do
                with m_oa_hsv_lines[l_y, l_y] do
                begin
                  m_saturation_min:= Min(m_saturation_min, m_saturation);
                  m_saturation_max:= Max(m_saturation_max, m_saturation);
     
                  m_intensity_min:= Min(m_intensity_min, m_intensity);
                  m_intensity_max:= Max(m_intensity_max, m_intensity);
                end; // for l_x
    La ligne 560 c'est celle qui commence avec with...

    J'ai donc essayé de rajouter -1 après l_end_x et _y aux deux lignes qui précèdent, même résultat.
    Et si je rajoute le -1 après l_start_x et _y alors c'est dès le 1er fichier qu'il y a l'erreur...

    Encore un mystère...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Migration] Migrer un projet de cvs a subversion
    Par Anubis dans le forum Subversion
    Réponses: 1
    Dernier message: 14/02/2007, 18h28
  2. Migrer un projet W10 HF vers SQLServer Express : Possible ?
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 1
    Dernier message: 02/12/2006, 16h45
  3. Est ce possible de migrer mon projet vers dev-cpp.
    Par thecrafty dans le forum Dev-C++
    Réponses: 1
    Dernier message: 23/07/2006, 16h43
  4. Réponses: 4
    Dernier message: 01/07/2006, 15h07
  5. Migrer un projet VBA Excel vers VB
    Par Phoon0 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/10/2005, 12h09

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