none
Problème avec les fonts RRS feed

  • Question

  • Bonjour,

    voilà, certaines polices n'accepte pas le style regular donc je fais un test avant :

            On Error GoTo Oops
            Police = DataGridView1.CurrentCell.Value
            Style = FontStyle.Regular
            Dim FontS As New FontFamily(Police)
            If FontS.IsStyleAvailable(FontStyle.Regular) = False Then
                CheckBoxGras.Checked = True
            End If
            If FontS.IsStyleAvailable(FontStyle.Bold) = False Then
                CheckBoxGras.Checked = False
            End If
    

    Toutes les polices sont dans un DataGridView. C'est pour cela qu'il y a "Police = DataGridView1.CurrentCell.Value". Mais voilà, pour la police Brush Script MT qui est obligatoirement (gras et italique) le programme se ferme en prétextant un erreur non gérée à la ligne "Dim FontS As New FontFamily(Police)". Il ignore même mon "On Error Goto Oops".

    Oops:
            If Err.Description <> "" Then MsgBox(Err.Description, MsgBoxStyle.Information)
    

    Une autre police aussi me fait ce coup là. J'ai teste :

            If DataGridView1.CurrentCell.Style.Font.FontFamily.IsStyleAvailable(FontStyle.Regular) = False Then
                CheckBoxGras.Checked = True
            End If
    

    Mais là c'est la cata ! J'ai l'erreur à toutes les polices : La référence d'objet n'est pas définie à une instance d'un objet.

    Merci pour votre aide.

    jeudi 29 novembre 2012 11:47

Réponses

  • Si le problème était que CurrentCell était nothing, ce code pourra avoir le même problème. Si c'était CurrentCell.Style ou CurrentStyle.Style.Font qui pouvait ne pas être défini, le nouveau code n'aura pas ce problème.

    C'est pourquoi ma préférence personnelle est de trouver la source de l'erreur avant de changer le code plutôt que d'essayer simplement une autre méthode sans comprendre ce qui n'allait pas avec la précédente. Cela permet aussi sans doute de pouvoir régler plus facilement ce genre d'erreur à l'avenir (comme on sait comment en trouver la source) et éventuellement d'approfondir ses connaissances sur le fonctionnement de tel ou tel contrôle ou d'éviter de reproduire cette même erreur ultérieurement dans un contexte similaire...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    jeudi 29 novembre 2012 17:28
    Modérateur

Toutes les réponses

  • Bonjour,

    DataGridView1.CurrentCell peut être nothing si aucune cellule n'est activée. Essayez peut-être avec DataGridView1.DefaultCellStyle.Font par exemple (à priori le style par défaut est toujours défini).

    Quand vous avez ce message d'erreur cela signifie que l'on essaie d'utiliser un objet non initialisé donc l'idée générale est de tester les objets que vous utilisez sur la ligne concernée (par exemple avec le fenêtre "immédiate" jusqu'à trouver celui qui est Nothing).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 29 novembre 2012 16:04
    Modérateur
  • Bonjour,

    je ne peux pas utiliser DataGridView1.DefaultCellStyle.Font car chaque cellule a une police différente. Je liste les polices dans un DataGidView. Avant de changer la Font d'un TextBox, je veux tester si elle est capable d'utiliser le choix (régular, gras ou italique). La police Brush Script MT fait tout planter à la ligne "Dim FontS As New FontFamily(Police)". Police contient "Brush Script MT".

    Bon, je ne comprends rien, maintenant ça marche en modifiant le code :

            Dim Police As String, Style As Integer
            On Error GoTo Oops
            Police = DataGridView1.CurrentCell.Value
            Style = FontStyle.Regular
            Dim FontS As New FontFamily(Police)
            If FontS.IsStyleAvailable(FontStyle.Regular) = False Then
                If FontS.IsStyleAvailable(FontStyle.Bold) = True Then
                    CheckBoxGras.Checked = True
                Else
                    If FontS.IsStyleAvailable(FontStyle.Italic) = True Then
                        CheckBoxItalique.Checked = True
                    End If
                End If
            End If
            If CheckBoxGras.Checked = True Then Style += FontStyle.Bold
            If CheckBoxItalique.Checked = True Then Style += FontStyle.Italic
            TextBox1.Font = New Font(Police, ListBoxTaille.SelectedItem, Style, GraphicsUnit.World)
    Oops:
            If Err.Description <> "" Then MsgBox(Err.Description, MsgBoxStyle.Information)
    Il menble que cette police supporte seulement le style gras+italique et italique mais pas gras ni regular. Merci quand même.

    jeudi 29 novembre 2012 16:28
  • Si le problème était que CurrentCell était nothing, ce code pourra avoir le même problème. Si c'était CurrentCell.Style ou CurrentStyle.Style.Font qui pouvait ne pas être défini, le nouveau code n'aura pas ce problème.

    C'est pourquoi ma préférence personnelle est de trouver la source de l'erreur avant de changer le code plutôt que d'essayer simplement une autre méthode sans comprendre ce qui n'allait pas avec la précédente. Cela permet aussi sans doute de pouvoir régler plus facilement ce genre d'erreur à l'avenir (comme on sait comment en trouver la source) et éventuellement d'approfondir ses connaissances sur le fonctionnement de tel ou tel contrôle ou d'éviter de reproduire cette même erreur ultérieurement dans un contexte similaire...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    jeudi 29 novembre 2012 17:28
    Modérateur
  • Bonsoir,

    non, CurrentCell n'était pas Nothing car ce n'était pas à première police (je cliquais sur une cellule) et de surcroît, j'ai modifié le programme après Police = DataGridView1.CurrentCell.Value. La valeur de la variable Police était bien égale à quelque chose puisque je voyais l'info-bulle me donner "Brush Script MT".

    Pourquoi mon "On Error" n'a t-il pas fonctionné ? J'étais mode en débogage. Il aurait dû m'afficher Err.Description.
    Oops:
           
    If Err.Description <> "" Then MsgBox(Err.Description, MsgBoxStyle.Information)

    Mais je crois avoir compris mon erreur. C'est ça :

    Private Sub CheckBoxGras_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxGras.CheckedChanged

    J'appelle la même fonction quand je change la police, la taille et que la valeur de CheckBoxGras ou CheckBoxItalique change, et je la changeais. Cela faisait comme une bombe atomique, une réaction en chaîne. :) C'est pour ça (je crois) que mon "On Error" ne se déclangait pas. Il appelait cela une erreur non gérée.

    Merci d'avoir éclairé ma lanterne.

    jeudi 29 novembre 2012 22:37
  • Ah, la première erreur était qq chose du style "débordement de la pile des appels" ? Cela indique qu'une fonction s'appelle elle-même (éventuellement indirectement comme dans le cas que vous indiquez ci-dessus). C'est une erreur grave (par définition on ne peut plus appeler de fonctions) et qui donc fait sans doute partie des qq erreurs qui ne sont pas récupérables par le code. Eventuellement on peut probablement corriger le problème en ne faisant le changement que si la valeur actuelle n'est pas celle que l'on veut.

    Cela illustre un peu ce que je disais précédemment ;-) En modifiant tout de suite le code sans analyser ou indiquer la première erreur ce qui fait passer à une seconde erreur, cela n'a pas permis de comprendre l'erreur d'origine et cela a rendu plus difficile de comprendre votre situation exacte.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 30 novembre 2012 09:31
    Modérateur
  • Bonjour,

    juste une erreur non gérée comme quand il n'y a pas de "On Error..." Je ne rappelle plus de l'erreur exacte.

    vous avez raison. Pour ne pas répéter l'erreur, j'ai choisi le "Clic" et non le "CherckedChanged" pour les cases à cocher.

    A bientôt

    vendredi 30 novembre 2012 11:27