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 :

Traduction des composants


Sujet :

Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut Traduction des composants
    Bonjour,
    Pour permettre la traduction des composants, j'ai imaginé importer un tableau xls contenant le nom des composants dans la première colonne et les traductions dans les colonnes suivantes.
    J'imaginais ce code pour pouvoir à l'ouverture charger la langue (ici de la colonne 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    i:=1;
     Trad_xls_io.XLSImport('traduction.xls');                  // importation du fichier xls dans une table nommée TradGrid - composant TMS
     repeat                                                               //Boucler la lecture de la table
    (TradGrid.cells[0,i]).caption:=TradGrid.cells[1,i];      // assigner au Caption du composant le contenu de la colonne 1 (ou d'une autre colonne pour une autre langue)
    i:=i+1;
     until TradGrid.cells[0,i]<>'';                                 // jusqu'à la dernière ligne
    Malheureusement cela ne fonctionne pas
    J'ai essayé d'autres variantes mais pas mieux
    Si quelqu'un à une idée...
    Merci pour vos suggestions

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Vu que vous évoquez la propriété Caption, je vais supposer que c'est pour une application VCL...

    Ensuite récupérer le nom du composant (type string) et penser qu'en le mettant entre parenthèse, on va le typer en un contrôle dont on va pouvoir appeler une des propriétés est très illusoire.
    Uns chaîne de caractères ne peut être égale à une variable (ici une instance de classe), même si la lecture d'un code source pourrait laisser le croire...

    Il faut donc lire le nom du composant dans la cellule de la grille, rechercher celui-ci dans la fiche et si on le trouve, affecter à sa propriété la valeur de l'autre cellule de la grille.

    Cela donne en gros la méthode directe suivante :
    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
    procedure TForm1.Traduire;
    var
      i: Integer;
      ControlName: string;
      Control: TControl;
    begin
      Trad_xls_io.XLSImport('traduction.xls');
      i := 1;
      repeat
        // Récupérer le nom du contrôle
        ControlName := TradGrid.Cells[0, i];
        // Chercher le contrôle dans son parent = ici la fiche
        Control := FindChildControl(ControlName); 
        if Control <> nil then
          Control.Caption := TradGrid.Cells[1, i];
        i := i +1;
      until TradGrid.cells[0, i] = ''; // jusqu'à la première cellule vide !
    end;
    Attention, FindChildControl ne recherche que dans les enfants directs du contrôle. Il ne peut pas trouver un contrôle qui est un enfant d'un enfant du contrôle.
    Une recherche récursive devra sûrement être envisagée pour peu que la fiche intègre des contrôles qui en embarquent d'autres...


    Une autre méthode plus indirecte sera de passer par RTTI pour obtenir les propriétés d'un contrôle et les modifier, mais c'est toutefois plus complexe à mettre en œuvre bien que plus puissant...
    Philippe.

  3. #3
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Bonsoir Ph. B.
    J'ai malheureusement 2 soucis:

    J'ai beau mettre le nom complet par exemple: Form1.AskPassword.Label194
    (le composant Label194 étant sur le composant AskPassword qui est lui même sur le form1)
    mais
    Control := FindChildControl(ControlName);
    renvoie toujours nil :-/

    Aussi à la ligne: if Control <> nil then
    Control.Caption := TradGrid.Cells[1, i];
    je reçois une erreur de compilation:
    [DCC Erreur] Unit1.pas(5218): E2362 Impossible d'accéder au symbole protected TControl.Caption

    Merci pour tes conseils ;-)
    PhilLu

Discussions similaires

  1. traduction des composants : en français (gwt-ext)
    Par aurelientp dans le forum GWT et Vaadin
    Réponses: 16
    Dernier message: 18/10/2010, 13h01
  2. [MFC] acces a des composants
    Par abignon dans le forum MFC
    Réponses: 7
    Dernier message: 26/03/2004, 11h58
  3. [Kylix] Trouver des composants pour Kylix 3
    Par busy999 dans le forum EDI
    Réponses: 2
    Dernier message: 17/02/2003, 14h01
  4. Réponses: 1
    Dernier message: 26/01/2003, 15h13
  5. Réponses: 1
    Dernier message: 02/01/2003, 12h45

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