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 :

RIO, TMemo et Blockread


Sujet :

Composants FMX Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut RIO, TMemo et Blockread
    Bonjour

    En voulant lire le premier octet d'un fichier, je me retrouve devant un comportement inquiétant.
    Si quelqu'un voulait tester le petit bout de code suivant sous RIO, ça m'arrangerait

    Nouveau projet FMX, je pose juste un TButton et un TMemo

    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
     
    procedure TForm2.Button1Click(Sender: TObject);
    const
      N = 'G:\Doccf.pdf';               //  remplacer par le nom de fichier de votre choix
    var
      F: File;
      B: Byte;
    begin
      AssignFile(F, N);
      FileMode := fmOpenRead;
      Reset(F);
      BlockRead(F, B, 1);
      Memo1.Text := B.ToString;
      CloseFile(F);
    end;

  2. #2
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Bonjour,

    Il faut indiquer avec Reset la taille de l'enregistrement que tu veux lire, si tu ne le précises pas, la taille de l'enregistrement par défaut est de 128 octets


  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    bon, j'ai testé et trouvé une erreur dans ton code.

    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
    procedure TForm28.Button1Click(Sender: TObject);
    var
      F: File;
      B: Byte;
    begin
    if OpenDialog1.Execute then
     begin
      AssignFile(F, OpenDialog1.FileName);
      FileMode := fmOpenRead;
      Reset(F,1); // << Ici  
      BlockRead(F, B, SizeOf(B));
      Memo1.Text := B.ToString;
      CloseFile(F);
     end;
    end;
    En fait l'aide m'a été utile pour déterminer pourquoi cela m'envoyait balader avec ton code, mais cette même aide me file les jetons
    Avertissement : C'est une ancienne méthode qui est particulièrement dangereuse à utiliser en raison du paramètre Buf non typé, conduisant à une corruption potentielle de la mémoire. La taille d'enregistrement utilisée par BlockRead et BlockWrite est gérée par le second paramètre facultatif de l'appel de Reset ou Rewrite ayant été utilisé pour ouvrir le fichier écrit. Il est préférable d'utiliser les flux dans vos applications. Par exemple, une procédure utilisateur impliquant un flux peut utiliser TMemoryStreams et TFileStreams, au lieu d'être limité à l'utilisation des fichiers comme avec ces anciennes routines.
    Je pense que, sagement, il vaudrait mieux passer par les streams comme préconisé par l'aide.
    Moi je dis ça, je dis rien je me suis juste contenté de tester ton code

    [Edit] Grillé par free07 le temps que j'épistole
    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

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Je débarque alors que docwiki est en rade, mais y a aussi quelques perles dans System.IOUtils.TFile pour la lecture de fichiers sans écrire des tonnes de code. N'hésitez pas à y jeter un coup d'oeil.

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    J'avais vu l'aide sur le buffer non type mais vu qu'on donne la taille à récupérer, je ne vois pas pourquoi ça pète la mémoire comme ça au blockread.

    Alors, oui, avec un TFileStream, ça va mais je pense aux anciens projets qui pourraient utiliser ça et qu'il faudrait penser à migrer.
    C'est le genre de truc à se faire des nœuds au cerveau si ne sait pas que c'est "dangereux"

    Encore que j'ai du mal à comprendre que ça ne soit pas corrigé ou balisé.

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par pprem Voir le message
    Je débarque alors que docwiki est en rade, mais y a aussi quelques perles dans System.IOUtils.TFile pour la lecture de fichiers sans écrire des tonnes de code. N'hésitez pas à y jeter un coup d'oeil.
    Le but est de lire la structure d'un dbf: https://docs.microsoft.com/en-us/pre...75386(v=vs.71)

    TFile me permettra effectivement de lire le fichier sous la forme d'un tableau d'octets que je traiterai dans un second temps.

  7. #7
    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
    Que cela soit TFileStream.Read ou BlockRead, je ne vois pas trop la différence, les deux sont avec un buffer non typé
    On les a utilisé des années, tant que l'on est en environnement Windows, c'est maitrisé et sans risque particulier.

    Papy, tu peux déclarer un packed record qui mappe ta structure des 32 premiers octets et une autre structure pour 31-264
    un BlockRead avec un Reset en 32 pourrait très bien passé

    en {$Z1}, c'est un Byte pour stocker de 0 à 255 (FF)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TFileType = (ftFoxBase = $02, FoxDBASEIII = $03, ..., tfFoxBASE_FB = $FB);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    THeader = packed record
      FileType: TFileType;
      LastUpdate = packed record
        Year: Byte;
        Month: Byte;
        Day: Byte;
      end;
      RecordCount: Cardinal; // Attention BigEndian ou LittleEndian
      DataSegmentStart:Word;
      DataRecordLength: Word;
      ... 
    end;
    je suis persuadé que l'on trouve ce format en Pascal
    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

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Merci Shaï

    Je reviens sur ce sujet un peu tardivement, désolé.
    Mais c'est plus un sujet perso que pour le boulot

    Je n'avais pas pensé à cette solution mais effectivement, ça marche bien.
    Pour l'instant je n'ai testé que sur les quelques premiers éléments mais aucune raison que ça ne puisse aller plus loin.
    Ça va donc se faire comme ça.

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

Discussions similaires

  1. Sélection texte d'un TMemo
    Par nmathon dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/05/2003, 16h17
  2. Taille des tabulations dans un TMemo ?
    Par dergen dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/01/2003, 19h38
  3. TMemo et TRichEdit
    Par Invité dans le forum C++Builder
    Réponses: 6
    Dernier message: 09/10/2002, 20h37
  4. Problèmes avec BlockRead
    Par LuluTchab dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2002, 21h36
  5. Retour chariot dans un TMemo ?
    Par Vincent PETIT dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/08/2002, 18h55

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