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

 Delphi Discussion :

FileStream Position avec variable string


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut FileStream Position avec variable string
    Bonjour

    J'ai un petit problème qui me bloque dans ma programmation. Je n'arrive pas à faire passer une variable que je récupére dans un fichier ini. La variable est une adresse en hexa (Offset1=0x202FBC) J'ai déclaré une variable en string pour pour pouvoir la récupérer et la retravailler en 202FBC.

    Mon problème est que je ne sais pas comment la modifier pour l'utiliser avec un Tstreamfile.Position. SI une personne pouvait m'éclairer cela serait top. Merci d'avance

    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
     
    var
      Offset                          : String;
      Patch_Ini                       : TIniFile;
      Fichier                         : TStream;
      Empla_Com                       : integer;
     
    begin
       Fichier:=TFileStream.Create(Edit1.text,fmOpenWrite);
       Patch_Ini:=TIniFile.Create(Edit2.text);      
       Offset := Patch_Ini.ReadString('Version','Offset','');
       Empla_Com := Pos(';',Offset); //Verif de la présence de commentaire.
       if Empla_Com <> 0 then Offset := AnsiLeftStr(Offset, Empla_Com-1) //Suppresion des commentaires s'il y en a
     
       Offset := Trim(StringReplace(Offset, '0x', '', [rfReplaceAll, rfIgnoreCase]));
       Fichier.Position := ; //<- C'est ici que je bloque.
     
       Fichier.Free;
    end;

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Quel est le but, le Stream pour le moment est inutile
    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
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    Apres je vais voir une chaine a copier au niveau de l'adresse renseignée. Les données sont aussi stockés dans un fichier ini au format suivant : Code=0x32, 0x00, 0x00, 0x00.
    Je n'ai pas encore fait le code pour aller plus loin car j'aurais eu le meme probleme que pour la position.

    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
     
    var
      Offset, code                         : String;
      Patch_Ini                       : TIniFile;
      Fichier                         : TStream;
      Empla_Com                       : integer;
      List_Code :                    : TStrings;
     
    begin
       Fichier:=TFileStream.Create(Edit1.text,fmOpenWrite);
       Patch_Ini:=TIniFile.Create(Edit2.text);      
       Offset := Patch_Ini.ReadString('Version','Offset','');
       Empla_Com := Pos(';',Offset); //Verif de la présence de commentaire.
       if Empla_Com <> 0 then Offset := AnsiLeftStr(Offset, Empla_Com-1) //Suppresion des commentaires s'il y en a
     
       Offset := Trim(StringReplace(Offset, '0x', '', [rfReplaceAll, rfIgnoreCase]));
       Fichier.Position := ; //<- C'est ici que je bloque.
     
       Code := Patch_Ini.ReadString('Version','Code','');
       Code := StringReplace(Code, '0x', '', [rfReplaceAll, rfIgnoreCase]);
     
       List_Code := TStringList.Create;
       List_Code.Text := StringReplace(Code, ',', #13#10 , [rfReplaceAll]);
     
      // Apres je ferais une boucle pour les saisirs 
     
     
       Patch_Ini.Free; 
       Fichier.Free;
    end;

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    StrToInt gère 0x et $ pour convertir un hexa en décimal donc si la valeur chaine '0x202FBC' dans le fichier cela se converti tout seul
    Vous ne devriez pas gérer le ; en fin de ligne, ce n'est pas conforme à un Fichier Ini, cela complique votre code inutilement
    Le commentaire est sur la ligne précédente

    Offset et Code ne devrait pas être des string mais le type cible directement
    Vous pouvez faire une variable comme tmp: string; juste pour la lecture de la valeur avant de la convertir même si cela n'est pas particulièrement utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier.Position := StrToInt(Patch_Ini.ReadString('Version', 'Offset', '0'));
    Donc Offset devrait être Integer
    Vous pouvez utiliser un TryStrToInt pour vous prémunir de valeur incorrecte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmp := Patch_Ini.ReadString('Version', 'Offset', '');
    if not TryStrToInt(tmp, Offset) then
      Abort; // attention n'oubliez pas les try finally Free ...
    si vous souhaitez gérer le commentaire tout de même, faite quelque chose de réutilisable, autant rendre la gestion de commentaire systématique sans alourdir le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier.Position := StrToInt(ExtractCommentedValue(Patch_Ini.ReadString('Version', 'Offset', '0')));
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmp := ExtractCommentedValue(Patch_Ini.ReadString('Version', 'Offset', ''));
    if not TryStrToInt(tmp, Offset) then
      Abort; // attention n'oubliez pas les try finally Free ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ExtractCommentedValue(const S: string): string;
    var
      I: Integer;
    begin
      I := Pos(';', S);
      if I > 0 then
        Result := Copy(S, 1, I - 1);
      else
        Result := S;
    end;


    Ensuite Code devrait être un Byte facile ensuite à écrite avec un Stream.Write(Code, 1);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Code := StrToInt(Patch_Ini.ReadString('Version', 'Code', '0'));
    Si Code contient en réalité un tableau, un TStringList CommaText pour le récoupage puis un boucle sur StrToInt
    Cependant réfléchir à la conversion plutôt à utiliser un Binaire directement avec un array of Byte chargé directement avec 0x32000000 voir même 0x3200112233445566778899 .... rien n'oblige à découper en 0x32, 0x00, ... ce qui est lourd pour rien surtout qu'avec la fonction HexToBin on peut jouer facilement pour passer d'une string à un Stream binaire.
    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 éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       //Offset := Trim(StringReplace(Offset, '0x', '', [rfReplaceAll, rfIgnoreCase]));
       Fichier.Position := StrToInt(Offset); //<- C'est ici que je bloque.
    [Edit]
    Oops j'ai pas rafraichi la page avant de poster
    [/Edit]
    Cordialement,
    @+

  6. #6
    Membre du Club
    Homme Profil pro
    Animateur commercial
    Inscrit en
    Août 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Animateur commercial

    Informations forums :
    Inscription : Août 2011
    Messages : 47
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup ShaiLeTroll et Cirec d'après les premiers tests cela fonctionne.

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

Discussions similaires

  1. [PowerShell] Lancer une commande dir avec variable string
    Par chris1984 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 28/12/2012, 17h11
  2. Former un nom d'instance avec un string et une variable
    Par Moony Light dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 24/10/2008, 20h09
  3. Réponses: 2
    Dernier message: 06/11/2007, 13h23
  4. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22

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