Placer des données d'un TFileStream dans un TMemoryStream

Résolu
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 26 juil. 2008 à 20:12
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 26 juil. 2008 à 23:43
Bonsoir,

Je voudrais dans mon programme, lire un fichier don les données que le lis sont transféré vers un TMemoryStream afin de pouvoir les placer ensuite dans un TRichEdit avec un LoadFromStream.

Voici le code de la fonction qui foire (C'est une DLL que j'ai créer pour mon programme) :

procedure TFormatFEF.LoadFromFile(var RichEdit: TRichEdit); export;
var
Size: Integer;
MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;

if (ReadFile = False) then
begin
MessageDlg('Vous ne pouvez pas appeler une fonction de lecture en demandant'+
' une écriture du projet', mtError, [mbok], 0);
Exit;
end;

FileStream.ReadBuffer(Size, 4); //Lit la taille
FileStream.ReadBuffer(MemoryStream, Size); //Lit le contenu pour le RichEdit
RichEdit.Lines.LoadFromStream(MemoryStream); //Inscrit dans le RichEdit
end;

Avec le debugueur, j'ai regardé MemoryStream, il reste à () donc à priori il a instancié sans problème (pas de réponse nil de sa part).
Mais quand il passe sur ma ligne :

RichEdit.Lines.LoadFromStream(MemoryStream);

Là il me renvoi une violation d'accès.
Ce que j'en conclut c'est qu'il n'arrive pas à lire les données du TMemoryStream.

Merci d'avance pour l'aide.

P.S. : Foxi et les autres, vous êtes contents ? J'utilse les streams pour la seconde version de mon projet FicEditor ;)

8 réponses

cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
26 juil. 2008 à 23:01
Problème résolu.

A la place du ReadBuffer j'utilise un CopyFrom et ça fonctionne.

Voici donc le nouveau code (qui lui est fonctionnel) :
procedure TFormatFEF.LoadFromFile(var RichEdit: TRichEdit);
var
Size: Integer;
MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;

if (ReadFile = False) then
begin
MessageDlg('Vous ne pouvez pas appeler une fonction de lecture en demandant'+
' une écriture du projet', mtError, [mbok], 0);
Exit;
end;

FileStream.ReadBuffer(Size, 4); //Lit la taille
MemoryStream.CopyFrom(FileStream, Size); //Copie les données dans le TMemoryStream
RichEdit.Lines.LoadFromStream(MemoryStream); //Inscrit dans le RichEdit
MemoryStream.Free;
end;

Merci quand même à ceux qui ont tenté de m'aider.
3
Rejoignez-nous