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

EDI Delphi Discussion :

Problème de boîtes de dialogue en français sur appli pour windows en anglais.


Sujet :

EDI Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut Problème de boîtes de dialogue en français sur appli pour windows en anglais.
    Bonjour à tous,

    Gros stress aujourd'hui en testant mon application développée en Delphi9 FR, sur un Windows en anglais...

    J'étais persuadé que les boîtes de dialogues contenant les boutons 'oui', 'non', 'annuler', et autres, étaient dépendantes de la langue du Windows de destination et deviendraient des 'Yes', 'No', 'Cancel' automatiquement. ET ben non !

    Donc, si j'ai traduit tous les caption et autres messages de mon appli en anglais, je n'ai pas creusé pour ces boîtes de dialogues. D'ailleurs, je ne vois pas d'option pour les paramétrer. Quand je place les mryes, et autres mrno, que le Windows soit en FR ou en US, la boîte affiche un affreux "OUI" ou "NON"...

    Bref, je suis dans une impasse. Comment avoir des boîtes de dialogue en anglais. Je voudrais éviter d'intercepter tous les messages destinés à l'utilisateur du programme pour devoir les remplacer par une boîte "maison".

    D'autant plus que certains messages sont envoyés automatiquement, pour gérer des exceptions, et là, je ne vois pas comment y substituer ma boîte de dialogue perso.

    Bref, je suis convaincu que ça doit se paramétrer dans un coin, mais je sèche.

    Vos lumières sont les bienvenues.

    Merci par avance pour votre aide toujours précieuse.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Tu utilises quelle fonction pour afficher tes messages ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    c'est d'autant plus "marrant" , que , en général, la question se pose plutôt en sens inverse
    sur le poste de dev c'est en français mais sur les postes utilisateurs en anglais

    dans ce dernier cas je copie les .fr des paquets pour "régler" le problème
    dans ton cas ce serait donc plutôt l'inverse ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut What,

    Regarde cela :

    Ma box Boite

    Elle te permet d'intercepter toutes les boîtes de dialogue... alors je sais que cela te fera du boulot, mais au moins du fera ce que tu veux.


  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Lung Voir le message
    Tu utilises quelle fonction pour afficher tes messages ?
    A priori, j'utilise messagedlg.

    Pour celles que je gère, je peux à la limite créer mon propre dialogue.

    Par contre, pour les messages que je ne gère pas, comme l'oubli de la saisie d'un champ obligatoire dans une application de base de données, je peux difficilement intercepter... C'est Delphi qui envoie l'alerte...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    c'est d'autant plus "marrant" , que , en général, la question se pose plutôt en sens inverse
    sur le poste de dev c'est en français mais sur les postes utilisateurs en anglais

    dans ce dernier cas je copie les .fr des paquets pour "régler" le problème
    dans ton cas ce serait donc plutôt l'inverse ?
    Mon souci est effectivement l'inverse. Mais je ne peux pas remplacer les paquets par une version us, ni modifier les sources de Delphi, car l'appli est internationale (j'utilise DKlang pour gérer le fr, us, de, etc.)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Salut What,

    Regarde cela :

    Ma box Boite

    Elle te permet d'intercepter toutes les boîtes de dialogue... alors je sais que cela te fera du boulot, mais au moins du fera ce que tu veux.

    Merci pour ton travail. Sans autre moyen simple, je vais creuser cela. Mais je manque un peu de temps, j'ai un délai à respecter et encore mille choses à faire. Et comme j'ai bcp de messages dans l'appli.

    Cela dit, je suis rassuré qu'une solution existe.

    Petite question :
    Cela va intercepter aussi les messages dus aux exceptions que je ne gère pas, du type message envoyé automatiquement par Delphi quand une contrainte d'intégrité de la base de données de l'appli n'est pas respectée (duplicate key, etc.), ou un champ obligatoire non saisi ?

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux regarder de MessageBoxA plutôt ...
    Ca traduit les boites de dialogues dans la langue de l'OS de façon automatique ...
    A+

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par ero-sennin Voir le message
    Salut,

    Tu peux regarder de MessageBoxA plutôt ...
    Ca traduit les boites de dialogues dans la langue de l'OS de façon automatique ...
    A+
    Merci pour l'info.

    Par contre, cela crée une boîte non modale.

    En conséquence, si le message passe sous la fenêtre principale de l'application sans que l'utilisateur ait cliqué sur un bouton, le comportement de mon appli est compromis. Je ne veux pas que l'utilisateur puisse par exemple continuer à utiliser l'appli tant qu'il n'a pas répondu à la question de la boîte de dialogue...

    Du coup j'ai trouvé le "application.MessageBox".

    Lui aussi prend la langue de l'OS. Mais là, je suis confronté à un nouveau problème : je gère le texte de la question dans la boîte de dialogue pour qu'il soit dans la langue choisie par l'utilisateur. J'utilise donc des constantes dans mes boîtes de dialogue (géré par dklang)

    Exemple quand j'utilisais MessageDlg :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     messagedlg(DKLangConstW('MiseAjourSaisie'), mtConfirmation, [mbyes,mbno], 0)

    où 'MiseAjourSaisie est égal à 'Mise à jour de la saisie ?', ou 'Update the record?' selon la langue.

    Si messageDlg ne bronche pas avec se fonctionnement, MessageBox lui n'aime pas du tout... Lors de la compilation, voici l'erreur :

    [Erreur](4455): E2010 Types incompatibles : 'WideString' et 'PAnsiChar'

    Donc, j'ai pensé faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pansichar(dklang(maconstante))
    Du coup ça compile, mais ma boîte de dialogue n'affiche que le premier caractère de la question, soit 'M'.

    Malheureusement, la traduction de ma constante est du WideString, incompatible semble-t-il avec messageBox. Mais je ne peux pas le changer, c'est une routine DKLang.

    Que puis je faire pour que ma constante "traduite" soit du type attendu par messagebox ?

    Merci pour votre aide.

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par What Voir le message
    Merci pour ton travail. Sans autre moyen simple, je vais creuser cela. Mais je manque un peu de temps, j'ai un délai à respecter et encore mille choses à faire. Et comme j'ai bcp de messages dans l'appli.

    Cela dit, je suis rassuré qu'une solution existe.

    Petite question :
    Cela va intercepter aussi les messages dus aux exceptions que je ne gère pas, du type message envoyé automatiquement par Delphi quand une contrainte d'intégrité de la base de données de l'appli n'est pas respectée (duplicate key, etc.), ou un champ obligatoire non saisi ?
    A priori oui, je n'ai jamais essayé mais si tu connais le lpWindowsname, ici PAnsiChar(CaptionHackBox) cela devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.WMHackBox(var message: TMessage);
    var
      h: HWND;
    begin
      // La Boite de dialogue est show on récupèere son Handle
      h := FindWindow(WC_DIALOG,PAnsiChar(CaptionHackbox));
      // Si la fenêtre est la Message Box on la modifie
      if GetParent(h) = Application.Handle then
    // ...
    end;

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je reprends ta question que tu a posé dans la partie contribution

    Bonjour,

    Je viens d'implémenter ton code... Les boutons affichent 'oui' et 'non', pas 'enregistrer' et 'ne pas enregistrer'...

    Les boites par défaut de Delphi ne sont ni remplacées ni interceptées...

    J'ai mis un point d'arrêt dans la procédure WMHackBox. On y passe bien, mais le test ' if GetParent(h) = Application.Handle then' n'est pas satisfait.


    Une idée du souci ?
    Alors effectivement en D2007 cela ne pose pas de problème mais sous mon D2009 le application.Handle n'ai pas juste, remplace
    if GetParent(h) = Application.Handle then
    par
    if GetParent(h) = Handle

    @+

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon j'ai fais quelque test lié au une erreur sans try..Except

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    Type
     
    //Enumération qui permet de prévoir si il y aura 1, 2 ou 3 bouttons dans la messagebox le choix Mb_OK ou autre est totalement arbitraire
    enumTypeHackBox=
        (
        Ok=MB_OK,
        Oui_Non=MB_YESNO,
        Oui_Non_Annuler=MB_YESNOCANCEL,
        Erreur= - 1
        );
    // Erreur sera pour tout les box qui ne sont pas lancer par mes soins (error)
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        procedure WMHackBox(var message: TMessage); message WM_USER + 600;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      CaptionHackbox, MessageHackBox: String;
      HackboxCaptionBtn1,HackboxCaptionBtn2,HackboxCaptionBtn3: String;
      TypeHackBox: enumTypeHackBox;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      TL : TstringList;
    begin
     
      PostMessage(Handle, WM_USER + 600, 0, 0);
     
      TL.Add('ff'); // sa va faire mal...
     
    end;
     
    procedure TForm1.WMHackBox(var message: TMessage);
    var
      h: HWND;
    begin
      // La Boite de dialogue est show on récupèere son Handle
      h := FindWindow(WC_DIALOG,nil); // nil sera plus approprié on aura toute les messages box
     
      // Si la fenêtre est la Message Box on la modifie (on pourrais faire plus simple mas bon.... je sjuis fainéant sur le coup là.... lol
      if (TypeHackBox <> Ok) or (TypeHackBox <> Oui_Non) or (TypeHackBox <> Oui_Non_Annuler) then TypeHackBox := Erreur;
     
      if (GetParent(h) = Handle) then
      begin
        Case TypeHackBox of
          Erreur:
          Begin
          // Cas des messages box hors contexte de programmation
            SetDlgItemText(h, ID_CANCEL, 'ok_Ko'); // On change le text bouton
          End;
          Ok:SetDlgItemText(h, ID_OK, PWideChar(HackboxCaptionBtn1)); // On change le text bouton
          Oui_Non:
          Begin
              SetDlgItemText(h, ID_YES, PWideChar(HackboxCaptionBtn1)); // On change le text premier bouton
              SetDlgItemText(h, ID_NO, PWidechar(HackboxCaptionBtn2)); // On change le text deuxième bouton
          end;
          Oui_Non_Annuler:
          Begin
            SetDlgItemText(h, ID_YES, PWideChar(HackboxCaptionBtn1)); // On change le text premier bouton
            SetDlgItemText(h, ID_NO, PWidechar(HackboxCaptionBtn2)); // On change le text deuxième bouton
            SetDlgItemText(h, ID_CANCEL, PWideChar(HackboxCaptionBtn3)); // On change le text troisieme bouton
          end;
        end;
      end;
    end;
     
    end.
    Cela ce rapproche à du bricolage... lol mais si tu essai tu verra le bouton de l'erreur qui est générer par TL.Add changé en ok_ko ce qui permet de penser que tu peux intercépter et jouer avec les autres box non généré par tes soins.

    Maintenant si tu utilise un bloc try..Except, il te faudra simplement utiliser

    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
    try
    // ...
    Except
      Begin
        PostMessage(Handle, WM_USER + 600, 0, 0);
        CaptionHackbox := 'GROS ERREUR';
        MessageHackBox := 'Ta saisie une bétise...';
        TypeHackBox := Oui_Non; // Il y aura 2 choix
        HackboxCaptionBtn1 := 'All Kill'; // Première choix
        HackboxCaptionBtn2 := 'not all Kill'; // Deuxième choix
     
        // On appel la boite de dialogue avec un iconquestion (il y en a plein d'autre)
        // et on test le résult du choix boutton
        // 6 = Oui et donc le premier choix
        if Application.MessageBox(
          PWideChar(MessageHackBox),
          PWideChar(CaptionHackbox),
          MB_YESNO or MB_ICONQUESTION) = 6 Then
        Begin
            Showmessage('premier boutton');
        end
        else
        Begin
            Showmessage('deuxième boutton');
        end;
        TypeHackBox := Erreur;
      end;
    end;
    @+

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Et du côté de StringToWideChar?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Un petit point de où j'en suis :

    D'abord, @BuzzLeclaire : j'ai abandonné ton outil. Il est très bien, et j'ai beaucoup de respect pour ton travail. Mais comme il ne me permet pas de résoudre les exceptions de base de données (onposterror) ni les inputBox, je suis parti sur d'autres solutions.


    Pour le souci de Types incompatibles : 'WideString' et 'PAnsiChar' , j'ai fait ceci (trouvé sur le net) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    application.MessageBox(pansichar(AnsiString(
    DKLangConstW('MiseAjourRecord'))),'Question', MB_YESNO)
    Ainsi, la chaîne traduite passe en totalité. Je ne sais pas pourquoi, mais ça marche. Du reste, j'ai enfin les boutons de la boîte dans la langue de l'OS. Ce qu'il me fallait.




    Par contre, je me heurte à un nouveau problème :

    J'utilise l'événement IBTableMatablePostError. Mais pas moyen de récupérer un code erreur pour y adapter une boîte de dialogue qui va bien. Je peux juste tester le texte du message d'erreur. Et du coup je fais une cuisine imbuvable pour connaître le type d'erreur. Exemple, pour identifier une erreur de type champ requis, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if trim(Copy(e.Message,length(e.Message)-20,21))='doit avoir une valeur' then
      if trim(Copy(e.Message,0,8))='Le champ' then
        begin
        e.Message:=DKLangConstW('LeChamp')+' '''
    +trim(Copy(e.Message,11,length(e.message)-33))+''' '+
    DKLangConstW('DoitAvoirUneValeur');
        end;
    En effet, étant sous un delphi FR, je teste le début de la chaîne pour y trouver la chaine 'Le champ', et la fin pour y trouver la chaine 'doit avoir une valeur'. Je ne peux pas tester la chaîne en entier car au milieu se trouve le nom du champ, donc différent selon l'erreur de l'utilisateur, et différent selon le nom que je lui donne selon la langue.

    Bref, ça marche, mais je trouve ça pas très propre, voire risqué...

    Et surtout, je ne teste pas les autres types de messages genre violation de clé.

    J'ai scruté tout le forum, et je n'y vois que des tests de code erreur si on utilise le BDE. Ce que je n'utilise pas.

    J'ai vu aussi l'utilisation de tests sur EIBError, ma base étant firebird, je le sentais bien... Mais Delphi rejette (identificateur non déclaré).

    Je pensais que, un peu à la manière de e.message qui me permet de tester le texte du message, j'allais trouvé un truc du genre e.errorcode. Mais avec une table Firebird, ça semble impossible.

    Dommage, mon but était de créer un case of errorcode..., et tout gérer en multilingue...

    Une piste ?

    Merci à tous.

  15. #15
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par What Voir le message
    ...
    J'ai scruté tout le forum, et je n'y vois que des tests de code erreur si on utilise le BDE. Ce que je n'utilise pas.
    ...

    Une piste ?

    Merci à tous.
    La on aborde alors un autre sujet.

    voilà exactemen ce que je fais sur ma gestion des erreur sur base access.

    J'utilise un DataModule ici Fdata, et j'affecte aux évenements OnDeleteError, OnEditError, OnPostError de mes AdoTable et ADOQry l'evenement suivant

    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
    procedure TFData.TblandQryError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    var
      LastError: integer;
      TextError: String;
    begin
      LastError := CnxPlg.Errors.Count-1;
      if LastError >= 0 then
      begin
        TextError :=
         'Description  : ' + CnxPlg.Errors.Item[LastError].Description+#13+#10
        +'Source       : ' + CnxPlg.Errors.Item[LastError].Source+#13+#10
        +'Numéro       : ' + inttostr(CnxPlg.Errors.Item[LastError].Number)+#13+#10
        +'SQLState     : ' + CnxPlg.Errors.Item[LastError].SQLState+#13+#10
        +'NativeErreur : ' + inttostr(CnxPlg.Errors.Item[LastError].NativeError)+#13+#10
        +'Table        : ' + DataSet.GetNamePath+#13+#10
        +'------------------';
        LogError(E,TextError); // Ecriture dans un fichier log
        case StrToInt(CnxPlg.Errors.Item[LastError].SQLState) of
          3022 : TextError := 'Ce Code est déjà utilisé, veuillez définir un autre Code.';
          3008 : TextError := 'La table est ouverte par un autre logiciel et bloque son utilisation.';
          3010 : TextError := 'La table existe déjà.';
        end;
      end;
      Showmessage(TextError);
      Action := daAbort;
    end;
     
    // Pour la procedure logError() 
    procedure LogError(E:Exception; Table: String);
    var sFileName  : string;
        errLogList : TStringList;
    begin
     sFileName := ExtractFilePath(Application.EXEName) + 'error.log';
     
     errLogList := TStringList.Create;
     try
      if FileExists(sFileName) then
         errLogList.LoadFromFile(sFileName);
      with errLogList do
      begin
       Add('Erreur à : ' +
          FormatDateTime('hh:mm:ss', Now) +
          ' le ' +
          FormatDateTime('dd/mm/yyyy', Now));
       Add('Erreur Class  : ' + E.ClassName);
       Add('Erreur Message: ' + E.Message);
       Add('Table Erreur  : ' + Table);
       SaveToFile(sFileName);
      end; //with
     finally
      errLogList.Free;
     end;
    end;
    J'espere que cela va t'aider.

    Bye.

  16. #16
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par What Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if trim(Copy(e.Message,length(e.Message)-20,21))='doit avoir une valeur' then
      if trim(Copy(e.Message,0,8))='Le champ' then
        begin
        e.Message:=DKLangConstW('LeChamp')+' '''
    +trim(Copy(e.Message,11,length(e.message)-33))+''' '+
    DKLangConstW('DoitAvoirUneValeur');
        end;
    Bonjour,
    La fonction Pos permet la recherche d'une sous chaine dans une chain de caractère, tu pourrais donc l'utiliser pour éviter d'avoir à trimer des copy de sous-chaine... (le test if Pos('doit avoir une valeur', e.message)<>0 équivaut à peu de choses près à if trim(Copy(e.Message,length(e.Message)-20,21))='doit avoir une valeur')

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    @tenpigs :
    Wow, clair ! Beaucoup plus propre et moins risqué (pas de risque de tester la chaîne à la mauvaise position). Un grand merci.


    @BuzzLeclaire :
    Merci pour le code. Je suis en train de me dépatouiller avec dans mon appli. Je sens que je vais bientôt te poser des questions !

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Je rebondi un peu sur ce que tu as dit dans l'un des messages précédents :

    Citation Envoyé par What Voir le message
    Merci pour l'info.

    Par contre, cela crée une boîte non modale.
    Il est pourtant bien spécifier, sur le lien que je t'ai donné :

    Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information.
    As-tu essayé de mettre une autre valeur que celle par défaut pour la boite de dialogue ? (je ne sais pas si tu avais lu)
    To indicate the modality of the dialog box, specify one of the following values.

    MB_APPLMODAL

    The user must respond to the message box before continuing work in the window identified by the hWnd parameter. However, the user can move to the windows of other threads and work in those windows.

    Depending on the hierarchy of windows in the application, the user may be able to move to other windows within the thread. All child windows of the parent of the message box are automatically disabled, but pop-up windows are not.

    MB_APPLMODAL is the default if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.

    MB_SYSTEMMODAL

    Same as MB_APPLMODAL except that the message box has the WS_EX_TOPMOST style. Use system-modal message boxes to notify the user of serious, potentially damaging errors that require immediate attention (for example, running out of memory). This flag has no effect on the user's ability to interact with windows other than those associated with hWnd.

    MB_TASKMODAL

    Same as MB_APPLMODAL except that all the top-level windows belonging to the current thread are disabled if the hWnd parameter is NULL. Use this flag when the calling application or library does not have a window handle available but still needs to prevent input to other windows in the calling thread without suspending other threads.
    Avec en plus :
    MB_TOPMOST

    The message box is created with the WS_EX_TOPMOST window style.
    C'était bien ton cas ?

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Salut ero-sennin,

    Bon, j'ai merdé !

    En fait, pas bien compris la page en lien, car en anglais, du coup j'ai testé sans le paramètre 'modal' qui va bien, et j'ai pas retenu le truc. Du reste, je ne trouvais pas comment cumuler plusieurs options dans Delphi. Là, j'ai testé en les séparant par le signe + , j'espère que c'est ainsi qu'on doit procéder.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        a:=MessageBox( 0,'Message','Titre',
    MB_RETRYCANCEL+MB_DEFBUTTON2+MB_TOPMOST+MB_TASKMODAL);
    Bref, zapper ta proposition était une erreur, car c'est exactement ce que je cherche, en mieux.

    Mille excuse pour avoir zappé trop vite, et un grand merci à toi.



    PS : je suis pas sûr de bien comprendre le paramètre MB_TOPMOST

  20. #20
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Pas de souci, excuses acceptées
    Pour ce qui est de ton code, j'aurai plutôt fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MessageBox(Application.Handle,'Message','Titre',
    MB_RETRYCANCEL or MB_DEFBUTTON2);
    J'ai mis un Handle (Application.Handle) comme ça, ta fenêtre est liée à ton application et cela implique que lorsque tu vas afficher une autre fenêtre puis revenir sur ton application, hé bien la fenêtre créée avec MessageBox sera au premier plan.
    C'est ce qui est dit dans la MSDN :
    MB_APPLMODAL

    The user must respond to the message box before continuing work in the window identified by the hWnd parameter. However, the user can move to the windows of other threads and work in those windows.

    Depending on the hierarchy of windows in the application, the user may be able to move to other windows within the thread. All child windows of the parent of the message box are automatically disabled, but pop-up windows are not.

    MB_APPLMODAL is the default if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.
    Après, libre à toi de changer le Owner et de mettre une Form en particulier ....

    Sinon, pour le MB_TOPMOST ça signifie que ta fenêtre sera toujours au premier plan quoi qu'il arrive. Par exemple, la fenêtre est affichée, toi, tu réduis ton application dans la barre des tâches, hé bien la fenêtre sera toujours présente (visible).
    J'espère que j'ai répondu à tes besoins. Sinon, n'hésites pas!

    A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/10/2013, 17h27
  2. Problème avec boîte de dialogue
    Par mécano41 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/02/2008, 16h55
  3. Boîtes de dialogue en français
    Par FloMo dans le forum Qt
    Réponses: 4
    Dernier message: 08/02/2008, 15h12
  4. Problème avec boîte de dialogue
    Par zorely dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/02/2008, 12h55
  5. Aide sur WinDbg pour Windows 98
    Par robert.michel9 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 16/08/2004, 22h08

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