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 FMX Delphi Discussion :

Probleme classe Helper pour tcustomedit sous fmx DELPHI 11


Sujet :

Composants FMX Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 18
    Points
    18
    Par défaut Probleme classe Helper pour tcustomedit sous fmx DELPHI 11
    Bonjour,
    je developpe sous Delphi 11.1 FMX et ai créé une classe helper "TCustomEditHelper " pour un tedit.
    Le But est basique:
    Le but est de définir une propriete "value" (similaire au Tjvedit de JEDI) generique pour tout type (string,integer,float,...) .
    Pour cela j'ai créé un style "teditstyle_proto" avec des proprietes dont "proto_displayformat" qui memorise le type "value".
    Ce style est appliqué à chaque Tedit.

    Le probleme:
    Lors execution programme,
    -Si le tedit apparait sur l'écran: je peux acceder au Helper du tedit et aux valeurs des proprietes du style associé:TOUT est OK
    -Si (apres un scroll, une reduction taille form), le Tedit est caché sur l'ecran, alors
    1)je n'ai plus accès aux proprietes du Helper value=unassigned
    2)Les valeurs des propriétes du style associé sont vides (notamment "proto_displayformat").
    ce probleme est systematique pour tout Tedit dans différentes frames.

    Comportement bizarre que je n'arrive pas à résoudre; lié à FMX,ou un probleme de style,ou ..?
    J'ai lu qu'il ya avait qqle problemes ou restrictions d'usage de Helper mais je suis sec.

    Quelqu'un aurait t'il une idee ..si j'ai exposé assez clairement le probleme?
    Merci d'avance.
    bonne journée.

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    //=====================================
    //Unit:utEditproto.pas definition du Helper "TCustomEditHelper "
    //=====================================
    ....
    type
      TCustomEditHelper = class helper for TCustomEdit
      public
      //Setters/Getters
    
      procedure tedit_set_displayformat(vval:TProtoDisplayFormat);
      function tedit_get_displayformat:TProtoDisplayFormat;
    
      procedure tedit_set_decimalesplaces(vval:integer);
      function tedit_get_decimalesplaces:integer;
    
      procedure tedit_set_DisplaySuffix(vval:string);
      function tedit_get_displaySuffix:string;
    
      procedure tedit_set_DisplayPrefix(vval:string);
      function tedit_get_displayPrefix:string;
    
      function tedit_get_HasMinValue:boolean;
      function tedit_get_HasMaxValue:boolean;
      function tedit_get_MinValue:double;
      function tedit_get_MaxValue:double;
      function tedit_get_AllowEmpty:boolean;
    
    
      function tedit_get_color:longint;
      procedure tedit_set_color(vval:longint);
      //Autres fonctions
    
      procedure Clear;
      function CurrRangeValue(CheckValue: Currency): Currency;
      function FloatRangeValue(CheckValue: Double): Double;
      function IntRangeValue(CheckValue: Int64): Int64;
      function BcdRangeValue(const CheckValue: TBcd): TBcd;
      function BaseToInt(const BaseValue: string; Base: Byte): Int64;
      function IntToBase(NewValue: Int64; Base: Byte): string;
    
      procedure SetAsFloat(NewValue: Double);
      procedure SetAsInteger(NewValue: Int64);
      procedure SetAsBcd(const NewValue: TBcd);
      procedure SetValue(NewValue: Variant);
      function GetValue: Variant;
      //Properties
      published
      property DisplayFormat:TProtoDisplayFormat  read tedit_get_displayformat        write tedit_set_displayformat;
      property DecimalPlaces:integer              read tedit_get_decimalesplaces      write tedit_set_decimalesplaces;
      property DisplaySuffix:string               read tedit_get_displaySuffix        write tedit_set_DisplaySuffix;
      property Displayprefix:string               read tedit_get_displayprefix        write tedit_set_Displayprefix;
      property Color:longint                      read tedit_get_color                write tedit_set_color;
    
      property Value: Variant                     read GetValue                       write SetValue stored False;
      end;
    
    ....
    
    procedure TCustomEditHelper.tedit_set_displayformat(vval:TProtoDisplayFormat);
    var VStyleObject:TFmxObject;vvalstr:string;
    begin
    ApplyStyleLookup; // without this, FindStyleResource will return nil
    VStyleObject := FindStyleResource('proto_displayformat');
        if (VStyleObject <> nil)
        then begin
        vvalstr:=TProtoDisplayFormat_convert_str(vval);
          if vvalstr=''
          then raise exception.create('tedit_set_displayformat:ERR vvalstr=''')
          else TstyleTextObject(VStyleObject).text:=vvalstr;
        end
        else raise exception.create('tedit_set_displayformat:ERR '+TProtoDisplayFormat_convert_str(vval))
    end;
    
    function TCustomEditHelper.tedit_get_displayformat:TProtoDisplayFormat;
    var VStyleObject:TFmxObject;vvalstr:string;
        inObjFMX:TFmxObject;
        VStyleObjectparent:TFmxObject;
    begin
    result:=dfNone;
    //NeedStyleLookup;
    ApplyStyleLookup; // without this, FindStyleResource will return nil
    VStyleObject := FindStyleResource('proto_displayformat');
        if (VStyleObject <> nil)
        then begin
        vvalstr   :=TstyleTextObject(VStyleObject).text;
          if vvalstr=''
          then raise exception.create('tedit_get_displayformat:ERR tedit="'+name+'" vvalstr=''')
          else result    :=TProtoDisplayFormat_convertstr_enum(vvalstr);
        end
        else raise exception.create('tedit_get_displayformat:ERR lecture property')
    end;
    ....
    
    =================================
    //Frame prototype de toute frame
    //=====================================
    type
      Tfrm_proto = class(TFrame)
    ...
    procedure Tfrm_proto._TeditInit_DisplayFormat(VtControl:tControl;VTVarData:word;VnbDecimalesouuppercase:integer);
    var VTEdit:Tedit;Vvalcharcase:system.uitypes.TEditcharcase;
    begin
        if VtControl<>nil then
        begin
              if VtControl is Tedit then
              begin
                case VTVarData of
                  varInteger:begin
                  //Tjvvalidateedit(VtControl).DisplayFormat:=dfInteger
                  Tedit(VtControl).DisplayFormat:=dfFloat;
                  Tedit(VtControl).DecimalPlaces:=0;  //pour separateur de milliers uniqyement en dfFloat
                  Tedit(VtControl).Textsettings.HorzAlign := TTextAlign.Trailing;
                  Tedit(VtControl).Keyboardtype    :=TVirtualKeyboardType.NumberPad;
                  //Tedit(VtControl).text:='0'; //init valeur NON sinon Teditchange declenche et fonction de ctrlsaisie
                  end;
                  varDouble:begin
                  Tedit(VtControl).DisplayFormat:=dfFloat;
                  Tedit(VtControl).DecimalPlaces:=VnbDecimalesouuppercase;
                  Tedit(VtControl).Textsettings.HorzAlign := TTextAlign.Trailing;
                      if VnbDecimalesouuppercase=0
                      then Tedit(VtControl).Keyboardtype    :=TVirtualKeyboardType.NumberPad
                      else Tedit(VtControl).Keyboardtype    :=TVirtualKeyboardType.DecimalNumberPad;
                  //Tedit(VtControl).text:='0'; //init valeur NON sinon Teditchange declenche et fonction de ctrlsaisie
                  end;
                  varString:begin
                  Tedit(VtControl).DisplayFormat:=dfAlphaNumeric; //Sans Blanc
                  Vvalcharcase:=TEditcharcase(VnbDecimalesouuppercase);
                    case Vvalcharcase of
                      TEditcharcase.ecLowerCase:Tedit(VtControl).charcase:=Vvalcharcase;
                      TEditcharcase.ecUpperCase:Tedit(VtControl).charcase:=Vvalcharcase;
                    end;
                  Tedit(VtControl).Keyboardtype    :=TVirtualKeyboardType.Default;
                  //Tedit(VtControl).text:=''; //init valeur NON sinon Teditchange declenche et fonction de ctrlsaisie
                  end;
                  varEmpty:begin
                  Tedit(VtControl).DisplayFormat:=dfnone;//avec saisie blanc possible dfAlphaNumeric;
                  Vvalcharcase:=TEditcharcase(VnbDecimalesouuppercase);
                    case Vvalcharcase of
                      TEditcharcase.ecLowerCase:Tedit(VtControl).charcase:=Vvalcharcase;
                      TEditcharcase.ecUpperCase:Tedit(VtControl).charcase:=Vvalcharcase;
                    end;
                  Tedit(VtControl).Keyboardtype    :=TVirtualKeyboardType.Default;
                  //Tedit(VtControl).text:=''; //init valeur NON sinon Teditchange declenche et fonction de ctrlsaisie
                  end;
                  else
                  Tedit(VtControl).DisplayFormat:=dfnone
                end;
              end;
        end;
    end;
    
    //Init d'un TEdit: Uniquement type Tjvvalidateedit
    //Vdata :array= 0:VDisplaySuffix 1:VTVarData 2:VnbDecimales
    procedure Tfrm_proto._TeditInit_Display(VtControl:tControl;VData:TabVar;Venabled:boolean);
    var VTEdit:Tedit;
    begin
        if VtControl<>nil then
        begin
          if length(VData)>0  //VDisplaySuffix
          then _TeditInit_DisplaySuffix(VtControl,VData[0]);
        //_TeditInit_DisplayFormat
          case length(VData) of
            2: _TeditInit_DisplayFormat(VtControl,VData[1],0);
            3: _TeditInit_DisplayFormat(VtControl,VData[1],VData[2]);
          end;
          {
          if length(VData)>2  //VTVarData,VnbDecimales
          then _TeditInit_DisplayFormat(VtControl,VData[1],VData[2]);
          }
        //...
        _TcontrolSet_Enabled(VtControl,Venabled);
        end;
    end;
    
    //=====================================
    //Frame appelante: 
    //=====================================
    
    type
      Tfrm_renveloppe = class(Tfrm_proto)
    ...
    //--------------------------------------------------------------------------
    //Initialisation d'un tedit "ed_renveloppe_Surf" de type double,1 decimale 
    //--------------------------------------------------------------------------
    //ed_renveloppe_Surf
    _TeditInit_Display(ed_renveloppe_Surf,['',vardouble,1]);
    ...
    //--------------------------------------------------------------------------
    //Lecture valeur du Tedit "ed_renveloppe_Surf":
    //--------------------------------------------------------------------------
    var Vval:double;
    Vval:=ed_renveloppe_Surf.value;
    //--------------------------------------------------------------------------
    //Ecriture valeur du Tedit "ed_renveloppe_Surf":
    //--------------------------------------------------------------------------
    var Vval:double;
    ed_renveloppe_Surf.value:=Vval;
    Le style appliqué aux Tedit:
    Nom : styletedit.jpg
Affichages : 151
Taille : 86,8 Ko

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 309
    Points : 41 799
    Points
    41 799
    Billets dans le blog
    65
    Par défaut
    Moi qui croyais qu'un helper ne pouvait pas avoir de propriété
    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

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    bonjour, sergio,

    Merci de ta reponse... laconique.
    j'ai l'impression d'avoir fait une boulette, cest ca que je dois comprendre.

    En fait je pensais je n'avais pas de valeurs stockées dans le helper,
    car les properties appellent des valeurs stockées dans le style.

    La solution serait donc de remplacer toutes mes properties par des functions dans le Helper , c'est ca?

    Merci

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    rebonjour Sergio,
    j'ai corrige mon helper:
    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
     
    type
      TCustomEditHelper = class helper for TCustomEdit
      public
      //Setters/Getters
     
      procedure tedit_set_displayformat(vval:TProtoDisplayFormat);
      function tedit_get_displayformat:TProtoDisplayFormat;
     
      procedure tedit_set_decimalesplaces(vval:integer);
      function tedit_get_decimalesplaces:integer;
     
      procedure tedit_set_DisplaySuffix(vval:string);
      function tedit_get_displaySuffix:string;
     
      procedure tedit_set_DisplayPrefix(vval:string);
      function tedit_get_displayPrefix:string;
     
      function tedit_get_HasMinValue:boolean;
      function tedit_get_HasMaxValue:boolean;
      function tedit_get_MinValue:double;
      function tedit_get_MaxValue:double;
      function tedit_get_AllowEmpty:boolean;
     
     
      function tedit_get_color:longint;
      procedure tedit_set_color(vval:longint);
      //Autres fonctions
     
      procedure Clear;
      function CurrRangeValue(CheckValue: Currency): Currency;
      function FloatRangeValue(CheckValue: Double): Double;
      function IntRangeValue(CheckValue: Int64): Int64;
      function BcdRangeValue(const CheckValue: TBcd): TBcd;
      function BaseToInt(const BaseValue: string; Base: Byte): Int64;
      function IntToBase(NewValue: Int64; Base: Byte): string;
     
      procedure SetAsFloat(NewValue: Double);
      procedure SetAsInteger(NewValue: Int64);
      procedure SetAsBcd(const NewValue: TBcd);
      //value
      procedure SetValue(NewValue: Variant);
      function GetValue: Variant;
      function Value:Variant;
      //Properties
      end;
    MAIS le probleme est toujours là
    Lorsque une portion d'un Tedit est visible, TOUT est OK,
    Lors d'un Tedit est entierement caché sur la frame (suite à réduction taille de la frame, scroll,..),
    la propriete de style 'proto_displayformat' est lu mais est toujours vide:
    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
    function TCustomEditHelper.tedit_get_displayformat:TProtoDisplayFormat;
    var VStyleObject:TFmxObject;vvalstr:string;
        inObjFMX:TFmxObject;
        VStyleObjectparent:TFmxObject;
    begin
    result:=dfNone;
    //NeedStyleLookup;
    ApplyStyleLookup; // without this, FindStyleResource will return nil
    VStyleObject := FindStyleResource('proto_displayformat'); <=OK
        if (VStyleObject <> nil)<=OK
        then begin
        vvalstr   :=TstyleTextObject(VStyleObject).text;<=NONOK: vvalstr=''
          if vvalstr=''
          then raise exception.create('tedit_get_displayformat:ERR tedit="'+name+'" vvalstr=''')
          else result    :=TProtoDisplayFormat_convertstr_enum(vvalstr);
        end
        else raise exception.create('tedit_get_displayformat:ERR lecture property')
    end;
    Les 3 situation d'affichage de frame:
    Nom : styletedit2.jpg
Affichages : 121
Taille : 68,5 Ko
    A priori, une property sans stockage de valeur dans le helper était possible.
    Ce qui orienterait plutot sur un probleme avec les styles, non ?

    Merci.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 845
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 845
    Points : 13 622
    Points
    13 622
    Par défaut
    Si, un assistant peut déclarer des propriétés, ce qu'il ne peut pas est ajouter des champs.

    Je ne fais pas de FMX, donc n'ai pas clairement la réponse mais le comportement que tu évoques est similaire à ce qu'on rencontre avec UIAutomation : l'arborescence d'objets n'est complétée que quand le contrôle quitte l'état off-screen. Donc je dirais que c'est lié à la technologie utilisée.


    ps: évite de mettre en forme du texte (gras) dans un bloc de code, ça casse la mise en évidence par défaut et rend le code moins lisible pour le lecteur. Mets tes remarques sous la forme de // commentaire.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 309
    Points : 41 799
    Points
    41 799
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par spearman Voir le message
    Merci de ta réponse... laconique.
    J'ai l'impression d'avoir fait une boulette, c'est ça que je dois comprendre.
    Pas du tout, si la réponse est "laconique" c'est vraiment non voulu.
    Il était tard, pour moi, je trouvais ton code "intéressant" et la partie property "originale"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      published
      property DisplayFormat:TProtoDisplayFormat  read tedit_get_displayformat        write tedit_set_displayformat;
      property DecimalPlaces:integer              read tedit_get_decimalesplaces      write tedit_set_decimalesplaces;
      property DisplaySuffix:string               read tedit_get_displaySuffix        write tedit_set_DisplaySuffix;
      property Displayprefix:string               read tedit_get_displayprefix        write tedit_set_Displayprefix;
      property Color:longint                      read tedit_get_color                write tedit_set_color;
     
      property Value: Variant    tous             read GetValue                       write SetValue stored False;
      end;
    je me suis certainement arrêté à la lecture du terme property.

    Dans tous mes essais de Helpers j'ai toujours buté sur la partie propriétés, quand j'y arrivais, après l'écriture du helper je passais à la partie transformation en composant. Le hic, et c'est dans ma liste des todos, c'est d'inclure un style au sein d'un composant. Mais, ma liste des todos est longue et s'allonge

    Je ne sais pas, j'ai l'impression que ce qui est réellement cherché c'est de rajouter des types d'éditeurs (démarche totalement différente AMHA) fonction de


    En fait je pensais je n'avais pas de valeurs stockées dans le helper,
    car les properties appellent des valeurs stockées dans le style.
    Non, je ne crois pas le fait d'utiliser des valeurs dans le style n'ont rien à voir avec des propriétés, d'ailleurs tu l'as changé dans ton nouveau code.

    Reste la suite, je répondrai plutôt problème avec les fonctions et procédures.

    cette ligne ApplyStyleLookup; // without this, FindStyleResource will return nil m'interpelle. Et la propriété text aussi d'ailleurs.
    Dans mon écriture d'un composant (un radiogroupbox) j'ai pu remarqué que text était un truc très "sensible" on s'attend à modifier une chose et ce n'est pas là où l'on voulais que ce soit que s'affiche le texte.
    J'ai décrit cette aventure ici

    Pour ce qui est des propriétés du style, en fait je ne vois pas comment tu as ajouté les divers TProtoDisplayFormat D'ailleurs où sont-ils déclarés ces ProtoDisplayFormat, quelle unité ? c'est la première fois que je me retrouve dessus.

    J'ai l'impression que tu cherches plutôt à ajouter des éditeurs en fonction des données, AMHA pas du tout la même démarche que de changer un style.

    Il y a aussi une question niveau écrans, si je comprends bien les zones d'éditions sont dans une frame elle même dans un ScrollBox (ce dernier pourrait bien être une cause inattendu des problèmes que tu rencontres)
    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 à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    D'abord merci pour vos réponses reactives et pertinentes .

    En effet, mon idée 1ere était de m'affranchir des biblio JEDI dans le portage de mon application VCL vers mon appli multiplateforme FMX.
    Aussi, j'ai souhaité "refaire" l'equivalent des controles de JEDI(Tjvedit,...) en utilisant un style specifique enrichi pour mes controles (Tedit,tswitch,tcombo,...).

    cette ligne ApplyStyleLookup; // without this, FindStyleResource will return nil m'interpelle. Et la propriété text aussi d'ailleurs.
    Dans mon écriture d'un composant (un radiogroupbox) j'ai pu remarqué que text était un truc très "sensible" on s'attend à modifier une chose et ce n'est pas là où l'on voulais que ce soit que s'affiche le texte.
    J'ai décrit cette aventure ici
    Ma maitrise des styles est tres insuffisante et notamment usage des needstylelookup,applystyle,... .
    La ligne ApplyStyleLookup est à analyser en effet mais avait résolu des problemes lors du FindStyleResource qui retournait nil.

    Pour ce qui est des propriétés du style, en fait je ne vois pas comment tu as ajouté les divers TProtoDisplayFormat D'ailleurs où sont-ils déclarés ces ProtoDisplayFormat, quelle unité ? c'est la première fois que je me retrouve dessus.

    J'ai l'impression que tu cherches plutôt à ajouter des éditeurs en fonction des données, AMHA pas du tout la même démarche que de changer un style.

    Il y a aussi une question niveau écrans, si je comprends bien les zones d'éditions sont dans une frame elle même dans un ScrollBox (ce dernier pourrait bien être une cause inattendu des problèmes que tu rencontres)
    ==============================
    1)Creation d'un nouveau fichier style:
    -J'ai copié un fichier .style sur disque (des fichiers standards existent dans l'arborescence delphi) pour un theme donné, dans mon arborescence dev de l'application
    -J'ai lié un Tstylebook dans la forme principale avec ce nouveau fichier style dans le concepteur de style EDI
    2)Modification du nouveau fichier style pour ajout de proprietes "Styleobject":
    -Dans onglet "Concepteur de style" dans l'EDI de la Form principale après dblclic sur le stylebook
    -Copier/coller le style standard "teditstyle" dans "teditstyle_proto" dans la fenetre EDI/Structure
    -Copier/coller des proprietes styleobject dans le nouveau style "teditstyle_proto"
    -Maj les champs du nouveau styleobject stylename,...
    -et surtout de memoire, frequemment cliquer sur le bouton "Appliquer le style" comme recommande après chaque action dans le concepteur de style
    ===============================
    A noter Meme sans scrollbox avec par exemple un tedit dans un tpanel parent, le probleme est identique si l'on reduit la taille de la form lors de l'execution.

    AMHA ?

    Si, un assistant peut déclarer des propriétés, ce qu'il ne peut pas est ajouter des champs.
    Je ne fais pas de FMX, donc n'ai pas clairement la réponse mais le comportement que tu évoques est similaire à ce qu'on rencontre avec UIAutomation : l'arborescence d'objets n'est complétée que quand le contrôle quitte l'état off-screen. Donc je dirais que c'est lié à la technologie utilisée.
    ps: évite de mettre en forme du texte (gras) dans un bloc de code, ça casse la mise en évidence par défaut et rend le code moins lisible pour le lecteur. Mets tes remarques sous la forme de // commentaire.
    -"l'arborescence d'objets n'est complétée que quand le contrôle quitte l'état off-screen": Interessant effectivement TRES similiare.

    -La nouveauté constatée est dans le cas d'un parent tpanel du Tedit:La mise à visible ou non visible par code du tpanel parent engendre egalement le probleme

    En conclusion, il faut que je fasse une application minimale pour tester ce bug selon vos avis.
    et aussi me former plus correctement aux sacrés styles FMX encore bien obscures pour moi !
    Si autre chose vs venez à l'idée...encore merci
    Bonne journée.
    Nom : styletedit3.jpg
Affichages : 99
Taille : 107,0 Ko

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 309
    Points : 41 799
    Points
    41 799
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par spearman Voir le message
    Ma maitrise des styles est tres insuffisante et notamment usage des needstylelookup,applystyle,... .
    La ligne ApplyStyleLookup est à analyser en effet mais avait résolu des problemes lors du FindStyleResource qui retournait nil.
    Oui mais il est bizarre d'y avoir eu recours

    Citation Envoyé par spearman Voir le message
    et surtout de memoire, fréquemment cliquer sur le bouton "Appliquer le style" comme recommande après chaque action dans le concepteur de style
    Le fameux AFRO que j'avais pu "inventer" avec mon tutoriel sur les styles FMX XE4
    Cela a quand même évolué depuis la plupart du temps ce n'est plus la peine, par exemple quand on ferme l'onglet du concepteur un message demande la confirmation.
    Cependant pour le reste de la démarche je pense qu'il y a plus rapide l'option : éditer un style personnalisé serait plus "portable" en effet cela permet de répondre à tout changement de style applicable à la forme. Dans ce cas , en changeant de style principal, le style personnel prendra les nouvelles directives (ie couleurs) sans avoir à fournir/copier quoique ce soit.
    Pratique quand on veut le Clair/Sombre de plus en plus prisé


    Citation Envoyé par spearman Voir le message
    A noter Meme sans scrollbox avec par exemple un tedit dans un tpanel parent, le probleme est identique si l'on reduit la taille de la form lors de l'execution.
    Hum, TPanel en FMX est plutôt à bannir sauf cas particuliers, un TLayout ou un TRectangle. Mais effectivement cela montre que le problème reste entier

    Citation Envoyé par spearman Voir le message
    AMHA ?
    A Mon Humble Avis, IMHO en anglais

    Citation Envoyé par spearman Voir le message
    En conclusion, il faut que je fasse une application minimale
    Oui et fournir le ZIP entier .pas,.fmx,.proj ...

    Citation Envoyé par spearman Voir le message
    refaire les JEDI(Tjvedit,...)
    cela fait longtemps que je n'ai pas utilisé ces composants, je suis incapable de me remémorer les propriétés qui sont en extras par rapport au Tedit.
    En plus il faudrait que je comprenne ce qui est vraiment voulu avec ces divers ajouts
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 309
    Points : 41 799
    Points
    41 799
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Bien que n'ayant toujours pas compris l'objectif j'ai fait la chose suivante
    Nom : Capture.PNG
Affichages : 75
Taille : 122,7 Ko
    je pense que le style qui a été copié et modifié est "transparent.style" si non, il doit beaucoup s'en approcher

    j'ai préféré utiliser un style de base (transparent.style) et un autre stylebook pour mes "modifications"
    Nom : Capture_1.PNG
Affichages : 74
Taille : 101,2 Ko

    enfin un peu de code pour vérifier
    Nom : Capture_2.PNG
Affichages : 74
Taille : 93,3 Ko
    Critique : pour l'instant je fait une recherche direcetement dans le stylebook et non dans le style en cours (il faut que je retourne dans mes divers blogs, billets et tutos pour retrouver la bonne manière), de plus le rouge sombre c'est pas le top, tout comme le fait que j'ai écrit pour le bouton "Change Prefixe"

    voilà déjà le code pour faire vraiment un changement de préfixe qui montre l'utilisation de needstylelookup
    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
    uses FMX.Styles.Objects;
     
    procedure TForm26.Button1Click(Sender: TObject);
    var afmxobj : TFmxObject;
        styleprop : string;
    begin
     styleprop:=Edit1.StyleLookup+'.prefixe';
     afmxobj:=StyleBook1.Style.FindStyleResource(styleprop);
     if assigned(afmxobj)  then
      begin
        if afmxobj is TStyleTextObject then begin
           showmessage(TStyleTextObject(afmxobj).text);
           TStyleTextObject(afmxobj).text:='Nouveau';
           TStyleTextObject(afmxobj).Color:=Talphacolors.Greenyellow;
           Edit1.NeedStyleLookup;
        end;
      end
      else  showmessage('oops');
    end;
    Nom : Capture.PNG
Affichages : 74
Taille : 64,8 Ko

    Reste que, l'éditeur se trouve plus ou moins caché par le préfixe d'où ma réflexion que c'est l'ajout d'un éditeur plutôt qu'une modification de style qui est recherché mais ça c'est un sujet que je n'ai pas encore maitrisé.
    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

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Bonjour sergio,
    Merci pour le tps que tu as passé. Je vais corriger mes lecture/ecriture de style selon ton test.

    Critique : pour l'instant je fait une recherche direcetement dans le stylebook et non dans le style en cours (il faut que je retourne dans mes divers blogs, billets et tutos pour retrouver la bonne manière), de plus le rouge sombre c'est pas le top, tout comme le fait que j'ai écrit pour le bouton "Change Prefixe"

    voilà déjà le code pour faire vraiment un changement de préfixe qui montre l'utilisation de needstylelookup
    Code :
    J'ai pris le temps de faire une application minimalisme sur une forme incluant une frame derivée d'une frame proto, et incluant qqles tedit de style specifique.
    Pour l'instant, je n'ai pas encore pu regenerer mon bug soit:
    -perte accès style aux tedit hors zone affichage (apres resize de la form,...)
    je remonte le fil petit à petit.
    Bonne journée.

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 309
    Points : 41 799
    Points
    41 799
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Moi qui croyais qu'un helper ne pouvait pas avoir de propriété
    En fait ce n'est pas tout à fait vrai, je suis tombé sur
    qui montre que l'on peut utiliser des getters et setters pour des propriétés existantes
    Le mot clé est existantes, on ne peux pas ajouter de nouvelles propriétés dans un Helper mais on peut proposer des getters et setters donc atteindre une propriété non publiée.

    En tout cas, merci, cette discussion m'a un peu relancé sur les styles et helpers. Du coup j'ai produit un billet permettant la "colorisation" d'un FMX.TBindNavigator. Depuis 2 jours, totalement improductifs, je galère désormais pour en faire un composant
    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

Discussions similaires

  1. création de classe personnelle pour utilisation sous Lyx
    Par redouane64 dans le forum Programmation (La)TeX avancée
    Réponses: 5
    Dernier message: 07/03/2016, 10h19
  2. Class Helper pour les Array
    Par topolino dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/12/2014, 14h34
  3. [CR.NET] Problème de connexion pour un sous-état
    Par HULK dans le forum Connectivité
    Réponses: 16
    Dernier message: 02/06/2009, 11h37
  4. Problème classe livre pour bibliothéque
    Par Invité dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 06/12/2008, 10h57
  5. Réponses: 4
    Dernier message: 21/07/2006, 14h27

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