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 :

J'ai deux ListView et l'une d'elles ne fonctionne pas [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut J'ai deux ListView et l'une d'elles ne fonctionne pas
    Bonjour,

    Eternel débutant je suis et apprécie vraiment Lazarus qui est gratuit.
    Mon problème est le suivant et sans doute, je ne cherche pas où il faut, alors si quelqu'un veut bien me dépanner!

    Je fais un programme de budgétisation pour moi et une association.
    Je travaille sur deux ListView différentes parce que je ne sais pas créer les colonnes de manière simple.

    Voici des portions d'images en cause :
    Nom : Aide8.jpg
Affichages : 201
Taille : 45,1 Ko

    Le Bouton du dessus est un commutateur qui bascule sur l'une des deux listView.
    La première ListView nommée ListViewBud (image du haut) affiche les enregistrements d'une liste de Budgets dont la structure est TxtFile
    La seconde ListView nommée ListViewEche (image du Bas) affiche quelques champs d'une structure de fichiers typé.

    Dès que le bouton commutateur demande l'un des quatres tableaux de base, l'une ou l'autre des ListView est utilisée par les procédures et s'affiche au même endroit, l'autre étant rendue invisible...
    procedure TForm1.Update_AffichageEcheances(Const aFicEche : String);
    procedure TForm1.Update_AffichageListeBudgets(Const aFicBud : String);

    Voici le code des deux fonctions:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    {--- Met à jour l'affichage des échéances -------------------------------------}
    procedure TForm1.Update_AffichageEcheances(Const aFicEche : String);
      var  Item : TListItem;
           n    : integer;
           b    : TFicheEche;
           rp   : String;
    begin
      Try
        AssignFile(fEche,aFicEche);
        Reset(fEche);
        n := 0;
        ListViewEche.Clear;
        while Not Eof(fEche) do
        begin
          inc(n);
          Read(fEche,b);
          if b.Payee then RP := ByteToBoolSTR(1,trbOuiNon)
                     else RP := ByteToBoolSTR(0,trbOuiNon);
          With ListViewEche do
          begin
            Inc(FItemIndex);
            Item := ListViewEche.Items.Add;
            Item.Caption := Format('%d', [b.Index]);
            Item.SubItems.Add(b.NomEche);
            Item.SubItems.Add(floattostrF(b.Montant,ffcurrency,5,2));
            Item.SubItems.Add(DateTostr(b.DateEche));
            Item.SubItems.Add(rp);
          end;
        end;
        LbEche.Caption := 'Liste des '+inttostr(NbFichesEche)+' échéances à budgéter';
      finally
        CloseFile(fEche);
      end;
    end;
     
    {--- Affiche la Liste des Budgets définis -------------------------------------}
    procedure TForm1.Update_AffichageListeBudgets(Const aFicBud : String);
     var  Item : TListItem;
          n    : integer;
          b    : String;
          fBud : TextFile;
    begin
      Try
        AssignFile(fBud,aFicBud);
        Reset(fBud);
        n := 0;
        while Not Eof(fBud) do
        begin
          inc(n);
          Readln(fBud,b);
          With ListViewBud do
          begin
            Inc(FItemIndex);
            Item := ListViewEche.Items.Add;
            Item.Caption := Format('%d', [n]);
            Item.SubItems.Add(b);
          end;
        end;
        LbEche.Caption := 'Liste des '+inttostr(n)+' catégories de budgets prévus';
      finally
        CloseFile(fBud);
      end
    end;
    Problème:
    L'affichage du Fichier Texte des Budgets ne s'affiche pas dans la ListWiew, alors que le code est similaire... J'ai pensé qu'en jouant sur les propriétés visible, enabled ou CanFocus (innaccessible) le problème serait résilu. Mais non
    Je ne comprends pas!
    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Bonjour,
    3 pistes à étudier :
    - Nom du fichier invalide,
    - Format du fichier invalide,
    - Une exception survient avant l'ajout dans le tableau
    Dans les 3 cas, le point d'arrêt en mode debug est ton meilleur ami, afin de confirmer ou infirmer ces hypothèses

  3. #3
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Citation Envoyé par nikoko34 Voir le message
    Bonjour,
    3 pistes à étudier :
    - Nom du fichier invalide,
    - Format du fichier invalide,
    - Une exception survient avant l'ajout dans le tableau
    Dans les 3 cas, le point d'arrêt en mode debug est ton meilleur ami, afin de confirmer ou infirmer ces hypothèses
    Merci nikoko pour ta réponse...

    Tes deux premières hypothèses ont été vérifiées.
    Je n'ai sans doute pas étudié à fond la troisième. Au lieu des try finally, je devrais peut-être mettre des try Except. Le problème, c'est que j'ai aucune idée du type d'erreur à chercher. Je pense à priori que le programme n'identifie pas correctement la 2ème liste View (qui a un nom différent) qui ne reçoit pas la focalisation à cause peut-être des codes qui rendent visible ou pas la bonne liste View. Pourtant la tableau en question apparait correctement avec le bouton...
    Je vais essayer de reproduire en miniature sur un projet exemple, le processus.

    Une autre solution serait de faire par programme le changement des formats de colonnes sur la même Liste View, mais j'ai peur que ce soit un peu lourd dynamiquement et je ne me souviens plus comment je faisiais sous Delphi...
    Bonne soirée
    A+

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Hello,
    pourquoi ne pas travailler avec une base de données de type sqlite et des composants TdbGrid ?
    Si tu as des données non confidentielles pour tes deux listes en format csv peux tu les mettre en pièces jointes pour faire un essai ?
    Ami calmant, J.P

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut Sans Dessus dessous
    Bonjour,

    Une solution simple serait de placer les deux tableaux sur deux pages d'un TPageControl et d'activer l'un ou l'autre des onglets selon besoin.

    Cela n'explique pas le problème rencontré. Je chercherais du côté de l'ordre z. Il est possible que le seul tableau qui reste lisible est celui d'ordre z supérieur. Pour s'en assurer, il suffirait de remonter l'ordre du tableau en défaut (clic droit dans l'éditeur de fiche et ordre z). Si c'est la bonne explication, le problème devrait avoir changé de camp.

    Salutation

  6. #6
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut Fichier Zip du problème
    Merci jurassik et Guesset pour vos réponses...

    @ Jurassik : Les bases de données, j'ai abandonné, il faut apprendre un autre langage, avoir des identifiants et mots de passe en plus. C'est un petit projet privé sans ambition mais qui est nécessaire pour nous...
    SqLite m'avait attiré à une époque mais là, ça ne justifie pas une base de données car le clou du programme est un algorithme qui gère automatiquement les abonnements et les budgétisations à chaque lancement d'application... C'est ce qui me plait dans la programmation, algorithmique.

    @ Guesset, oui, c'est une idée, le TPageControl, mais je suis de ton avis, le problème de la focalisation (ou d'ordre) ne relève peut-être pas du problème rencontré. Je vais l'ajouter quand même à mes essais.

    En attendant, je vous mets le fichier test simplifié qui montre le problème que j'ai dans mon appli. Pour mettre en évidence le problème, j'alterne l'affectation d'une ListView différente (LVEche <=> LVBud)à chaque clic sur le bouton. Le Budget ne devrait pas apparaître sur la première ListView LVEche.

    Je vous tiens au courant
    merci
    Fichiers attachés Fichiers attachés

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Hello,
    tu utilises la ListView des échéances dans la procédure de mise à jour des budgets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item := ListViewEche.Items.Add;
    Il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item := ListViewBud.Items.Add;
    Ami calmant, J.P

  8. #8
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Il y a également :
    - Dans Update_AffichageListeBudgets on mélange une actualisation de lVBud avec LVEche. Ca sent le copier-coller intempestif.
    - Pourquoi les lvXXX.Clear ne sont pas dans les Update_xxx de même que la visibilité (on cache tout le monde avant l'appel) ?
    - Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if vComAffiche = 1 then begin
        LVBud.Visible  := True;
        LVEche.Visible := False;
      end else begin
        LVBud.Visible  := False;
        LVEche.Visible := True;
      end;
    - Même s'il serait préférable, car plus adaptable, de cacher tout le mode, et de laisser aux procédures d'affichage spécialisées le soin de rendre visible leur actualisation, écrire plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       LVBud.Visible  :=  vComAffiche = 1;
       LVEche.Visible := not LVBud.Visible;
    - Si llVBud ne sert pas qu'à afficher les budgets, il serait opportun de changer son nom en lvSingle par exemple. Il est toujours dangereux de garder un nom par destination (le budget) alors que son but a changé (souvent parce que le développeur a élargi son usage entre temps).
    - Bizarre, les copies d'écran montrent un montant avec des centimes alors que le record déclare les montants comme des entiers.
    - L'usage de Format est très pratique dans les cas complexes, mais en terme de performances, il est préférable d'utiliser les IntToStr (et autres) pour les cas simples. Ainsi Format('%d', [n]) devient IntToStr(n).
    - Enfin, comme jurassic pork l'a mentionné, l'usage d'une base de données serait bienvenue.


    Salutations

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Ainsi Format('%d', [n]) devient IntToStr(n).
    ou même n.ToString grâce aux fonctions helpers.
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Hello,
    Citation Envoyé par Jlmat Voir le message
    @ Jurassik : Les bases de données, j'ai abandonné, il faut apprendre un autre langage, avoir des identifiants et mots de passe en plus. C'est un petit projet privé sans ambition mais qui est nécessaire pour nous.
    Ben non utiliser Sqlite avec Lazarus c'est pas si difficile que cela : Pas besoin d'identifiant et de mot de passe et il n'y a qu'un seul fichier. Avec les composants Lazarus lazsqldb la gestion dans Lazarus est facile. Sqlite c'est pas une grosse installation et on peut l'utiliser en mettant sa dll dans le répertoire de son exécutable.

    Exemple d'utilisation :
    Nom : LazSqlite.gif
Affichages : 112
Taille : 351,9 Ko
    Pour faire cela 100 lignes de code ( 40 lignes de procédures seulement)

    et voici le script sql de création des tables de la base de données sqlite, et de peuplement de données :
    Code SQL : 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
    BEGIN TRANSACTION;
    CREATE TABLE IF NOT EXISTS "Échéance" (
        "Index"    INTEGER UNIQUE,
        "Désignation"    VARCHAR(50) UNIQUE,
        "Montant"    REAL,
        "Échéance"    DATE,
        "Payé"    INTEGER,
        PRIMARY KEY("Index" AUTOINCREMENT)
    );
    CREATE TABLE IF NOT EXISTS "Budget" (
        "Index"    INTEGER UNIQUE,
        "Nom"    VARCHAR(50) UNIQUE,
        PRIMARY KEY("Index" AUTOINCREMENT)
    );
    INSERT INTO "Échéance" VALUES (1,'AAAaaaaa',2000.5,2459950.5,-1);
    INSERT INTO "Échéance" VALUES (2,'Report Dette BBBbbbbb',100.65,2460329.5,0);
    INSERT INTO "Échéance" VALUES (3,'BBBbbbbb',100.65,2459139.5,0);
    INSERT INTO "Échéance" VALUES (4,'Report Dette DDDddddd',100.65,2460329.5,0);
    INSERT INTO "Échéance" VALUES (5,'DDDddddd',100.65,2459139.5,0);
    INSERT INTO "Échéance" VALUES (6,'Report Dette EEEeeeee',100.65,2460329.5,0);
    INSERT INTO "Échéance" VALUES (7,'EEEeeeee',100.65,2459953.5,0);
    INSERT INTO "Échéance" VALUES (8,'Report Dette FFFfffff',100.65,2460329.5,0);
    INSERT INTO "Échéance" VALUES (9,'FFFfffff',100.65,2459953.5,0);
    INSERT INTO "Échéance" VALUES (10,'CCCccccc',20000.32,2458885.5,-1);
    INSERT INTO "Échéance" VALUES (11,'GGGggggg',145.34,2459312.5,-1);
    INSERT INTO "Budget" VALUES (1,'PosteBud_1');
    INSERT INTO "Budget" VALUES (2,'PosteBud_2');
    INSERT INTO "Budget" VALUES (3,'PosteBud_3');
    INSERT INTO "Budget" VALUES (4,'PosteBud_4');
    INSERT INTO "Budget" VALUES (5,'PosteBud_5');
    COMMIT;

    Ami calmant, J.P

  11. #11
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,

    Ben non utiliser Sqlite avec Lazarus c'est pas si difficile que cela : Pas besoin d'identifiant et de mot de passe et il n'y a qu'un seul fichier. Avec les composants Lazarus lazsqldb la gestion dans Lazarus est facile. Sqlite c'est pas une grosse installation et on peut l'utiliser en mettant sa dll dans le répertoire de son exécutable.
    Ouha! Jurassic , j'allais mettre résolu sur cette discussion, mais du coup, je vais sans doute me réintéresser aux Bases de données. J'avais un mauvais souvenir de discussion que j'avais en Dephi 10...

    Finalement, je vais mettre quand même résolu, car j'avais une autre erreur que j'ai retrouvée dans une grande procédure algorithmique sur des manipulations de dates.
    Mais si j'ai des questions sur le code que tu donnes ici, je reviendrais ici. Sinon pour d'autres questions sur SqLite j'ouvrirais une autre discussion.
    Je vais donc essayer d'adapter ton code à mon appli pour voir si j'ai tout à refaire.

    Tu devrais publier le code de ton exemple, ça aiderait beaucoup de débutants, moi y compris d'ailleurs car fait longtemps que je n'ai pas programmé des bases de données...

    Merci

  12. #12
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Je mets en pièce jointe le projet pour que cela profite à tout le monde.
    La base de données c'est le fichier BudgetSqlite.db3
    Sous Linux dans le composant Sqlite3Connection1 il faut certainement changer le chemin à la base de données : .\BudgetSqlite.db3 -> ./BudgetSqlite.db3
    Il faut que ce soit la version de sqlite3 correspondant à l'exécutable généré qui soit installée (64 bits ou 32 bits). La dll de l'installation de sqlite3 mis dans le répertoire de l'exécutable généré normalement suffit pour faire fonctionner cet exécutable sans installation de sqlite3.
    Il n' y a pas de booléen dans sqlite, Pour le champ Payé j'ai mis un entier -1 -> oui et 0 -> non
    Pour gérer les bases de données sqlite, j'utilise le logiciel libre DB Browser for SQLite
    Fichiers attachés Fichiers attachés

  13. #13
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Ha oui, autant pour moi et merci pour vos réponses, je devais être fatigué à lire des centaines de lignes de code...
    Merci pour vos suggestions également
    Je rectifie mon code source aujourd'hui et valide la discussion si c'était bien le problème que j'avais...

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

Discussions similaires

  1. Une fonction qui ne fonctionne pas dans les deux sens
    Par patricktoulon dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 14/02/2018, 18h34
  2. desiner une ligne (elle n'est pas droite)
    Par AmineDev9 dans le forum MFC
    Réponses: 1
    Dernier message: 09/05/2008, 17h13
  3. [WB9] Une commande Webdev ne fonctionne pas
    Par Tina51 dans le forum WebDev
    Réponses: 4
    Dernier message: 16/03/2007, 22h24
  4. Réponses: 8
    Dernier message: 09/05/2006, 11h08

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