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

C++ Discussion :

TStringGrid et le Scroll avec Borland C++ 6


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut TStringGrid et le Scroll avec Borland C++ 6
    Bonjour à tous,

    J'utilise actuellement pour mon projet Borland C++ 6.0.
    Dans ce projet j'ai un TStringGrid que je remplis par le code et dont certain champs peuvent être éditable et d'autre non ( en fonction de la colonne) . Mon problème est que lorsque l'utilisateur scroll avec la molette ou appui sur les flèches pour descendre dans la liste et que la dernière cellule sélectionnée est une cellule non éditable lorsque le scroll fait afficher des lignes qui était jusque là masqué puisque le tableau n'était pas assez grand, la cellule n'affiche plus la valeur qu'elle devrait avoir mais la valeur contenu dans la dernière cellule éditable sélectionnée.


    Exemple :
    Mon tableau contient les colonnes : Fichier, Offset X, Offset Y, Vitesse, Energie.
    Ma colonne Fichier ne doit pas être éditable.
    Je sélectionne une des cellules de la colonne offset X, puis je sélectionne une des cellules de la colonne fichier, puis je scroll.
    Si je scroll vers le bas lorsque les nouvelles lignes jusque là caché apparaissent, la cellule la plus basse de la colonne Fichier contient la valeur de la cellule offset sélectionner au préalable. Lorsque je quitte cette cellule celle ci reprend la valeur qu'elle devrait avoir.
    A noter que si je scroll vers le haut c'est la cellule la plus haute de la colonne fichier qui prend visuellement la mauvaise valeur.

    Je ne sais pas si s'est très clair, mais si vous pouviez m'aider cela me permettrait de me débloquer de ce bug incompréhensible pour moi.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par flamme34 Voir le message
    J'utilise actuellement pour mon projet Borland C++ 6.0.
    Toutes mes condoléances.

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Toutes mes condoléances.
    C'est a ce point là?


    Autre information il arrive de manière aléatoire que lors de scroll ou de descente dans le tableau à l'aide des flèches, que je reçoive le message "invalid pointer opération".
    Cela n'arrive qu'en mode exécutable sans debug.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu as un pointeur non défini, probablement dans un listener ou autre.
    En débug, il est mis à 0, mais en release, c'est de la mémoire aléatoire, qui n'a aucune raison de valoir 0.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Mon problème est que je ne gère pas du tout le mouvement dans le tableau moi même, je laisse les fonctions par defaut du TStringGrid gérer tout ça.

    Ce pourrait-il que ce soit la façon dont je remplis mon tableau?

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je ne sais pas. Mais le symptome est bien celui d'un pointeur non initialisé avant sa première lecture. Ou non remis à nullptr (ou 0) quand il a été delete

    Il est aussi possible que ce soit un pointeur sur une valeur temporaire depuis disparue.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Si ça peut aider voici le code ou j'interagit avec le tableau

    Voici un peu leparamétrage de mon tableau en terme d'options :
    goFixedVertLine true
    goFixedHorzLine true
    goVertLine true
    goHorzLine true
    goRangeSelect false
    goDrawFocusSelected false
    goRowSizing false
    goColSizing false
    goRowMoving false
    goColMoving false
    goEditing false
    goTabs true
    goRowSelect false
    goAlwaysShowEditor true
    goThumbTracking false
    Voici comment je rempli mon tableau :
    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
    for (unsigned int indiceFichier=0; indiceFichier<fichierAAjouter.size();indiceFichier++)
    {
    	if (StringGrid1->RowCount>NB_FICHIERMAX)  // si on dépasse le nombre max on sort
    	{
    		break;
    	}
     
    	SWritingParameters writingParametersAAjouter = fichierAAjouter[indiceFichier];
     
    	if (StringGrid1->Enabled == false)
    		StringGrid1->Enabled = true;
    	else
    		StringGrid1->RowCount++;
     
    	int nb = StringGrid1->RowCount-1;
     
    	// Nom du fichier ( sans le chemin ) 
    	int indice = writingParametersAAjouter.fichier.LastDelimiter("\\");
    	StringGrid1->Cells[0][nb] = writingParametersAAjouter.fichier.SubString(indice+1,writingParametersAAjouter.fichier.Length());
     
    	if ( StringGrid1->Cells[0][nb].Length()>67)
    		StringGrid1->Cells[0][nb] = StringGrid1->Cells[0][nb].SubString(0,64)+"...";
     
    	//energie
    	StringGrid1->Cells[1][nb] = writingParametersAAjouter.energy;
     
    	//vitesse
    	StringGrid1->Cells[2][nb] = writingParametersAAjouter.velocity;
     
    	//offset
    	StringGrid1->Cells[3][nb] = writingParametersAAjouter.offsetX;
    	StringGrid1->Cells[4][nb] = writingParametersAAjouter.offsetY;
     
    	fenPopup->ProgressStepUp();
     
    	//On garde une copie 
    	listItems.push_back(writingParametersAAjouter);
     
    }
    L'appuis sur une touche se traduit par :
    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
    void __fastcall TControlLithography::StringGrid1KeyPress(TObject *Sender, char &Key)
    {
            //verification d'ou on écrit et des caractère entré
           if ((StringGrid1->Col>0) && (47<Key) && (Key>58) && (Key!=46) (&&Key>3)2 ) //++
            {
                Key=NULL;
                return;
            }
            else if ( Key<32 || Key == Char(VK_RETURN))
                    ;
            else if( isNumerical(StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row]+Key))
            {
     
            }
            else if( Key == '-')
            {
                    if (( StringGrid1->Col == 1 )|| ( StringGrid1->Col == 2 )  ) //++
                     {
                            Key = NULL;
                     }
                     return;
            }
            else
            {
                    Key = NULL;
                    return;
            }
    }

    voici ce qui se passe quand l'utilisateur sélectionne une cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TControlLithography::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect)
    {
    	if (ACol == 0 )  // pas d'édition pour le nom de fichier
    		StringGrid1->Options >> goEditing;
    	else
    		StringGrid1->Options << goEditing;
    }
    La récupération des valeurs pour utilisation se fait sur l'appuis d'un bouton :
    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
    for (unsigned int i=0; i < listItems.size() && !erreur; i++)
    {
    	try
    	{
    		// pour chaque fichier, on récupère les paramètres saisis depuis l'interface
    		// on ne change pas le nom du fichier (qui est déjà conservé en chemin absolu dans listItems[i])
     
    		ToDouble(value,  StringGrid1->Cells[1][i+1], 0.0f);
    		listItems[i].energy = value;
    		if ( listItems[i].energy>100)
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer une modulation supérieure à 100%."),listItems[i].fichier)->Show();
    			return;
    		}
     
    		ToDouble(value,  StringGrid1->Cells[2][i+1], 0.0f);
    		listItems[i].velocity = StringGrid1->Cells[2][i+1];
     
    		if ( RoundTo(value,-6) ==0)
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer une vitesse nulle."),listItems[i].fichier)->Show();
    			return;
    		}
    		else if ( RoundTo(value,-6) > VITESSE_PLATINE_MAX)
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer une vitesse supérieure à ")+(AnsiString)VITESSE_PLATINE_MAX + " mm/s.",listItems[i].fichier)->Show();
    			return;
    		}
     
     
    		ToDouble(value,  StringGrid1->Cells[3][i+1], 0.0f);
    		listItems[i].offsetX = value;
    		if ( RoundTo(value,-6) >OFFSET_MAX)
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer un offset sur X supérieur à ")+(AnsiString)OFFSET_MAX + " mm.",listItems[i].fichier)->Show();
    			return;
    		}
    		else if ( RoundTo(value,-6)<(OFFSET_MAX*-1))
    		{
    			TForm_MsgStandard::GetModuleForm(this,  GetTraduction("Impossible d'appliquer un offset sur X inférieur à ")+(AnsiString)(OFFSET_MAX*(-1))+ " mm.",listItems[i].fichier)->Show();
    			return;
    		}
     
    		ToDouble(value,  StringGrid1->Cells[4][i+1], 0.0f);
    		listItems[i].offsetY = value;
    		if ( RoundTo(value,-6) >OFFSET_MAX)
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer un offset sur Y supérieur à ")+(AnsiString)OFFSET_MAX+ " mm.",listItems[i].fichier)->Show();
    			return;
    		}
    		else if ( RoundTo(value,-6)<(OFFSET_MAX*-1))
    		{
    			TForm_MsgStandard::GetModuleForm(this, GetTraduction("Impossible d'appliquer un offset sur Y inférieur à ")+(AnsiString)(OFFSET_MAX*(-1))+ " mm.",listItems[i].fichier)->Show();
    			return;
    		}
    	}
    	catch (...)
    	{
    		erreur = true;
    	}
    }

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    personne?

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bah, il faut connaitre Borland 6 ...
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. probleme compilation classe avec Borland c++ compiler 5.5
    Par softblue dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 17/06/2004, 15h16
  2. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 19/03/2004, 23h18
  3. Problème de link avec Borland C++ 5.5
    Par gelam dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/11/2003, 16h45
  4. [BORLAND 6][SON] son avec borland
    Par yohan dans le forum C++Builder
    Réponses: 6
    Dernier message: 31/08/2003, 22h56
  5. créér une dll avec borland c++ compiler
    Par juju62610 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/02/2003, 09h46

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