cs_christophedlr
Messages postés262Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention26 juillet 2022
-
26 juil. 2008 à 20:12
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDerniè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 ;)
cs_christophedlr
Messages postés262Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention26 juillet 20224 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;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 26 juil. 2008 à 21:32
Bonjour,
euh ouais il existe une touche, qui est située au dessus du shift droit, et en dessous de la touche Retour Arrière, qui permet de faire un saut de ligne, et ainsi aérer le message parce que là c'est pas facile à lire ...
Oui vous avez deviné c'est la touche Entrée !
Bon sinon, pour transferer des données d'un fichier jusqu'à un TMemoryStream, tu peux procéder ainsi :
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 26 juil. 2008 à 21:34
Re, ah ouais j'avais pas vu le TFileStream ...
Pourquoi ne pas charger directement depuis un fichier tout simplement ? Pourquoi se compliquer la vie avec un TFileStream ?
Enfin si ma méthode ne convient pas à tes besoins fais-le moi savoir, d'autres personnes détiennent sûrement la clé de la vérité (ooh me voila poète !). ouais bon, ... clé de la solution ... (vexé).
J'espère quand même t'avoir aidé :p
cs_christophedlr
Messages postés262Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention26 juillet 20224 26 juil. 2008 à 21:34
Pour la touche entrée, il semble que se soit un nl2br qui soit manquant sur le forum car dans la fenêtre de rédaction du message j'avais bien mes retours à la ligne.
Pour mon problème, en fait j'ai une certaine structure sur mon fichier, je dois lire la taille des données qui est enregistré et après le lit count octets renvoyé par la lecture de la taille.
Donc je ne peux pas faire directement un LoadFromFile d'où mon utilisation de TFileStream couplé avec TMemoryStream.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 26 juil. 2008 à 23:17
Juste une question : pourquoi tu concatènes le contenu de la MessageDlg ? :
MessageDlg('Vous ne pouvez pas appeler une fonction de lecture en demandant'+
' une écriture du projet', mtError, [mbok], 0);
end;
Je me rappelles que tu utilises une DLL, c'est pour un souci de taille de String que tu concatènes ? (256 caractères max pour PChar). Je voudrais bien comprendre ...
cs_christophedlr
Messages postés262Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention26 juillet 20224 26 juil. 2008 à 23:20
En fait je concatène car je préfère garder une taille de 80 caractères au maximum par ligne.
Du coup comme cela dépasse, je concatène afin de séparer sur plusieurs lignes.
La limite de 80 caractères maxi sur la ligne me permet de tous voir sans bouger l'ascenseur (et pourtant je suis en 1280x1024).
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 26 juil. 2008 à 23:43
Bonjour,
ah ok c'est pour une raison de confort !
je pensais qu'il s'agissait d'une limite technique de passage en paramètre dont j'aurais ignoré l'existence (comme le passage maximum de 256 caractères en SharedMem, donc PChar ou shortstring plutot que String).
Bon ben bonne fin de soirée :p