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

Composants VCL Delphi Discussion :

Feuille de style avec XML (pour expert !)


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Feuille de style avec XML (pour expert !)
    Bonjour !

    Je poste un nouveau message car je n'ai trouvé nulle part solution !!!

    J'aurais voulu savoir comment appliquer une feuille de style à mon interface Delphi à partir d'un fichier XML.

    Le fichier XML est déjà écrit :

    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
     
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
    - <root>
      - <Styles>
      - <GroupBox>
        - <Font>
        <Name>Verdana</Name> 
        <Color>14246912</Color> 
        <Size>12</Size> 
        <Bold>1</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </Font>
      - <Colors>
        <Border>14246912</Border> 
        <Focused>12581089</Focused> 
        </Colors>
        </GroupBox>
      - <Label>
      - <Font>
        <Name>Verdana</Name> 
        <Color>14246912</Color> 
        <Size>8</Size> 
        <Bold>0</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </Font>
        </Label>
      - <Edit>
      - <Font>
        <Name>Verdana</Name> 
        <Color>0</Color> 
        <Size>8</Size> 
        <Bold>0</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </Font>
      - <Colors>
        <Border>8421504</Border> 
        <Focused>12581119</Focused> 
        </Colors>
      - <Borders>
        <BorderStyle>1</BorderStyle> 
        </Borders>
        </Edit>
      - <CheckBox>
      - <Font>
        <Name>Verdana</Name> 
        <Color>14246912</Color> 
        <Size>8</Size> 
        <Bold>0</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </Font>
        </CheckBox>
      - <Grid>
      - <Font>
        <Name>Verdana</Name> 
        <Color>-2147483640</Color> 
        <Size>8</Size> 
        <Bold>0</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </Font>
      - <HeaderFont>
        <Name>Verdana</Name> 
        <Color>-2147483640</Color> 
        <Size>8</Size> 
        <Bold>0</Bold> 
        <Italic>0</Italic> 
        <Underline>0</Underline> 
        </HeaderFont>
      - <Colors>
        <SelectedRow>12581119</SelectedRow> 
        <SelectedCell>12581119</SelectedCell> 
        <Alternate>15066597</Alternate> 
        <Header>13421772</Header> 
        </Colors>
        </Grid>
        </Styles>
    </root>
    De cette façon, toutes les "form" devraient tenir compte de cette page XML sans que j'ai le besoin de toucher aux propriétés graphiques des objets. Mais je n'arrive pas à faire le lien entre Delphi et cette page.

    Le but est de pouvoir changer par exemple la couleur ou la taille des labels très rapidement et facilement pour proposer plusieurs styles.
    Le deuxième objectif est que l'objet sélectionné prend un couleur différente.

    Merci d'avance à ceux qui apporteront leur aide ou qui du moins essaieront car ce problème me paraît ardu même si je sais que cela est possible puisque je l'ai vu

    Jér


    PS : je travaille sous Windows 2000 pro, delphi 7.0 evaluation.

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    L'idée est intéressante, mais je pense qu'il faudrait que tu l'approfondisse.
    Tout d'abord, je ne pense pas que l'on puisse utiliser un mécanisme existant pour réaliser celle-ci, il faut donc développer ton propre mécanisme.
    Je vois plusieurs façons d'aborder ton "problème". Tu peux imaginer :
    • Une procédure capable d'appliquer les styles à n'importe quelle fenêtre existante.
    • Une classe capable d'appliquer les styles à toutes les fenêtres de l'application (plus délicat).
    • Une classe de fenêtre capable d'appliquer les styles à ces propres composants.
    • Des contrôles dérivés de TGroupBox, TLabel, etc capables de lire leurs propres styles.
    • Un composant, qui une fois posé sur la fenêtre, modifie le styles des contrôles qu'elle contient.

    Une des questions qui se pose est celle-ci : qui va lire le fichier xml, et quand ? A partir de là, l'application d'un style à un composant ne pose pas de difficulté particulière en utilisant RTTI.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut mon choix
    Que de solutions !

    En fait, toutes ces solutions sont potentiellement correctes je pense.
    D'ailleurs, dans la démo que j'ai vu, ils ont recréé des objets TlabelPerso, TPanelPerso, TRadiogroupPerso,... et ça me parait être une bonne solution. seulement, cela m'obligerait à redessiner TOUTE l'interface graphique or le temps m'est compté

    Je vais donc essayer de créer une procédure capable de changer les styles.
    Ou alors, comment recréer un composant que l'on appliquerait sur une "form" et qui dirait :

    tous les labels ont une font "verdana", couleur "verte", ... par exemple et ceux pour tous les composant principaux ?
    si tel objet (label, edit, radiogroup,...) est sélectionné, sa couleur devient "bleu" (par exemple)

    Sinon, g encore besoin de tes explications car je ne connais pas RTTI dont tu parles à la fin de ta première réponse...

    En tt cas, je te remercie de ton aide.

    PS : Le problème est que je n'ai pas eu de formation Delphi et donc que mes connaissances sont limitées.

  4. #4
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407

  5. #5
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut RTTI semble être la solution !
    Merci !

    RTTI, je ne connaissais pas ms ceci semble être un bon début de solution.
    Le code de la FAQ fonctionne comme il faut. ça avance !

    Cependant, je n'arrive pas à changer toutes les propriétés que je voudrais :
    notamment pour la police, taille, souligné ou pas, ... (d'un label)
    Comment peut on faire :
    par quoi faut il remplacer 'Color' ('Font' n'étant pas possible ni un 'Font.Color') de l'exemple et clRed puisque script par exemple n'est pas reconnu :

  7. #7
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Il faut d'abord récupérer la valeur de la propriété Font qui est une classe et utiliser les mêmes méthodes sur ses attributs.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut euh...po compris...
    Excuse moi ms ...

    je n'ai pas compris, c du charabia pour moi. Autant tu as l'air doué, autant je débute et donc forcément, je suis obligé d'être plus concret.
    Je ne sais pas comment on fait pour récipérer la valeur de la propriété Font et encore moins comment appliquer ça a ton code (de la FAQ).

    : C'est pas que je ne veux pas chercher mais là, je ne vois pas. :

    Une chose est sûre, j'aurais appris bcp de chose avec ce sujet ! 8)

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 20
    Points : 7
    Points
    7
    Par défaut Une réponse
    Voici une réponse possible !
    Il ne s'agit certainement pas de la meilleure ms ça marche bien.

    A la base, j'ai une page XML qui représente ma feuille de style :

    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
     
    <?xml version='1.0' encoding='ISO-8859-1' ?>
    <root>
      <GroupBox>
          <Font>
            <Name>Verdana</Name>
            <Color>14246912</Color>
            <Size>12</Size>
            <Bold>1</Bold>
            <Italic>0</Italic>
            <Underline>0</Underline>
          </Font>
          <Colors>
            <Border>14246912</Border>
            <Focused>12581089</Focused>
          </Colors>
        </GroupBox>
        <Label>
          <Font>
            <Name>Verdana</Name>
            <Color>14246912</Color>
            <Size>8</Size>
            <Bold>0</Bold>
            <Italic>0</Italic>
            <Underline>0</Underline>
          </Font>
        </Label>
    ...
    </root>
    Pour la partie Delphi,

    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
     
    begin
      if not OpenDialog1.Execute then exit;
      xmlDoc.LoadFromFile(Opendialog1.filename); // chargement de la feuille de style
      for i := 0 to MainFormDemo.componentCount - 1 do
      begin
         With XMLdoc.ChildNodes.Nodes['root'].childNodes do
         begin
            //PANEL
            if MainFormDemo.Components[i] is TPanel then
            begin
              With Nodes['GroupBox'].ChildNodes.Nodes['Font'].childNodes do
              begin
                 TPanel(MainFormDemo.components[i]).Font.Name := Nodes['Name'].Text;
                 TPanel(MainFormDemo.components[i]).Font.Color := Stringtocolor(Nodes['Color'].Text);
                 TPanel(MainFormDemo.components[i]).Font.Size := StrToInt(Nodes['Size'].Text);
                 styleText := '';
                 styleText := concat(Nodes['Bold'].Text,Nodes['Italic'].Text,Nodes['Underline'].Text);
                 case strToInt(styleText) of
                   111 : TPanel(MainFormDemo.components[i]).Font.style := [fsBold, fsItalic, fsUnderline];
                   110 : TPanel(MainFormDemo.components[i]).Font.style := [fsBold, fsItalic];
                   101 : TPanel(MainFormDemo.components[i]).Font.style := [fsBold, fsUnderline];
                   100 : TPanel(MainFormDemo.components[i]).Font.style := [fsBold];
                   011 : TPanel(MainFormDemo.components[i]).Font.style := [fsItalic, fsUnderline];
                   010 : TPanel(MainFormDemo.components[i]).Font.style := [fsItalic];
                   001 : TPanel(MainFormDemo.components[i]).Font.style := [fsUnderline];
                 end;
              end;
            end;
    // autres objets
    Il faudra placer un composant XML (liasions de données) et un opendialog pour que ça marche. Le tour est joué [/code]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2008, 14h27
  2. Compatibilité d'une feuille de style avec IE6 et IE7
    Par matimat2k4 dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 18/05/2008, 23h28
  3. Modification feuille de style avec javascript
    Par Invité dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/05/2007, 18h39
  4. Feuille de style avec Hover ne marchant pas avec IE
    Par ouioui2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/03/2006, 16h10
  5. acces feuille de style avec javascript
    Par lacsap49 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/02/2006, 14h45

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