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

Langage Delphi Discussion :

la partie gauche n'est pas affectable


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut la partie gauche n'est pas affectable
    Hi everybody.

    Je suis en train de modifier les unités d'un composant d'une compagnie qui n'existe plus pour l'intégrer à DXE.


    Au moment de recompiler, j'ai une erreur sur une ligne que je n'ai pas modifié, et je ne comprends pas cette erreur.
    L'erreur est : la partie gauche n'est pas affectable.
    sur l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myClass.ProcArrays.FSetValueProcs[akMethod].AsStrMethod := nil;
    Que faut il faire comme modification pour pouvoir compiler ?

    Code complet (simplifié pour l'occasion bien sur):
    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
     
      TDCBooleanMethod     = function:boolean of object;
      TDCStringMethod      = function:AnsiString of object;
      TDCNoParamsMethod    = procedure of object;
      TDCGetValueAt        = procedure(Index:Integer;Var ResultVar) of object;
      TDCSetValueDataPtr   = procedure(DataPtr:Pointer) of object;
     
      TDCSetValue          = procedure(const Value:AnsiString) of object;
      TDCGetValues         = procedure(Proc:TGetStrProc) of object;
     
      TDCPropProcKind=(
        ikAllEqual,ikGetValue,ikGetValues,ikSetValue,ikEdit,
        //----------
        ikSetValueByDataPtr,ikGetValueAt,ikEditLimit,ikPropAttrs);
      TDCPropAccessKind=(
        akInvalid,akDefault,akShortCut,akModalResult,akCursor,akColor,akImeName,akFontCharSet,
        akEnum,akSetElem,akMethod,akComponent,akFontName,akDateTime,akTime,akDate,
        akInt64,akClass,akSet,akStr,akFloat,akInt,akChar,aktElem,akOrd,akVar,
        akMPFileName,akFont
      );
     
      TDCProcArrayItem=record
        ProcWasUsed:boolean;
        case Byte of
          1:(AsBoolMethod   : TDCBooleanMethod);
          2:(AsStrMethod    : TDCStringMethod);
          3:(AsNoParams     : TDCNoParamsMethod);
          4:(AsGetValueAt   : TDCGetValueAt);
          5:(AsSetDataPtr   : TDCSetValueDataPtr);
          6:(AsSetValue     : TDCSetValue);
          7:(AsGetValues    : TDCGetValues);
      end;
      PDCProcArray=^TDCProcArray;
      TDCProcArray=Array[TDCPropAccessKind] of TDCProcArrayItem;
     
      TDCProcArrays=record
        case Byte of
          0:(
            FAllEqualProcs        : TDCProcArray;//ikAllEqual,
            FGetValueProcs        : TDCProcArray;//ikGetValue,
            FGetValuesProcs       : TDCProcArray;//ikGetValues,
            FSetValueProcs        : TDCProcArray;//ikSetValue,
            FEditProcs            : TDCProcArray;//ikEdit,
            FSetValueDataPtrProcs : TDCProcArray;//ikSetValueByDataPtr,
            FGetValueAtProcs      : TDCProcArray;//ikGetValueAt,
            //ikEditLimit,
            //ikPropAttrs
          );
          1:
           (ProcArray:Array[TDCPropProcKind] of TDCProcArray);
      end;
     
      TMyClass = class
       private
       fProcArrays :TDCProcArrays;
       public
       property ProcArrays :TDCProcArrays read fProcArrays  ;
      end;
     
     
    var
      Form1: TForm1;
     
     
    implementation
     
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    myClass:TMyClass;
    begin
     myClass := TMyClass.Create;
     myClass.ProcArrays.FSetValueProcs[akMethod].AsStrMethod := nil;
     
     myClass.Free;
     
    end;

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Vouloir migrer toi même DreamScript, bon courage !
    tu devrais passer au TMS Script qui est son successeur

    Ce code a-t-il déjà fonctionné ?
    Modifié la valeur d'un record en propriété n'a jamais fonctionné : Property de type Record en Delphi 2010

    Tu as déjà tenté comme le sujet l'aide E2064: La partie gauche ne peut être affectée à (Delphi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property ProcArrays :TDCProcArrays read fProcArrays write fProcArrays  ;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Bonjour
    Non, ce n'est pas cela. j'ai ajouté le write fProcArrays et ça ne compilait pas non plus.
    En revanche , j'ai modifié myClass.ProcArrays.FSetValueProcs[akMethod].AsStrMethod := nil; par myClass.rProcArrays.FSetValueProcs[akMethod].AsStrMethod := nil; et là ça compile.

    Il semblerait qu'on ne peut pas accéder à un champ d'une propriété de type record, mais qu'on peut accéder à un champ d'un champ de type record.



    Code simplifié :


    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
      TMyRecord = record
       case byte of
          1:(AsBoolMethod   : pointer);
          2:(AsStrMethod    : pointer);
      end;
     
      TMyClass = class
       private
       fMyRecord:TMyRecord;
       public
       property MyRecord:TMyRecord read fMyRecord;
      end;
     
     
    var
      Form1: TForm1;
     
     
    implementation
     
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    myClass:TMyClass;
    begin
     myClass := TMyClass.Create;
     //myClass.MyRecord.AsBoolMethod := nil; //Ne compile pas 
     myClass.fMyRecord.AsBoolMethod := nil; //compile
     
     myClass.Free;
     
    end;
    Cependant , le code du composant était livré comme ça, et je me demande s'il n'y a pas une option d'environnement à modifier dans delphi pour que ça puisse compiler sans modifier le source

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Ha tiens, tu as du changer ton message..
    Effectivement j'essais de migrer le composant dreamScripter.
    Ce n'est pas simple.
    Mais j'ai testé d'autres scripters et ils sont bcp moins performants.
    Pour des scripts longs (plus de 100000 lignes) dreamScripter execute le code en 2 dixièmes contre 10 secondes pour tms.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Citation Envoyé par butch Voir le message
    Cependant , le code du composant était livré comme ça, et je me demande s'il n'y a pas une option d'environnement à modifier dans delphi pour que ça puisse compiler sans modifier le source
    Il semble que le compilateur ait été durci à ce sujet !
    Car cela utilise le Getter pour faire une affectation en contournant le Setter !

    Pour moi, ton code contourne le Setter, c'est une grave Erreur !
    Que cela fonctionne est en soit une erreur, j'aurais pensé qu'en D7 cela ne fonctionne pas non plus, ce code m'étonne franchement !


    En C++Builder, c'est une des complexité, on peut modifier des types comme Set (typiquement Anchors ou TFontStyles) mais aussi des Struct sans que cela appel le Setter ce qui provoque des Bugs ou des modifications sans Effet

    En fait, mieux vaut éviter de modifier des record en propriété !
    Par habitude, j'ai toujours considérer ces valeurs comme des constantes, et j'offrais une série de fonction pour en modifier les valeurs !
    Je te conseille de faire de même !

    Pense qu'affecter un record cela provoque une copie, c'est donc couteux en performance.

    Ton code fonctionne car tu es dans l'unité !
    En dehors de l'unité, private sera inaccessible !
    Avec strict private cela ne serait même pas possible

    C'est des très gros Script !
    Cela m'impressionne, une fois, une société a voulu me recruter pour faire du Delphi Script sur un outil de gestion d'impression, maintenant je comprends, des personnes sont assez dingue pour écrire des scripts de 100 000 lignes !

    Pour moi, le choix de Delphi Script doit être limité à de petites utilisations (je l'ai principalement utilisé pour du WorkFlow configurable et de l'affichage ou contrôle de saisie personnalisés)
    A la limite choisir du VBS c'est inclu à l'OS, cela permet bcp de chose dont le Late Binding sur ton objet COM, cela semble un choix plus perenne !

    Pour des scripts aussi ambitieux mieux vaut se tourner vers Perl, Python, R ... des langages conçus pour le script et nettement plus performant
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Merci pour ton aide.
    A+

  7. #7
    Membre éprouvé
    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
    Points : 963
    Points
    963
    Par défaut
    On peux aussi passé par réference
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PDCProcArrays = ^TDCProcArrays.
     
    PDCProcArrays (@myClass.ProcArrays).FSetValueProcs[akMethod].AsStrMethod := nil;

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/12/2012, 13h59
  2. [Batch] %ERRORLEVEL% n'est pas affecté.
    Par SIMMMMM dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 20/08/2009, 14h37
  3. Partie gauche n'est pas affectable.
    Par Abdou dans le forum Langage
    Réponses: 4
    Dernier message: 13/01/2009, 10h26
  4. Une partie du code n'est pas exécutée
    Par eddy37fr dans le forum VBA Access
    Réponses: 4
    Dernier message: 31/03/2008, 19h11

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