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

Bases de données Delphi Discussion :

Traiter les erreurs ClientDataSet (Xml)


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Par défaut Traiter les erreurs ClientDataSet (Xml)
    Bonjour a tous,

    Est-il possible de gérer les erreurs d'un ClientDataSet lors d'une mauvaise saisie ?

    J'aimerai afficher l'erreur dans un statusBar.

    Pièce jointe 210837

    Merci.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Cela n'a pas un rapport direct avec le TClientDataSet mais le fait que tu as un TDateField qui ne peut contenir que des Dates
    D'ailleurs, tu devrais avoir un masque du genre '__/__/____' qui s'affiche
    Regarde si tu peux choper quelques choses dans TDataSource.OnDataChange ou TField.OnValidate, je t'avoue que je n'ai jamais essayé laissant le message standard

    Souvent, j'ajoute dans ma DBGrid un Bouton Ellipsis qui affiche un EditButtonInputDatePicker de mon cru
    Pour avoir un Calendrier cela me semble indispensable pour sélectionner une Date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //------------------------------------------------------------------------------
    procedure TModulexxxEventForm.DBGridEventDatesEditButtonClick(Sender: TObject);
    begin
      if Sender is TDBGrid then
        if TDBGrid(Sender).SelectedField = FEventFieldDate then
          if ShowEventsDateEditor(TDBGrid(Sender), FEventFieldDate) then
            FLastDate := FEventFieldDate.AsDateTime;
    end;
    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
     
    //------------------------------------------------------------------------------
    function TModulexxxEventForm.ShowEventsDateEditor(ADBGrid: TDBGrid; AField: TField): Boolean;
    var
      LibText, YearText: string;
      Year: Integer;
    begin
      LibText := FEvents.EvenementSpecialLibelle;
      if LibText = '' then
        LibText := 'nom vide';
     
      Year := FEventDates.EvenementSpecialAnnee;
      if Year <> 0 then
        YearText := IntToStr(Year)
      else
        YearText := 'non renseignée';
     
      Result := ADBGrid.EditButtonShowDateEditor(Format(MSG_INPUTDATE_FMT, [LibText, YearText]), AField);
    end;
    j'ai un class helper for TDBGrid qui encapsule un appel à une classe TDBGridSLTAssistant que j'ai créé en D7 bien avant l'existance des class helper


    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
    //------------------------------------------------------------------------------
    function TDBGridSLTAssistant.EditButtonInputDatePicker(const Msg: string; AField: TField): Boolean;
    var
      Value: TDateTime;
    begin
      if not AField.IsNull then
        Value := AField.AsDateTime
      else
        Value := Date();
     
      Result := TSLTMessageDlg.InputDateTime(Msg, Value, idtkDate);
      if Result then
      begin
        // Le AutoEdit ne fait pas effet sur un Ellipsis button !
        if not (AField.DataSet.State in [dsEdit, dsInsert]) then
          AField.DataSet.Edit();
        AField.AsDateTime := Value;
      end;
    end;
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    {* --- TSLTMessageDlg.InputDateTime -----------------------------------------------------
    TSLTMessageDlg.InputDateTime fonctionne comme un InputQuery avec un champ de saisie de type TDateTimePicker
    @param Msg Chaine à Afficher
    @param Value Valeur affichée à l'ouverture du Dialogue et contiendra la valeur acceptée par l'utilisateur
    @param AKind Indique si l'on affiche une sélection de Date (par défaut), une selection de l'Heure ou une double sélection incluant Date ET Heure
    @return Booléen InputDateTime renvoie true si l'utilisateur choisit OK et false si l'utilisateur choisit Annuler ou appuie sur Echap.
    ------------------------------------------------------------------------------ }
    class function TSLTMessageDlg.InputDateTime(const Msg: string; var Value: TDateTime; AKind: TSLTTInputDateTimeKind = idtkDate): Boolean;
     
      function GetAveCharSize(AFont: TFont): TSize;
      begin
        Result := TFontSLTToolHelp.GetTextSize(Msg, AFont);
        Result.Width := Result.Width div Max(Length(Msg), 1); // Average !
      end;
     
    const
      mcHorzMargin = 8;
      mcVertMargin = 8;
      mcHorzSpacing = 10;
    var
      MsgForm: TForm;
      MsgLabel: TComponent;
      DialogUnits: TSize;
      InputWidth, InputHeight: Integer;
      HorzMargin, VertMargin, HorzSpacing, HorzOffset, VertOffset: Integer;
      DatePicker, TimePicker: TDateTimePicker;
      IndexControls: Integer;
      XY: TPoint;
    begin
      Result := False;
     
      MsgForm := TSLTMessageDlg.CreateMessageDialog(Msg, mtConfirmation, mbOKCancel);
      with MsgForm do
      try
        if not (ContainsStr(Msg, #13) or ContainsStr(Msg, #10)) then
          Caption := Msg;
        MsgLabel := FindComponent('Message');
        if MsgLabel is TLabel then
        begin
          DialogUnits := GetAveCharSize(Font);
          HorzMargin := MulDiv(mcHorzMargin, DialogUnits.Width, 4);
          VertMargin := MulDiv(mcVertMargin, DialogUnits.Height, 8);
          HorzSpacing := MulDiv(mcHorzSpacing, DialogUnits.Width, 4);
     
          InputHeight := 0;
          InputWidth := 0;
          if (AKind = idtkDate) or (AKind = idtkDateTime) then
          begin
            DatePicker := TDateTimePicker.Create(MsgForm);
            DatePicker.Parent := MsgForm;
            DatePicker.Kind := dtkDate;
            DatePicker.Visible := True;
            InputHeight := DatePicker.Height;
            DatePicker.Top := TLabel(MsgLabel).Top + TLabel(MsgLabel).Height + VertMargin + VertMargin div 2;
            DatePicker.Width := TFontSLTToolHelp.GetTextWidth(DateToStr(Value), DatePicker.Font) + HorzSpacing + InputHeight*2;
            InputWidth := DatePicker.Width;
            DatePicker.Left := (ClientWidth - DatePicker.Width) div 2 + HorzMargin;
            DatePicker.Date := DateOf(Value);
            ActiveControl := DatePicker;
          end
          else
            DatePicker := nil;
     
          if (AKind = idtkTime) or (AKind = idtkDateTime) then
          begin
            TimePicker := TDateTimePicker.Create(MsgForm);
            TimePicker.Parent := MsgForm;
            TimePicker.Kind := dtkTime;
            TimePicker.Visible := True;
            InputHeight := TimePicker.Height;
            TimePicker.Width := TFontSLTToolHelp.GetTextWidth(TimeToStr(Value), TimePicker.Font) + HorzSpacing + InputHeight*2;
            if Assigned(DatePicker) then
            begin
              TimePicker.Top := DatePicker.Top;
              DatePicker.Left := (ClientWidth - TimePicker.Width - HorzSpacing - DatePicker.Width) div 2 + HorzSpacing;
              TimePicker.Left := DatePicker.Left + DatePicker.Width + HorzSpacing;
              InputWidth := DatePicker.Width + HorzSpacing + TimePicker.Width;
            end
            else
            begin
              TimePicker.Top := TLabel(MsgLabel).Top + TLabel(MsgLabel).Height + VertMargin + VertMargin div 2;
              TimePicker.Left := (ClientWidth - TimePicker.Width) div 2 + HorzSpacing;
              InputWidth := TimePicker.Width;
              ActiveControl := TimePicker;
            end;
            TimePicker.Time := TimeOf(Value);
          end
          else
            TimePicker := nil;
     
          HorzOffset := Max(InputWidth - TLabel(MsgLabel).Width, 0);
          VertOffset := VertMargin + InputHeight;
          for IndexControls := 0 to ControlCount - 1 do
          begin
            if Controls[IndexControls] is TButton then
            begin
              with TButton(Controls[IndexControls]) do
              begin
                Top := Top + VertOffset;
                Left := Left + HorzOffset div 2;
              end;
            end;
          end;
     
          Height := Height + VertOffset;
          Width := Width + HorzOffset;
          if HorzOffset > 0 then
          begin
            if Assigned(DatePicker) then
              DatePicker.Left := DatePicker.Left + HorzOffset div 2;
            if Assigned(TimePicker) then
              TimePicker.Left := TimePicker.Left + HorzOffset div 2;
          end;
     
          XY := Mouse.CursorPos;
          XY.X := XY.X - Width div 2;
          XY.Y := XY.Y - Height div 2;
          if XY.X < Screen.WorkAreaLeft then
            XY.X := Screen.WorkAreaLeft;
          if XY.Y < Screen.WorkAreaTop then
            XY.Y := Screen.WorkAreaTop;
          if XY.X + Width > Screen.WorkAreaWidth then
            XY.X := Screen.WorkAreaWidth - Width;
          if XY.Y + Height > Screen.WorkAreaHeight then
            XY.Y := Screen.WorkAreaHeight - Height;
     
          Left := XY.X;
          Top := XY.Y;
          if ShowModal() = mrOk then
          begin
            Result := True;
            if (AKind = idtkDate) or (AKind = idtkDateTime) then
              Value := DateOf(DatePicker.Date)
            else
              Value := 0;
     
            if (AKind = idtkTime) or (AKind = idtkDateTime) then
              Value := Value + TimeOf(DatePicker.Time);
          end;
        end
        else
          Abort;
      finally
        Free;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par Gregory666 Voir le message
    Est-il possible de gérer les erreurs d'un ClientDataSet lors d'une mauvaise saisie ?

    J'aimerai afficher l'erreur dans un statusBar.
    Plusieurs pistes peuvent être envisagées :
    • préventives : via l'événement OnBeforePost
    • réactives : via les événements OnEditError, OnPostError

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Je viens de tester le TField.OnValidate aucun moyen de bloquer l'ereur
    TDataSet.OnEditError c'est bien trop tôt bien avant que l'on ne saisisse la valeur
    TDataSet.OnBeforePost ou TDataSet.OnPostError ne se produise pas puiqu'il n'y a pas de Post

    Suffit de lire le code de la procedure TDateTimeField.SetAsString pour voir que c'est un StrToDate qui produit l'erreur et qu'il n'y a pas moyen de la capturer

    Heureusement il nous reste TField.OnSetText
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGrid.DataSource.DataSet.FieldByName('LeNomDuChampDate').OnSetText := SetDateTimeFieldFromText;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TFormTruc.SetDateTimeFieldFromText(Sender: TField; const Text: string);
    var
      V: TDateTime;
    begin
      if TryStrToDate(Text, V) then
        Sender.AsDateTime := V
      else
        StatusBar.SimpleText := Format(System.SysConst.SInvalidDate, [Text]);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. 'Attraper' les erreurs non traités
    Par snopims dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/04/2008, 10h54
  2. Capturer les erreurs de parsing xml
    Par nicolas7777 dans le forum Modules
    Réponses: 0
    Dernier message: 10/02/2008, 21h17
  3. 'Attraper' les erreurs non traités
    Par CAML dans le forum Windows Forms
    Réponses: 7
    Dernier message: 13/04/2007, 14h19
  4. [web] comment afficher les erreur d'un cgi
    Par chtiboss dans le forum Web
    Réponses: 6
    Dernier message: 24/12/2003, 11h22
  5. Empecher les erreurs du débogeurs
    Par remixtech dans le forum EDI
    Réponses: 9
    Dernier message: 04/06/2003, 13h45

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