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 :

erreur 'ShortString' en 'string'


Sujet :

Delphi

  1. #1
    Membre à l'essai
    erreur 'ShortString' en 'string'
    bonjour

    quelqu'un svp peut m'aider à résoudre cette erreur. L'erreur c'est dans la déclaration de la fonction ModbusCrc16String( msg:string): string

    j'ai comme ca comme erreur [dcc32 Avertissement] Unit1.pas(43): W1057 Transtypage de chaîne implicite de 'ShortString' en 'string'

    voir image ci-dessous

  2. #2
    Membre émérite
    Bonjour,

    il suffit de remplacer les AnsiChar par des Char. Et ça devrait être bon :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Result := Char(lo(crc)) + Char(hi(crc));

  3. #3
    Membre à l'essai
    je l'ai remplacé mais j'ai toujours un problème dans la fonction déclaré. ce problème qui apparaît

    [dcc32 Erreur] Unit1.pas(15): E2065 Déclaration forward ou external non satisfaite : 'TForm1.ModbusCrc16String'

  4. #4
    Expert éminent sénior
    c'est mieux qu'une image

    comme ModbusCrc16String est déclaré dans la TForm1 au dessus

    son implémentation doit être function function TForm1.ModbusCrc16String(msg: string): string;


    Peut-être que bosser les bases du langage avant de vouloir exploiter un périphérique ne serait pas une mauvaise idée ?
    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

  5. #5
    Membre à l'essai
    merci c'est résolu, en fait c’était Tform1 qui manquait

  6. #6
    Membre à l'essai
    j'ai essayé de tester mon programme donc j'ai ajouté un éditeur et Memo mais tjr des erreurs

    [dcc32 Erreur] Unit1.pas(33): E2010 Types incompatibles : 'Cardinal' et 'string'

  7. #7
    Membre émérite
    Citation Envoyé par ShaiLeTroll Voir le message
    c'est mieux qu'une image
    Citation Envoyé par ShaiLeTroll Voir le message
    Peut-être que bosser les bases du langage avant de vouloir exploiter un périphérique ne serait pas une mauvaise idée ?
    Comme le précise ShaiLeTroll :

    • la blaise code serait mieux que des images.
    • Bosser les base du langage serait bien, car essayer d'utiliser un IntToHex pour remplir un Edit.text, forcément ça ne va pas le faire.

  8. #8
    Membre à l'essai
    en fait l'idée c'est de demander à l'utilisateur de rentrer par exemple 01 01 48 00 00 10 dans Memo et recevoir le CRC sur éditeur sous format hexa

  9. #9
    Membre à l'essai
    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
    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
      FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.Edit;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Memo1: TMemo;
        Label1: TLabel;
        procedure Memo1Change(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
          function ModbusCrc16String(msg: string): string;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.fmx}
      procedure TForm1.Memo1Change(Sender: TObject);
     
      var CRC : LongWord;
    begin
    CRC := ModbusCrc16String(Memo1.Text);
    Edit1.Text := IntToHex(crc, 1);
    end;
     
    function TForm1.ModbusCrc16String(msg: string): string;
    var
      crc: word;
      n, i: integer;
      b: byte;
    begin
      crc := $FFFF;
      for i := 1 to length(msg) do
      begin
        b := ord(msg[i]);
        crc := crc xor b;
        for n := 1 to 8 do
        begin
          if (crc and 1) <> 0 then
            crc := (crc shr 1) xor $A001
          else
            crc := crc shr 1;
        end;
      end;
      result := char(lo(crc)) + char(hi(crc));
    end;
    end.

  10. #10
    Expert éminent sénior
    ModbusCrc16String retourne un string que vous affectez dans la variable CRC de type LongWord
    Apprendre la notion de typage fort du Delphi serait un pré-requis

    Vous devriez revoir la fin de la fonction ModbusCrc16String pour retourner un Word (un Word 16bits et non un LongWord 32Bits)
    Ensuite ce Word vous pouvez le convertir en Hexa
    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

###raw>template_hook.ano_emploi###