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

Delphi Discussion :

Orientation d'une écriture bilingue dans un même champ


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut Orientation d'une écriture bilingue dans un même champ
    Bonjour,
    je développe un logiciel de gestion pour une maison d'édition de livres bilingues (arabe et Français), l'utilisateur souhaite écrire, dans le même champ, de gauche a droite tous les ouvrages qui portent un titre en Français et inversement (de D a G) pour les ouvrages arabes .
    sachant qu'il n'utilise pas la même police de caractères , que ce soit en Français ou en arabe.
    comment faire ?
    remerciements
    ci joint un état de sortie
    Nom : etat produits.jpg
Affichages : 882
Taille : 429,8 Ko

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Quelle version de Delphi utilisez vous ? Quel framework utilisez vous (VCL ou Firemonkey) ?
    Si c'est en VCL, avez vous essayé de jouer avec la propriété BiDiMode de l'objet Application ? Dans l'aide en ligne, il est indiqué : "Indique la disposition de l'application quand elle s'exécute dans les versions moyen-orientales de Windows."
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Citation Envoyé par gbegreg
    Quelle version de Delphi utilisez vous ?...
    à priori, au vu de l'image écran D7 mais je suis assez étonné d'y voir des caractères arabes D7 n'étant pas unicode

    Citation Envoyé par gbegreg
    Propriété BiDiMode
    pour moi, je n'ai jamais eu à utiliser, BiDiMode veut dire écriture de Droite à Gauche, mais c'est soit l'un soit l'autre, pas les deux en même temps (ce que le Bi pourrait laisser supposer)


    par "dans le même champ" vous entendez la même colonne de la table où la même zone de saisie ? je présume qu'il s'agit de la zone de saisie ?

    AMHA il va faut une colonne dans la table pour indiquer s'il s'agit d'un livre en Arabe ou en Français pour le titre (et pourquoi pas pour d'autres colonnes)

    à priori on a ici affaire à un DBGrid classique changer l'orientation d'affichage grâce à l'évènement onDrawCell doit être faisable.
    FAQ:Comment-formater l'affichage d'un champ dans un DBGrid c'est la méthode Textout qu'il va falloir utiliser, une peu de recherche
    et vous trouverez ceci :
    In Vcl.Graphics.TCanvas, its TextOut() and TextRect() methods do not use the Win32 API DrawText() function, they use the Win32 API ExtTextOut() function instead, where the value of the TCanvas.TextFlags property is passed to the fuOptions parameter of ExtTextOut(). The TextFlags property also influences the value of the TCanvas.CanvasOrientation property, which TextOut() and TextRect() use internally to adjust the X coordinate of the drawing.

    For right-to-left drawing with TCanvas, include the ETO_RTLREADING flag in the TextFlags property.


    Pour ce qui est de la saisie par contre c'est l'appel à l'éditeur qu'il va falloir modifier ce qui est faisable aussi.
    En début de journée, je ne vois qu'une méthode hyper banale en mettant un TEdit sur la grille qui recouvrira la zone en mode modification/insertion et dont le bidimode changera en fonction de la langue du livre. A moins que vous ne vouliez utiliser une méthode plus propre qui consistera à rajouter un Editeur personnalisé
    (faite des recherches avec les mots clés Delphi+DBGrid+ Custom Editor ou Inplace editor)

    [edit] à la place du DBGrid un VirtualTreeView pourrait s'envisager
    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 à l'essai
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    bonjour,

    la version de Delphi que j'utilise est Delphi 7.

    dans le même champ je veux dire la même colonne .

    au fait l'utilisateur souhaite quelque chose comme ci :
    Nom : im2.jpg
Affichages : 623
Taille : 139,0 Ko

    merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonsoir,

    @ Serge :

    à priori, au vu de l'image écran D7 mais je suis assez étonné d'y voir des caractères arabes D7 n'étant pas unicode
    Les caractères arabes sous D7 s'affichent correctement si on paramètre la langue dans le panneau de configuration de Windows: on change le langue par défaut à Arabe Algérie, on redémarre la bécane et le tour est joué...

    @ yab2000dz:

    Ce que tu cherches à faire, je doute qu'il y a une solution à cela : soit on met l'affichage de la grille de gauche à droite ou de droite à gauche ou centré. Ce n'est pas comme le tableur de Ms Word, on peut afficher chaque colonne et chaque ligne comme il nous semble(à droite, à gauche...).

    AMHA, je suis avec l'avis de SergioMaster, il faut jouer avec l'événement "DBGrid1DrawColumnCell".
    Et pourquoi ne pas mettre les ouvrages en français en couleur et ceux en arabe en une couleur différente?
    Ou la couleur de la ligne de la grille?
    Si cela te convient, ajoute un champ "langue" et dans le

    Dans l'événement "DBGrid1DrawColumnCell" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Table1.FieldByName('Langue').AsString = 'français' then
        DBGrid1.Canvas.Brush.Color := clRed
      else
        DBGrid1.Canvas.Brush.Color := clYellow;
    end;
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je croyais hier avoir mis un peu de code théorique mais j'ai du faire une fausse manip et raté le Edit.

    ce matin j'ai fait un petit test avec une stringgrid, par contre je ne me suis toujours pas mis à l'arabe écrit donc ce n'est qu'un test

    objectif 1 : changer la position du texte d'une colonne d'un stringgrid selon la parité de la ligne

    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
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var texte : string;
        l : Integer;
     
    begin
     with StringGrid1.Canvas do
       begin
         if ACol=2 then
           begin
             FillRect(Rect); 
             texte:=StringGrid1.Cells[Acol,ARow];
             l:=Length(texte);
             if Odd(ARow) then DrawText(Handle,PChar(texte),l,Rect,DT_LEFT OR DT_VCENTER)
                          else DrawText(Handle,PChar(texte),l,Rect,DT_RIGHT OR DT_RTLREADING OR DT_VCENTER);
    // il y a plus élégant avec un IfThen
    //       DrawText(Handle,PChar(texte),l,Rect,IfThen(Odd(ARow),DT_LEFT OR DT_VCENTER,DT_RIGHT OR DT_VCENTER  OR DT_RTLREADING));
           end;
       end;
    end;
    si j'en crois la doc de Microsoft il y a aussi un DT_RTLREADING toutefois il y a une condition : Que la fonte du texte soit une fonte Arabe ou Hébraique.

    il doit être facile de changer la fonte du canvas (si toutefois il y en a vraiment besoin sur vos postes ?)
    donc serait-ce aussi simple que simplement ajouter OR DT_RTLREADING à la fin du drawtext ? à vous de faire les tests !

    il faut bien sur que dans les colonnes de la table il y en ait une qui indique si l'ouvrage est en langue avec l'écriture de gauche à droite ou non. A mon avis un simple booleen plutôt que Table1.FieldByName('Langue').AsString = 'français' ou mieux une table des langues avec l'indication RTL ou non ainsi vous auriez une base permettant les livres autres que simplement français arabe
    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

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonsoir,

    Le code de Sergio Master fonctionne à merveille

    Les mots écrits en arabe s'affichent à droite et ceux écrits en occidental s'affichent à gauche.

    Voici le résultat obtenu :

    Nom : unnamed.jpg
Affichages : 593
Taille : 18,4 Ko

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    le sujet à été marqué comme résolu et pourtant yab2000dz ne nous indique pas ce qu'il a fait au niveau de l'éditeur, se contentant peut être de l'affichage ou ne voulant pas partager cette partie.

    Donc, pour en finir, voici un moyen, à tester bien sûr car je n'ai toujours pas appris à écrire en arabe, de faire de la saisie en changeant d'orientation selon les besoins

    il faut dans un premier temps créer une classe qui va nous permettre de "surclasser" la grille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      THackGrid = class(TCustomGrid)
      private
        FInplaceEdit: TInplaceEdit;
      protected
      public
      end;
    il suffit alors d'utiliser la classe pour pouvoir changer la propriété de l'éditeur
    dans l'exemple proposé (arabe dans les lignes paires)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // valeurs possibles de BidiMode 
    // TBiDiMode = (bdLeftToRight, bdRightToLeft, bdRightToLeftNoAlign, bdRightToLeftReadingOnly); 
     
    if Odd(Arow) then THackGrid(StringGrid1).FInplaceEdit.BiDiMode:=bdRightToLeft
                                  else THackGrid(StringGrid1).FInplaceEdit.BiDiMode:=bdLeftToRight
    reste plus qu'à trouver l'endroit (évènement) adéquat : je miserai sur le OnGetEditMask
    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

  9. #9
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonjour,

    Très bonne démonstration Serge

    Après test, ton code marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer;
      var Value: string);
    begin
     
    if Odd(Arow) then
    THackGrid(StringGrid1).FInplaceEdit.BidiMode:= bdRightToLeft
    else
    THackGrid(StringGrid1).FInplaceEdit.BidiMode:=bdLeftToRight;
    end;
    Nous avons espéré que yab2000dz nous donne son opinion dessus.

    Nabil

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    tous mes excuses pour sergiomaster et NABIL74, pour ne pas vous avoir informé plus tôt.
    je peux dire que le problème n'a pas été résolu, vu que je n'ai pas pu proposé a mon client la solution souhaitée.

    je me suis peut être mal exprimé.

    mon utilisateur souhaite affiché directement après traitement dans un DBGRID , la liste de ses ouvrages comme indiqué dans l'image écran, indépendamment de la parité de la ligne, parce que dans mon affichage je peux avoir plusieurs livres dans la même langue qui se suivent.

    pour l'apprentissage de l'arabe pour ce cas il suffit d'imaginer une écriture qui s'écrit de droite a gauche contrairement a la langue française.

    peut être que l'introduction d'éléments nouveaux dans mon application me compliquerai d'avantage la situation.

    pour le moment ce point a été reporté a plus tard, je ne manquerai pas de vous tenir au courant de nos prochaines avancées.

    encore une fois tous mes excuses.

    salutations.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par yab2000dz Voir le message
    mon utilisateur souhaite affiché directement après traitement dans un DBGRID , la liste de ses ouvrages comme indiqué dans l'image écran, indépendamment de la parité de la ligne, parce que dans mon affichage je peux avoir plusieurs livres dans la même langue qui se suivent.
    la parité de la ligne n'est là que pour le programme test pas pour votre application où il vous faudrait tester sur un champ de votre table indiquant si l'ouvrage est en langue occidentale ou en Bidi.

    peut être que l'introduction d'éléments nouveaux dans mon application me compliquerai d'avantage la situation.
    une colonne dans une table c'est pas la mer à boire
    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

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    bonjour,

    il est tard, je me pencherai sur le problème demain a la première heure

    remerciements

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

Discussions similaires

  1. héritage d'une classe pas dans le meme package
    Par marry dans le forum Général Java
    Réponses: 14
    Dernier message: 07/05/2009, 19h14
  2. Réponses: 6
    Dernier message: 30/03/2009, 19h13
  3. Réponses: 1
    Dernier message: 30/07/2007, 13h18
  4. Réponses: 4
    Dernier message: 12/06/2006, 12h46
  5. Réponses: 5
    Dernier message: 26/04/2006, 08h51

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