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

Contribuez Delphi Discussion :

Structure pour gerer TColor


Sujet :

Contribuez Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut Structure pour gerer TColor
    Structure pour gerer le couleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       TColorRec = record
       case integer of
        0:(Color:Cardinal);
        1:(Bytes:array[0..3]of byte);
        2:(R,G,B,Alpha:Byte);
        3:(SysColorIdx:word;UnUsed:byte;IsSysColor:boolean);
       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
    procedure TForm1.Button1Click(Sender: TObject);
    var
     C:TColor;
    begin
     
     C := clWindow;
     
     if TColorRec(C).IsSysColor then
        C:=windows.GetSysColor(TColorRec(C).SysColorIdx);
     
     with TColorRec(C) do
       ShowmessageFmt('Color:%x '#10'R:%x, G:%x, B:%x',[Color,R,G,B]);
     
    end;

  2. #2
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    trés bien, juste un truc :

    Color en LongWord c'est bien pour GDI+
    par contre le type TColor et bel et bien un LongInt (voir déclaration de TColor).

    la plupart des méthodes pour savoir si il s'agit d'une couleur système font le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Color < 0 then
      Color := GetSysColor(Color xor clSystemColor);
    ce qui invaliderai donc le test, et forcerais à tester comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (color and clSystemColor) <> 0 then ...

    et bien sur ne pas oublier le "packed" pour le record.

    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      TColorRec = packed record case LongInt of
        0: (Color       : LongInt);
        1: (ColorRef   : DWORD);
        2: (Bytes       : array [0..3] of byte);
        3: (R, G, B, A  : Byte);
        4: (SysColorIdx : word; _unused : byte; IsSysColor: boolean);
      end;
    l'idée de IsSysColor est bonne, trés explicite, même si il est plus simple de faire le test décrit plus haut (si on utilise pas de structure de ce type) mais beaucoup moins facile à retenir puisqu'il ne faut pas oublier le "xor clSystemColor" ou faire un "and $00FFFFFF" ce qui est plus contraignant.

    le fait de pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if CR.IsSysColor then
      CR.Color := GetSysColor(CR.SysColorIdx);
    est une approche intéressante.

    voila.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Color en LongWord c'est bien pour GDI+
    par contre le type TColor et bel et bien un LongInt (voir déclaration de TColor).
    lol j'ai l'impression que je vois ça pour la première fois !

    et bien sur ne pas oublier le "packed" pour le record.
    Pas pour cette fois la structure est déjà alignée...si on a un problème on recharge via TColor et on utilise le cast...mais par précaution je le remis

    Merci beaucoup Who

  4. #4
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    Citation Envoyé par Montor Voir le message
    lol j'ai l'impression que je vois ça pour la première fois !
    TGPColor (tiré de la GDI+) est un longword
    COLORREF (tiré du SDK win32) est un DWORD
    TColor (tiré de Graphics.pas) est un LongInt (-$7FFFFFFF-1..$7FFFFFFF)
    clSystemColor est egal à $FF000000 (= nombre négatif)


    prend GLScene, ou quelques unit GDI+, les méthodes de conversion
    TColor -> GLColor ou TColor -> GPColor se font via la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
      if Color < 0 then
        Color := GetSysColor(Color xor clSystemColor);
     
      .. traitement GL ou GP ..
    puisqu'il est plus simple de faire un test sur 0 (appel d'instruction jz ou jnz) que de faire un test sur des valeurs positive ou négative (jne, jb, ja ...)

    par contre, il est vrai que pour les PNG 32bits et Bitmap 32bits, on peu utiliser un LongWord puisque l'espace RGBA de ces deux format est stocké dans un entier non signé.

    d'ou l'ajout du champ ColorRef : DWORD dans la structure.
    bien qu'inutile puisque la valeur de l'octet 0 se trouve forcement dans le champ A : byte.

    de toute façon, on part du principe que le dev sais exactement dans quel espace colorimetrique il travail RGB, RGBA, BGR, BGRA etc.
    et puis ici, il n'est pas question d'utiliser cette structure avec GLScene ou GDI+, l'ordre de R,G,B,A n'etant pas le même et encore moins pour GLScene puisque le GLColor est avec flottants.

    voilou
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. Package pour gerer le protocole NNTP (Newsgroups) ???
    Par Gunsnake dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/04/2006, 12h39
  2. Shell - Problème pour gérer les majuscules et minuscules
    Par claralavraie dans le forum Linux
    Réponses: 6
    Dernier message: 11/01/2006, 17h17
  3. Réponses: 3
    Dernier message: 28/09/2005, 08h39
  4. formualaire access pour gerer bases sql server
    Par attavus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 11h01
  5. [Conception] Meilleures solutions pour gérer le multilangage
    Par scorpiwolf dans le forum Général Java
    Réponses: 3
    Dernier message: 06/07/2004, 16h11

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